2016-12-07 34 views
0

我完全超出了我的深度,但可以使用一些幫助,因爲一些SQL代碼在我過去十年運行的PHPBB網站上已經崩潰。來自PHPBB的這個INSERT上的MySQL錯誤#1064

我有時可以張貼在黑板上,但其他時候我看到這條消息:

SQL錯誤:1064你在你的SQL語法錯誤;檢查對應於你的MySQL服務器版本的權利 語法附近使用 手動...

多數民衆贊成失敗的代碼是:

INSERT INTO phpbb_posts_text(POST_ID,post_subject,bbcode_uid, POST_TEXT)VALUES(28612,「測試」,「0e2d19fcc7」,「我一直有 一些問題,最近的站點。它是工作的其他人? 你看到奇怪的SQL調試消息?」)

而且從PHP代碼讀取:

$sql = ($mode != 'editpost') ? 
    "INSERT INTO " . POSTS_TEXT_TABLE . " 
    (post_id, post_subject, bbcode_uid, post_text) 
    VALUES ($post_id, '$post_subject', '$bbcode_uid', '$post_message')" 
    : "UPDATE " . POSTS_TEXT_TABLE . " SET post_text = '$post_message', bbcode_uid = 
    '$bbcode_uid', post_subject = '$post_subject' WHERE post_id = $post_id"; 

任何幫助表示讚賞!

+0

**警告**:這有一些嚴重的[SQL注入漏洞](http://bobby-tables.com/),因爲在查詢中使用了$ _GET數據。儘可能使用**準備好的陳述**。這些在['mysqli'](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和[PDO](http://php.net/manual/)中很簡單en/pdo.prepared-statements.php)其中任何用戶提供的數據都是用'?'或':name'指示符指定的,後者使用'bind_param'或'execute'填充,具體取決於您使用的是哪一個。 – tadman

回答

1

$post_message包含一個引號字符,它終止字符串。您需要轉義該值以防止像這樣的SQL注入錯誤。

但是,如果您切換到準備語句而不是直接將變量替換爲SQL查詢,那將是最好的。你需要爲此使用PDO或mysqli。

+0

啊。謝謝。過去十年來,我一直在運行此代碼,沒有任何問題。最近有沒有改變PHP會導致這種情況? 引號字符在哪裏?這是我的撇號嗎? 這不是我的代碼,所以我在嘗試修補時要小心。有什麼建議? – user2860741

+0

沒有什麼改變,你以前從來沒有收到過帶有撇號的信息,所以你很幸運。撇號和引用是相同的字符。 – Barmar