Php 查询返回意外的结果

Php 查询返回意外的结果,php,sql,postgresql,operator-precedence,Php,Sql,Postgresql,Operator Precedence,我觉得这个搜索查询并不像我想象的那样有效。我想确定选择的项目是那些与$user相同的ksisoldby(尽管不区分大小写,因此ILIKE)项目。用和s和或s指定的其他字段是缩小选择范围的可能方法 "SELECT id, status, customer_id, shipping_address_id, order_number, reference, ship_via_id, order_date :: date, due_date :: date, created, sales_tax, f

我觉得这个搜索查询并不像我想象的那样有效。我想确定选择的项目是那些与
$user
相同的
ksisoldby
(尽管不区分大小写,因此
ILIKE
)项目。用
s和
s指定的其他字段是缩小选择范围的可能方法

"SELECT 
id,
status,
customer_id,
shipping_address_id,
order_number,
reference,
ship_via_id,
order_date :: date,
due_date :: date,
created,
sales_tax,
freight,
taxable,
nontaxable,
job_name,
order_description,
ship_to_name,
ship_to_address1,
ship_to_address2,
ship_to_city,
ship_to_state,
ship_to_zipcode,
name,
address1,
address2,
city,
state,
zipcode,
act_ship_date,
ksisoldby
FROM sales_orders 
WHERE ksisoldby ILIKE '".$user."'
AND (order_description ilike 
'%".implode("%' AND order_description like '%", $search)."%')
OR (order_number ilike 
'%".implode("%' AND order_number like '%", $search)."%')
OR (name ilike 
'%".implode("%' AND name like '%", $search)."%')
OR (reference ilike 
'%".implode("%' AND name like '%", $search)."%')
ORDER BY order_number DESC";
我这样做是否正确,是我的数据设置不正确,还是这些
和/或
语句覆盖了
WHERE
子句?谢谢你的帮助。

这里的关键字是
之前绑定

WHERE ksisoldby ILIKE '".$user."'
AND (
     order_description ilike '%".implode("%'
     AND order_description like '%", $search)."%')
  OR order_number ilike '%".implode("%'
     AND order_number like '%", $search)."%'
  OR name ilike '%".implode("%'
     AND name like '%", $search)."%'
  OR reference ilike '%".implode("%'
     AND name like '%", $search)."%'
    )
WHERE
子句中的所有项都计算为一个布尔结果。如果你

要确保选择的唯一项目是那些ksisoldby与$user相同[…]的项目吗

然后,您必须将
中的标准用括号括起来,否则它们将提供替代方法进行限定

另一方面,您可以像我演示的那样删除
ed对周围的括号

我添加了(语法上不相关的)空白和换行符以使其更清晰


顺便说一句——正如注释中提到的那样——如果您不希望表中的所有列,那么列出您想要的列(就像您拥有的一样)是最佳的方式


我也会考虑使用(或服务器端函数有参数),而不是将一个大查询字符串建立为<强>防止SQL注入< /强>。您的框架可能提供了一些实现这一点的方法。或者你可以手工做


在不断生成查询字符串的同时,请使用来清理用户输入。

首先,您可以通过编写select*而不是列出每一列来大幅缩短查询字符串。另外,你能解释一下kissoldby是什么类型的数据吗?看起来你有打字错误。您的查询内容为
ksisoldby
,您的问题是
kissoldby
@redelman431,但这并不是表中的全部内容。。如果选择我不需要的东西,性能不是会很慢吗
ksisoldby
标识用户,因此只显示他或她的记录的结果。@SomeKittens抱歉,两者都应该是
ksisoldby
。修正了。不确定它会有多大的不同,但您同时使用了
like
ilike
这两种方法,效果非常好。非常感谢。我读了一篇关于预处理语句的文章,想知道您是否可以花时间使用此查询制作一个简化的示例。。我明白这其实是另一个问题,但我很好奇。非常感谢你的帮助@托马斯:很高兴它起作用了!正如你所说,这是一个不同的问题。我建议你再打开一个。这对公众更有用。