1

この検索クエリは、思ったほど機能していないように感じます。ksisoldby選択された項目のみが、 と同じ (大文字と小文字は区別されないためILIKE)のものであることを確認したいと思います$userANDまた、 s およびsで指定された他のフィールドは、ORこの選択を絞り込むための可能な方法です。

"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";

私はこれを正しく行いましたか、正しく設定されていないのは私のデータですか、それともこれらのANDおよび/またはステートメントが句ORを上書きしていますか? WHERE助けてくれてありがとう。

4

1 に答える 1

3

ここでのキーワードはoperator precedenceです。ANDの前にバインドしORます。

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句内のすべての項目が評価され、1 つのブール値が返されます。もし、あんたが

選択されたアイテムのみが ksisoldby が $user と同一 [...] のものであることを確認したい

次に、OR'ed基準を括弧で囲む必要があります。そうしないと、修飾する別の方法が提供されます。

一方、AND私が示すように、'ed ペアを囲む括弧を削除できます。

わかりやすくするために、(構文的に無関係な) 空白と改行を追加しました。


ところで-これはコメントで出てきたように-テーブルのすべての列が必要ない場合は、必要な列をリストする(持っているように)のが最適な方法です。


また、SQL インジェクションを防ぐために 1 つの大きなクエリ文字列を作成する代わりに、準備済みステートメント(またはパラメーターを含むサーバー側関数)を使用することも検討します。あなたのフレームワークはおそらくこれを行うための何らかの方法を提供しています。または、手動で行うこともできます。

クエリ文字列を作成し続ける間、quote_literal()ユーザー入力をサニタイズするために使用します。

于 2012-07-15T15:33:02.727 に答える