一个sql命令为什么它显示错误?

时间:2011-10-31 07:17:35

标签: mysql sql

$categories_query ="SELECT p.products_id 
,  p.products_quantity
, p.products_price 
, p.products_status 
,p.products_image
, pd.products_name

FROM products_description AS pd
INNER JOIN products AS p
ON p.products_id = pd.products_id
WHERE  p.products_status = 1 and p.products_id <> $pid and pd.products_name LIKE CONCAT(LEFT('$products_name',10),'%')";

即使没有相关项目,某些页面也正常运行。但$products_nameA Bug's Life "Multi Pak" Special 2003 Collectors Edition时。它显示错误:

1064 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 's Life "Multi Pak" Special 2003 Collectors Edition',10),'%')' at line 11
in:
[SELECT p.products_id...

为什么呢?以及如何纠正它?

2 个答案:

答案 0 :(得分:2)

您需要在$ product name上使用mysql_real_escape_string()。 “'”是该错误的原因,mysql_real_escape_string()将解决这个问题。你应该总是在将所有变量发送到mysql之前过滤掉所有变量,否则你冒着通过恶意sql codel注入mysql的风险。 mysql_real_escape_string() on php.net

答案 1 :(得分:1)

$ products_name的示例值包含'符号,因此sql查询搞砸了。

目前,您的部分查询会是那样的

......(LEFT('Bug's Life“Multi Pak”特别2003年收藏家版“,10)......

请注意,'g和s之间'结束“第一个撇号,而且其余的$ products_name不是执行查询中的字符串值。

您应该使用预准备语句。您还应该针对当前代码的漏洞进行谷歌“sql注入攻击”。

编辑:您可以使用

我个人更喜欢PDO。有理由,请参阅mysqli or PDO - what are the pros and cons?