2012-05-11 133 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