2015-03-24 5 views
1

Так что я был этот кусок кода PHPMysqli UPDATE SET WHERE ошибка синтаксиса

if($_POST['action']=='newComment') 
{ 
    $mysqli = new mysqli("localhost", "root", "", "nested_comment"); 
    $new_post = $mysqli->real_escape_string($_POST['content']); 
    $result = $mysqli->query("SELECT @myLeft := lft FROM comment 
          WHERE lft = '1'; 
          UPDATE comment SET rgt = rgt + 2 WHERE rgt > @myLeft; 
          UPDATE comment SET lft = lft + 2 WHERE lft >= @myLeft; 
          INSERT INTO comment(content, lft, rgt) VALUES('$new_post', @myLeft, @myLeft + 1);"); 

    if($result) 
     echo "ok"; 
    else 
     echo $mysqli->error; 

} 

Когда я запускаю это, выдается ошибка:

У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «Комментарий UPDATE SET rgt = rgt + 2 WHERE rgt> @myLeft; UPDATE комментарий SET»в строке 3

Но когда я поставил запрос SQL в Sequel Pro (Mac), он работает хорошо. Я попробовал решение многих других сообщений, и никто из них не работает. Что-то не так с моим синтаксисом или что-то не так с версией mysql? Большое спасибо.

+0

Избегайте использования переменных MySQL, кроме его части процедуры. – thepratt

ответ

5

Это происходит потому, что вы пытаетесь выполнить несколько операторов в один присест

http://php.net/manual/en/mysqli.quickstart.multiple-statement.php

Mysqli имеет функцию для того

mysqli_multi_query()

Пожалуйста, обратите внимание, что любые найденные инъекции SQL теперь соединяться вместе. Будьте осторожны при использовании его

соображения безопасности

Функция API mysqli_query() и mysqli_real_query() не установлен флаг в соединения, необходимый для активации мульти запросов на сервере. Дополнительный вызов API используется для нескольких операторов, чтобы уменьшить вероятность случайных атак SQL-инъекций . Злоумышленник может попробовать добавить такие заявления, как; DROP DATABASE mysql или; SELECT SLEEP (999). Если злоумышленнику удается добавить SQL в строку оператора, но mysqli_multi_query не используется, сервер не будет выполнять второй, инъецированный и вредоносный SQL-запрос .

+0

Спасибо большое! Поэтому, если я использую real_escape_string для предотвращения инъекций, этого будет достаточно? – user3799934

+0

http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string предпочитает параметризованный запрос, если возможно – exussum

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