2015-03-19 2 views
0

У меня есть простая страница опроса, которую я пытался сделать. Все работало хорошо, за исключением случаев, когда я использовал одну цитату в своем комментарии на странице опроса. Когда у меня был комментарий с одной цитатой в нем, запрос БД не вставлялся в БД.реализация строки escape-последовательности MYSQL

После некоторого Googleing я предположил, что мне нужно было избежать строки, прежде чем вставлять ее в БД. Я использовал mysqli_real_escape_string, чтобы избежать строки до INSERTing в БД, но это, похоже, не помогло.

Вот мой код, который вставляет комментарии пользователя в БД ($ CON не показан для безопасности)

mysqli_real_escape_string($con,$_POST['question_1']); 
    mysqli_real_escape_string($con,$_POST['question_2']); 
    mysqli_real_escape_string($con,$_POST['question_3']); 
    mysqli_real_escape_string($con,$_POST['question_4']); 
    mysqli_real_escape_string($con,$_POST['question_5']); 

    mysqli_query($con, "INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) VALUES ('$_POST[question_1]', '$_POST[question_2]', '$_POST[question_3]', '$_POST[question_4]', '$_POST[question_5]')"); 

Опять же, это происходит только тогда, когда комментарий содержит апостроф. Какие-либо предложения? Не удалось ли я избежать строки?

+1

Назначить переменную к нему первым '$ q1 = mysqli_real_escape_string ($ против, $ _ POST [ 'question_1']);' затем сделать 'ЗНАЧЕНИЯ (' " $ q1." ') 'и т. д. из-за того, что вы делаете сейчас. VALUES (' $ _POST [question_1] ',' бессмысленно. Также вы можете использовать 'stripslashes()' или использовать [подготовленные заявления] (http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php) и делать с ним. Нет необходимости использовать дополнительные функции. –

+0

Я бы избегал 'stripslashes()' просто потому, что он, как правило, пропускает некоторые обстоятельства, в которых вещи не являются безопасными SQL. У меня никогда не было функции escaping, которая не позволяла безопасным SQL (не путать с безопасностью) строки – Machavity

+0

@Machavity Stripslashes позволяет записывать O'Malley в DB точно как показано, вместо О'Малли. –

ответ

1

Вы не поняли, что происходит здесь

mysqli_real_escape_string($con,$_POST['question_1']); 

Эта функция возвращает беглую строку. Затем вы используете эту строку в своем SQL

$question1 = mysqli_real_escape_string($con,$_POST['question_1']); 
//Do your other escapes here 
mysqli_query($con, "INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) 
    VALUES ('$question1', ...)"); 

Лучшее решение здесь - подготовленные заявления. Это не требует от вас ничего. Данные передаются отдельно и обрабатывают соответствующим образом

$prep = mysqli_prepare($con, 'INSERT INTO feedback (question_1, question_2, question_3, question_4, question_5) 
    VALUES (?, ?, ?, ?, ?)'); 
mysqli_stmt_bind_param($prep, "sssss", $_POST['question_1'], $_POST['question_2'], $_POST['question_3'], $_POST['question_4'], $_POST['question_5']); 
mysqli_stmt_execute($prep); 
+0

Мое предыдущее понимание mysqli_real_escape_string состояло в том, что он обновил бы переменную, которая была указана в качестве параметра. Спасибо, что исправили это. Теперь все работает правильно, но мне придется искать в mysqli_prepare, поскольку это похоже на гораздо лучший способ выполнить ту же задачу в меньшем количестве строк кода. – blazerunner44

Смежные вопросы