2012-05-11 182 views
0

目前,我正在做一個車,我有下面我的SQL查詢的麻煩:查詢語法不正確

$sql="SELECT * FROM component WHERE componentID IN ("; 

      foreach($_SESSION['cart'] as $id => $value) { 
       $sql.=$id.","; 
      } 

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

      $query=mysql_query($sql) or die(mysql_error()); 

所以我想與使用選擇我的數據庫項目,檢查項目SESSION和一個foreach。代碼循環遍歷SESSION並將componentID添加到SELECT中,然後將其輸入substr函數以刪除最後一個逗號(例如,刪除'001,002 * , *'。我確定語法是正確的,但是我不斷得到一個語法錯誤是:

您的SQL語法錯誤;檢查 對應於你的MySQL服務器版本正確的語法使用手動 附近「00004,00007)」在列1

任何人都可以看到我在這裏做錯了嗎?

+1

你能發佈完整的SQL你試圖執行? 'echo $ sql;' –

+0

這些值是否真的是'00004'而不是4?左手零可以成爲問題嗎? – ethrbunny

+3

['implode()'](http://www.php.net/implode)是您的朋友,可以將字符串與分隔符連接起來。 – ccKep

回答

2

我覺得這條線是你的問題:

你也可以簡化將用逗號分隔的集ID的作爲ccKep建議的過程:

$sql .= implode(",", $_SESSION['cart']) . ")"; 

完整的代碼如下所示:

$sql="SELECT * FROM component WHERE componentID IN ("; 
$sql .= implode(",", $_SESSION['cart']) . ")"; 

$query=mysql_query($sql) or die(mysql_error()); 

這將得到從$ _SESSION ['cart'] - 如果你真的想要數組的索引,因爲你首先編碼它,有這個選項:

$sql="SELECT * FROM component WHERE componentID IN ("; 
$sql .= implode(",", array_keys($_SESSION['cart'])) . ")"; 

$query=mysql_query($sql) or die(mysql_error()); 

array_keys()將提取數組的索引並忽略這些值。如果你想要的值,堅持我的第一個建議。

+0

這正是該行意圖做的事情......剪切了最後一個逗號,因爲它會導致錯誤。 **但是,如果購物車是空的,循環不會被執行,並且整個查詢將變爲假。** – ccKep

+0

再看一看 - 我已經包含了不需要您切斷任何代碼的代碼。 implode()適合將數組「粘合」在一起。如果這不能解決問題,請務必發佈由您的代碼創建的完整查詢字符串。 –

+0

非常感謝你的代碼工作,我一定會閱讀implode()。乾杯ccKep和超現實。 – Mike

0

試試這個:

$sql = "SELECT * FROM component WHERE componentID IN ("; 
    foreach($_SESSION['cart'] as $id => $value) { 
      $some_temp_array[] = $id; 
    } 
    $sql .= implode(',', $some_temp_array).")"; 
+0

我已經試過這個,但是語法仍然不正確,因爲它在第一個值之前附加逗號:「SELECT * FROM component WHERE componentID IN(,00004,00007)」 – Mike