2009-08-29 3 views
0

У меня странная проблема с escape-строкой строки с моим PHP-скриптом. Я пытаюсь получить данные из iSnare и поместить их в таблицу MySQL.PHP & MySQL Input String Escape Problem

Я читаю данные POST и экранируя строки с помощью функции mysql_real_espace_string(), также могу вставлять те же данные в файл .txt без проблем, но когда я пытаюсь вставить данные в таблицу, она вырезает строку из апострофов (') (или другой символ иногда)

Если это помогает, мои таблицы и поля UTF8 и 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

Почему вы вызываете stripslashes() перед тем, как избежать строки? Хотя это не вызовет конкретного поведения, которое вы описали, оно приведет к сохранению неправильных значений (что-то, что появилось как «\», в конечном итоге будет храниться как '' 'вместо этого). (Если параметр страшной магической кавычки не включен, в этом случае вызов stripslashes() имеет смысл.) – VoteyDisciple

+0

«magic_quotes_gpc» включен в PHP, поэтому я делаю stripslashes() перед mysql_real_escape_string(), как рекомендовано в PHP руководство. (но также я думал то же самое и пробовал без stripslashes() тоже, тоже не работает) –

ответ

0

Я бы рекомендовал, используя htmlentities с флагом ENT_QUOTES как часть вашей собственной функции дезинфицирующим ,

function clean($string) { 
    $ret = str_replace('=','=',$string); 
    $ret = htmlentities($ret,ENT_QUOTES); 
    return $ret; 
    } 

Выше очень простая функция дезинфицирующее я использую для вывода контента в веб-браузере хранится в реляционной базе данных. Это, наверное, не идеально, но это хорошо работает для меня. (Обратите внимание, = необходимо заменить, чтобы предотвратить инъецированные запросы с целыми числами)