sql >> データベース >  >> RDS >> Mysql

PHP:複数の選択ドロップダウンリストを使用してmysqlデータベースを検索しますか?

    $clause = " OR ";//Change  to OR after 1st WHERE
    

    上記のOR演算子を使用すると、1つのキーワードがattrフィールドに一致する場合でも、where基準でレコードが選択されます。すべてのキーワードが適用されることを期待するには、これを「AND」に変更します。

    さらに、... AND ATTRIBUTES.sub_cat_name ='$ currentproduct' "基準はすべてのキーワードに適用されるようです。したがって、この基準は、ループのすべての反復ではなく、一度追加する必要があります。$ currentproduct =$ _POST ['product'];行もループの前に移動する必要があります。

    編集:演算子をANDに変更し、行が返されないことを反映します。

    ...ATTRIBUTES.attr LIKE BINARY '$c'...
    

    $ cにワイルドカードがない場合、上記の基準では、=演算子が使用されたかのように、単語がattrフィールドに一致する必要があります。これは発生する可能性が低いです。検索にはワイルドカードを含める必要があります:'%$ c%'

    さらに、SQLインジェクションからの保護も必要です。

    EDIT2:各属性が独自のレコードに保存されている場合、where基準はそれらのコレクションではなく単一のレコードに対して評価されるため、状況が少し複雑になります。

    サンプルのselectコマンドを紹介しますが、これをphpコードに組み込む必要があります。

    select product_details.* FROM product_details INNER JOIN
        (select product_details.id, count(ATTRIBUTES.id) as total
         FROM `product_details`
         INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id
         WHERE ATTRIBUTES.attr in (...)
         GROUP BY product_details.id
         HAVING total=...) as t
    on t.id=product_details.id
    

    サブクエリは、製品に一致した属性の数をカウントし、それらを削除します。このカウントは、フォームを介して送信されたパラメーターの数と等しくありません。外側のクエリは、カウントが一致した製品の詳細を取得します。

    in()句の...には、「'computer'、'apple'」のように、コンマで区切られたキーワードのリストを指定する必要があります。結果を取得するには、phpおよびsztring連結でimplode()関数を使用します。

    持っている句の...の代わりに、$ _ POST ['keyword']配列のキーワードの数を置き換えます(ただし、配列か単一の値かをコードで確認する必要があります)。

    それでも、SQLインジェクションがコードに与える影響を考慮する必要があります。




    1. 主キーにOracleのSYS_GUID()を使用するようにHibernateを構成します

    2. POINTを使用したMysqlの空間距離-機能しない

    3. MySQLへの基本的なPDO接続

    4. すべてのテーブルとフィールドをMYSQLのutf-8-bin照合に変更するスクリプト