2009-08-29 5 views
0

J'ai un étrange problème d'échappement de chaîne avec mon script PHP. J'essaie d'obtenir des données d'iSnare et de les mettre dans la table MySQL. Je lis les données POST et les chaînes d'échappement avec la fonction mysql_real_espace_string(), aussi je peux insérer les mêmes données dans le fichier .txt sans problème mais quand j'essaie d'insérer des données dans la table, il coupe la chaîne de apostrophes (') (ou un autre omble parfois)Chaîne d'entrée PHP & MySQL Escape Problème

Si cela aide, mes tables et les champs sont UTF8 et utf8_general_ci ..

include("database.php"); 

function security_sql($x){ 
    return mysql_real_escape_string(trim(stripslashes($x))); 
} 

$title = security_sql($_POST["article_title"]); 
$first_name = security_sql($_POST["article_author"]); 
$description = security_sql($_POST["article_summary"]); 
$category = security_sql($_POST["article_category"]); 
$article = security_sql($_POST["article_body_text"]); 
$article_html = security_sql($_POST["article_body_html"]); 
$resource_box = security_sql($_POST["article_bio_text"]); 
$resource_box_html = security_sql($_POST["article_bio_html"]); 
$keywords = security_sql($_POST["article_keywords"]); 
$email = security_sql($_POST["article_email"]); 


// Writes fine to text file 
$fp = fopen('test.txt', 'a'); 
fwrite($fp, $title."\n"); 
fwrite($fp, $article."\n\n\n\n"); 
fclose($fp); 



// BUT DOESNT WORK FINE WITH MYSQL 
mysql_query("INSERT INTO articles (first_name, email, title, description, article, article_html, category, resource_box, resource_box_html, keywords, distributor, distributor_host) values (
               '".$first_name."', 
               '".$email."', 
               '".$title."', 
               '".$description."', 
               '".$article."', 
               '".$article_html."', 
               '".$category."', 
               '".$resource_box."', 
               '".$resource_box_html."', 
               '".$keywords."', 
               'isnare', 
               '".$_SERVER['REMOTE_ADDR']."' 
               )") or die(mysql_error()); 
+0

Pourquoi appelez-vous stripslashes() avant d'échapper à la chaîne? Bien que cela ne provoque pas le comportement particulier que vous avez décrit, il finira par stocker des valeurs incorrectes (quelque chose qui est entré en tant que '\ '' finirait par être stocké en tant que '' '' à la place). (Sauf si le paramètre Magic Quotes redouté est activé, auquel cas l'appel de stripslashes() a du sens.) – VoteyDisciple

+0

"magic_quotes_gpc" est "On" en PHP, donc je fais striplashes() avant mysql_real_escape_string() comme recommandé en PHP Manuel. (mais aussi je pensais la même chose et essayé sans stripslashes() aussi, ne fonctionne pas non plus) –

Répondre

0

Je recommande en utilisant htmlentities avec le drapeau ENT_QUOTES comme une partie de votre propre fonction désinfectante . Ci-dessus est la fonction de désinfection très simple que j'utilise pour la sortie de contenu vers un navigateur Web stocké dans une base de données relationnelle. Ce n'est probablement pas parfait, mais ça fonctionne bien pour moi. (Note, = doit être remplacé pour éviter les requêtes injectées impliquant des entiers)