2011-10-24 52 views
0

匹配的产品名称为:$products_name我的sql命令有什么错误?

$查询= “选择p.products_id,pd.products_name,p.products_price 从”。 TABLE_PRODUCTS。 “p”。 TABLE_PRODUCTS_DESCRIPTION。 “pd 其中p.products_status = 1 和p.products_id = pd.products_id 和pd.language_id ='”。 (int)$ _ SESSION ['languages_id']。 “'
和p.products_id <>:p.products_id AND MATCH('products_name')AGAINST(:products_name IN NATURAL LANGUAGE MODE)”;

1,为什么使用" p, "没有" p "

我的IDE显示命令的警报。我不知道如何纠正它。

运行查询时,出现错误:

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 ':p.products_id AND MATCH('products_name') AGAINST (:products_name IN NATURAL LAN' at line 6

PS:

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 ':p.products_id AND MATCH(`products_name`) AGAINST (:products_name IN NATURA' at line 5 
in: 
[ SELECT p.products_id, pd.products_name, p.products_price FROM TABLE_PRODUCTS p INNER JOIN TABLE_PRODUCTS_DESCRIPTION pd ON (p.products_id = pd.products_id) WHERE p.products_status = 1 AND p.products_id <> :p.products_id AND MATCH(`products_name`) AGAINST (:products_name IN NATURAL LANGUAGE MODE)] 

我想说明下的产品相对项目。它根据的product name

+1

你会得到什么错误?你可以打印'$ query',这样我们可以看到里面有什么? – Konerak

+0

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第6行的':p.products_id AND MATCH('products_name')AGAINST(:products_name IN NATURAL LAN')附近使用正确的语法。 – runeveryday

+1

如何执行此查询? :p.products_id'被替换为一个值? – Konerak

回答

0

您发送的数据库最后的查询是一些地方匹配:

select p.products_id, pd.products_name, p.products_price from table1 p, table2 pd 
where p.products_status = 1 
and p.products_id = pd.products_id 
and pd.language_id = 'lang' 
and p.products_id <> :product_id AND MATCH('products_name') AGAINST (:products_name IN NATURAL LANGUAGE MODE); 

而且它是错误的。

最近似查询到MySQL的工作是:

select p.products_id, pd.product_name, p.products_price from table1 p, table2 pd 
where p.products_status = 1 and p.products_id = pd.products_id 
and pd.language_id = 'lang' and p.products_id <> pd.products_id 
AND MATCH(products_name) AGAINST ('product_name' IN NATURAL LANGUAGE MODE); 

但我不知道这是否是你想要的...

的“”是强制性分开的两个from子句中的表。

+0

我把你的代码放进去,不起作用 – runeveryday

+1

是你的代码,我没有改变任何东西......这只是数据库如何接收你的查询(显然,表名是我发明的),这是不可能的,我的代码可以工作...你想要什么样的查询获得准确的? – yoprogramo

+0

你不能在单独的引号中进行匹配 - 期待栏目 – galchen

0

MATCH()期待列。你不能把引号放在里面,因为它们被视为字符串。

使用`代替,或没有

MATCH(products_name) 
MATCH(`products_name`) 
1
SELECT p.products_id, pd.products_name, p.products_price 
FROM TABLE_PRODUCTS p 
INNER JOIN TABLE_PRODUCTS_DESCRIPTION pd ON (p.products_id = pd.products_id) 
WHERE p.products_status = 1 
    AND pd.language_id = :lang_id 
    AND p.products_id <> :p.products_id 
    AND MATCH(products_name) AGAINST (:products_name IN NATURAL LANGUAGE MODE) 
    --  ^^^^^^^^^^^^^ A   ^^^^^^^^^^^^^^ B 
    -- A = column, don't quote B = value, can be quoted. 

你必须在match部分语法错误。
列名不应引用单引号',但在反引号`
但是,这只是保留字等。

其他问题
您正在使用隐式连接语法。使用显式连接更好是一个好主意。

如果您使用的是PDO,请勿注入$ vars,但只需对所有内容使用PDO,它会更干净,执行速度更快,并且不会发生SQL注入错误。

根据您的问题:

1, why using " p, " not " p "

,语法是两个表,你transmogrify入内加入您的where子句中的隐式交叉连接:... AND p.products_id = pd.products_id ...
这是SQL '89语法,早就改进了很多更清晰的SQL '92语法。
更好地使用显式内部联接。

+0

我很抱歉,我把你的代码放入,它仍然显示一个错误。 – runeveryday

+0

约翰,我把错误放在我的问题中。谢谢 – runeveryday