2010-04-19 135 views
2

我有如下表:如何在MySQL數據庫中存儲包含引號的字符串?

$sql = "CREATE TABLE received_queries 
    (
    sender_screen_name varchar(50), 
    text varchar(150) 
    )"; 

我用下面的SQL語句存儲在表

$sql = "INSERT INTO received_queries VALUES ('$sender_screen_name', '$text')"; 

現在我嘗試存儲以下字符串爲「文本」的值。

One more #haiku: Cotton wool in mind; feeling like a sleep won't cure; I need some coffee.

,我得到了以下錯誤消息:

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't cure; I need some coffee.')' at line 1

我想這一定是一個很常見的問題。我如何解決它?

回答

4

我會用準備好的語句(與庫MySQLi或PDO),而不是逃避建議。

2

您可以跳過單引號\'。請參閱manual

One more #haiku: Cotton wool in mind; feeling like a sleep won\'t cure; I need some coffee. 
+0

@Oded:還有其他可以產生類似問題的字符嗎? – Bruce 2010-04-19 07:22:01

+1

@Jack - 我添加了一個指向手冊的鏈接。 – Oded 2010-04-19 07:22:28

+0

顯然我看不到超鏈接:) – Bruce 2010-04-19 07:35:05

3

您可以使用mysql_real_escape_string

+0

編輯您的評論,使其更新。 – 2010-04-19 08:09:23

+0

@Col。彈片謝謝! – 2010-04-20 17:01:58

2

您不應該通過將字符串與用戶輸入連接來構建SQL。這會打開你的應用程序到SQL注入攻擊(想象一下當有人輸入'); delete from received_queries;$text時會發生什麼)。

因此,您應該始終使用數據庫框架(如用於PHP的DB),該框架允許您使用佔位符,然後使用值傳遞一個字符串。該框架將確保這些值不會造成任何傷害。

+0

@Aaron:非常感謝! – Bruce 2010-04-19 07:29:14

4

請注意,彙總這樣的SQL查詢會帶來潛在的安全風險。

更好的方法是使用準備好的語句。這基本上意味着將某些佔位符放入SQL,其中的實際值(例如您的$sender_screen_name$text)將會去。

我搜索了'net,想出了下面的代碼片斷,展示瞭如何在PHP中完成準備語句(對不起,如果這可能不是最好的PHP,我通常不用這種語言編程任何東西 - 但我想它可以作爲一個合理的起點):

$dbSelect = $objDb->prepare("INSERT INTO received_queries VALUES (:ssn, :text"); 

$dbSelect->bindParam('ssn', $sender_screen_name); 
$dbSelect->bindParam('text', $text); 

通過執行查詢的一個準備好的語句,你不必擔心逃避自己的字符串。 PHP和RDBMS將自動爲您處理。

+1

PHP和RDBMS不會自動處理轉義,因爲在這種情況下不使用轉義。 – 2010-04-19 08:12:27

相關問題