2015-03-24 98 views
1

所以我有PHP代碼這個塊mysqli的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; 更新評論SET'在第3行

但是,當我把sql查詢插入Sequel Pro(Mac),它工作得很好。我嘗試了很多其他職位的解決方案,但他們都沒有工作。我的語法有問題嗎,或者mysql版本有問題?非常感謝。

+0

避免使用MySQL變量,除非它是程序的一部分。 – thepratt 2015-03-24 22:04:59

回答

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 2015-03-24 22:04:24

+0

http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string如果可能的話,更喜歡參數化查詢 – exussum 2015-03-24 22:07:59