2014-03-06 40 views
2

我有一個查詢下面,我之前的mysql_query沒有和它正確執行。但使用PDO它顯示了一些錯誤PDO示值誤差

致命錯誤:未捕獲的異常「PDOException」有消息「SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的在線使用近「)」 1'

這是我的代碼的mysql_query正確的語法手冊:

$sql1 = "SELECT * FROM product WHERE id IN ("; 
        foreach($_SESSION['cart'] as $id => $value){ 
         $sql1 .= $id.','; 
        } 
       $sql1 = substr($sql1, 0, -1) .")"; 
       $query = mysql_query($sql1); 

使用PDO沒有準備發言..:

$sql1 = "SELECT * FROM product WHERE id IN ("; 
        foreach($_SESSION['cart'] as $id => $value){ 
         $sql1 .= $id.','; 
        } 

       $sql1 = substr($sql1, 0, -1) .")"; 

       $query = $db->query($sql1); 
+1

您應該使用準備好的查詢此添加未命名的佔位符。插入'?',綁定參數。 – Brad

+0

將'mysql_'改爲'PDO'並不能解決你直接向你的查詢中注入變量的事實,因爲它可能會失敗(並且**非常不安全!)。 – h2ooooooo

+0

我知道這一點很好...使用準備好的語句和綁定參數不會解決這個問題..我會在以後防止sql注入 – nick

回答

4

你錯過這裏 「添加」 字符串:

$sql1 = substr($sql1, 0, -1); 
$sql1 .= ")"; 
+0

它仍然顯示錯誤... – nick

+0

沒有。 '。='不是答案。你將「固定」查詢附加到不固定的查詢上,本質上是'SELECT ... SELECT ...' –

+0

沒有看到你試圖首先「剪切」$ sql1'。所以它應該像你一樣或者我在這裏展示的方式工作。 – djot

3

在PDO標籤(info)你會發現PDO Prepared語句和IN的正確過程。

PDO Tag

下面的代碼使用此方法從您的會話陣列

$in = str_repeat('?,', count($_SESSION['cart']) - 1) . '?'; 
$sql1 = "SELECT * FROM product WHERE id IN ($in)"; 
$params = $_SESSION['cart'] ; 
$stmt = $dbh->prepare($sql1); 
$stmt->execute($params); 

DEMO

+0

當鏈接足夠時,屏幕截圖有點笨重,但使用佔位符的示例很好。 – tadman

+1

很少有人知道此功能,正如本主題中提出的問題數量所示,可通過閱讀信息來解答。 –