2017-04-07 11 views
0

機器データベースの検索ページを作成しようとしていて、機器のタグ(常に必須)を使用して6つの異なるデータフィールド'タグ'はユーザー入力と一致します。PHPでLIKEとINを組み合わせるMySQLの準備文

キーワードがINのいずれかの長いフィールドの場合は結果が見つからないため、多くの意図した結果がありません。

通常のSQLでは、テーブル結合にして、INクエリにLIKEクエリを追加します。 mysqliでは?というプレースホルダを持つ準備済みの文を使用していますが、各変数に対してこのマークを複数回使用することについて何ができるか分かりません。

私が持っている文はこれです:

if (!($stmt = $conn->prepare("SELECT * FROM equipment 
    WHERE EQUIP_CND LIKE ? 
    AND (EQUIP_TYP LIKE ? OR ((EQUIP_SER LIKE ? OR EQUIP_PNO LIKE ?) 
     OR (EQUIP_LOC LIKE ? OR EQUIP_CMT LIKE ?)));"))) { 
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error; 
} 

そして私はちょうどLIKE INLIKEを交換したいです。これを達成する方法は?

+0

これらのネストされたかっこはすべて必要ありません。ちょうど 'AND(x LIKE?OR LIKE?OR LIKE?...) ' – Barmar

+0

「キーワードがこれらの長いフィールドのいずれかにある場合」とはどういう意味ですか?それらはコンマで区切られたリストですか? – Barmar

+0

なぜあなたは準備された声明で 'JOIN'をすることができないと思いますか? – Barmar

答えて

0

likeには、一致が緩やかであるようにwildcardsが必要です。

そうbの記録が見られるが、abcはないでしょう

select * from table where a = 'b' 

select * from table where a like 'b' 

は同じです。 manualから

あなたがパターンには、以下の2つのワイルドカード文字を使用することができるなどと

マッチ任意の数の文字、0文字も。

_は、正確に1文字に一致します。

あなたが使用したいabc見つけること:プリペアドステートメントの場合

select * from table where a like '%b%' 

をワイルドカードは、変数に追加、または結合では、NOTクエリ自体でます。 PDOのマニュアルページの例6にこれが示されています。 http://php.net/manual/en/pdo.prepared-statements.php#example-991(コメントの後// placeholder must be used in the place of the whole value

関連する問題