2015-04-18 10 views
1

Я возился со своей страницей поиска. Я добавил оба mysqli_real_escape_string и strip_tags, и насколько я могу сказать, все работает нормально и должно быть в безопасности.Ввод одинарных кавычек в поле поиска приводит к ошибке mysqli_num_rows

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

Это дает мне «mysqli_num_rows() ожидает, что параметр 1 будет mysqli_result, boolean given« error. Существует много информации об этой ошибке, и я знаю, как ее решить (по крайней мере, я думал). Однако, в данном случае я не имею ни малейшего понятия:/

Код:

ini_set('display_errors', 1); 
$search = $_GET ['q']; 
$conn = mysqli_connect("localhost", "root", "","release"); 
$search = mysqli_real_escape_string($conn, "$search"); 
$search = stripslashes(strip_tags(trim("$search"))); 

$query = mysqli_query($conn,"SELECT * FROM game WHERE game_name LIKE '%". $search ."%' ORDER BY game_release"); 
$count = mysqli_num_rows($query); 
+1

Вам необходимо использовать механизм привязки параметров. показано здесь: http://stackoverflow.com/questions/15748254/how-to-run-the-bind-param-statement-in-php –

+0

@KanchoIliev Вы должны, но у вас нет к. – jeroen

+0

Да, вы правы, извините. –

ответ

1

Вы должны использовать mysqli_real_escape_string в самом конце, прямо перед тем, как вводить переменную в запросе базы данных, хотя подготовленные заявления являются предпочтительными , И мне легче, чем я.

Ваша текущая проблема не то, что вы не можете сделать это только с mysqli_real_escape_string, но сочетание и порядок функций, которые вы используете:

$search = mysqli_real_escape_string($conn, "$search"); 
$search = stripslashes(strip_tags(trim("$search"))); 

Вы спасаясь специальные символы для значений MySQL в первой строке. Это делается добавлением косых черт.

И во второй строке вы удаляете косые черты, отменяя свое экранирование с помощью mysqli_real_escape_string и делая ваш запрос уязвимым для SQL-инъекции.

Что касается безопасности для оператора SQL обеспокоен, mysqli_real_escape_string достаточно, так что для этого вам нужно будет только подготовленное заявление или:

$search = mysqli_real_escape_string($conn, $search); 

остальное не является необходимым, но если вы хотите, чтобы сделать это в любом случае (если, например, теги не разрешены), вы должны перенести эту линию на верхнюю линию вывода:

$search = stripslashes(strip_tags(trim($search))); 
$search = mysqli_real_escape_string($conn, $search); 

// and now run your query without further manipulation: 
$query = mysqli_query(...); 
+1

Благодарим вас за четкое объяснение Jeroen. Получение построенных ответов, таких как этот, действительно очень помогает мне! – Michael

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

  • Нет связанных вопросов^_^