Убрать всех нежелательных персонажей

Я использую следующий код для удаления нежелательных символов, но он не удаляет все и выдает ошибку MySQL:

    $commentmessage = strip_tags($commentmessage);
$commentmessage = htmlentities($commentmessage, ENT_QUOTES);

Какой код я бы использовал, чтобы удалить все, что может вызвать ошибку MySQL?

Я получаю сообщение:

Сообщение об ошибке: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с ‘omg thats one’. Один из логотипов, который нам действительно понравился, был 1049859, где f ‘в строке 2 **

0

Решение

Очевидно, вы строите свой запрос так:

$query = "INSERT INTO foo VALUES ('$bar')";

который ломает, потому что текст $bar содержит одинарные кавычки. '

Нет. * бьет тебя свернутой газетой * Плохой разработчик

я мог просто скинуть вам функцию экранирования строки, или я мог бы показать вам, как это сделать правильно, например:

$bar = "I am a problematic string!'; DROP TABLE USERS -- "$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
$stmt->execute(array($bar));

Или же:

$bar = "I am a problematic string!'; DROP TABLE USERS -- "$query = "INSERT INTO foo VALUES (:bar)";
$stmt = $dbh->prepare($query);
$stmt->execute(array('bar'=>$bar));

Когда вы готовите такой запрос, как PHP / PDO / MySQL, соберитесь и заранее договоритесь о типах заполнителей. Таким образом, ваши строки обрабатываются как строки без необходимости экранирования символов. Это предотвращает нарушение вашего запроса мошенническими одинарными кавычками и помогает защитить вас от атак с использованием SQL-инъекций.

Вы также можете повторно использовать подготовленные операторы для повышения производительности: [относительно неподготовленных операторов, так как SQL нужно анализировать только один раз, а не один раз для запроса]

$query = "INSERT INTO foo VALUES (?)";
$stmt = $dbh->prepare($query);
foreach( $bars as $bar ) {
$stmt->execute(array($bar));
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]