2012-03-12 108 views
4

我在使用PDO訪問我的數據庫的php腳本中遇到問題。當我在PDO中使用prepare()或​​時,似乎無法使PDO逃離我的字符串。我已經看遍了,我還沒有找到這個問題的答案,因爲無論我看到它說PDO自動逃脫字符串。 這裏是我的代碼:PDO不轉義字符串引號

$statement = $db->prepare("INSERT INTO Table (ID, Column1, Column2) VALUES (NULL, '$var1', '$var2')"); 
$query->execute(); 

讓我們承認$var1 = "abc'def"$var2 = "123"的問題是,我得到一個錯誤消息,因爲報價沒有逃脫。

錯誤:SQLSTATE [42000]:語法錯誤或訪問衝突:1064您 在您的SQL語法錯誤;檢查對應於 你的MySQL服務器版本正確的語法使用近「高清」的手冊, 第1行

我使用query()方法,但用同樣的prpblem還試圖「123」)」報價。 我真的不明白,這很令人沮喪。謝謝你的幫助。

+0

查看[例子](http://ca.php.net/pdo.prepare)。 – netcoder 2012-03-12 20:36:53

回答

13

試試這個:

# Took out ID, as it should be auto_increment and handled by database 
$statement = $db->prepare("INSERT INTO Table (Column1, Column2) VALUES (:col1, :col2)"); 

$statement->bindValue(':col1', $var1, PDO::PARAM_STR); 
$statement->bindValue(':col2', $var2, PDO::PARAM_INT); 

$statement->execute(); 
+0

工作奇蹟!非常感謝 !! – califrench 2012-03-12 20:42:12

+0

沒問題。爲了將來的參考,閱讀PHP文檔,95%的時間裏有很好的例子,從中收集如何正確實現API調用。儘可能接受。 – 2012-03-12 20:46:07

+0

相信我,我做到了。謝謝。 – califrench 2012-03-12 20:46:57

2

請看看在bindParam()的PDO庫的方法。

這使得您的查詢是這樣的:

$statement = $db->prepare("INSERT INTO Table (ID, Column1, Column2) VALUES (NULL, ?, ?)"); 
$statement->bindParam(1, $var1, PDO::PARAM_STR); 
$statement->bindParam(2, $var2, PDO::PARAM_INT); 

$query->execute(); 

//我真的應該載入新的答案:)當酒吧說,有。

+0

正如Mike Purcell所建議的那樣,我用一個名爲'bindValue()'的類似方法完成了它。我更喜歡鍵而不是字符串中對象的索引。 – califrench 2012-03-12 21:07:52

+1

這種方法的工作原理是一樣的,唯一的缺點是如果你有一個含有大量參數的查詢,它會變得混亂。 – 2012-03-13 21:20:24

0

爲此目的有一個功能。看看www.php.net/addslashes

+3

爲什麼要在PDO擴展內置函數時使用addslashes? – stUrb 2012-03-12 20:41:21

+0

你可能不應該。不知道PDO有能力解決這個問題。 – 2012-03-12 21:05:37