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

複数のチェックボックスに基づいてクエリを実行する

    問題の核心は、列 DetailNameを囲んでいるという事実にあるようです。 一重引用符で囲みます: "'DetailName' ='" "DetailName ='"だけでよい場合

    セキュリティ上の注意として、関数 mysql_escape_string() 入力を強制的にmysqlに対応させるために使用しているのは古く、セキュリティホールでいっぱいです。代わりに、はるかに安全な実装を使用することをお勧めします: mysql_real_escape_string() 。以下のコード例は、より新しく、より安全な関数を利用しています。

    ただし、これらの問題とは別に、少し異なるアプローチを取ることをお勧めします。これにより、読みやすく、長期的には管理しやすくなります。

    手始めに、すべてのチェックボックスで同じ名前を使用し、キーではなく値としてDetailNameを使用することをお勧めします:

         ビュッフェ      朝食          

    次に、キーではなく入力の値を使用して、句を生成できます。非常に効率的:

      //検出されたすべての値に対してmysql_real_escape_string()を実行します。$ clean_criteria =array_map('mysql_real_escape_string'、$ _REQUEST ['criteria']);//配列を文字列に変換します。$criteria =implode( " '、' "、$ clean_criteria);  

    最後に、クエリでは、 INを使用することをお勧めします ORではなく演算子 効率と読みやすさのための演算子:

      SELECT tblLocations.CityID、tblRestaurants.RestName、tblLocations.Street、tblLocations.Phone、tblLocations.Price、tblLocations.Rating、tblDetails.DetailNameFROM(tblRestaurants INNER JOIN tblLocations ON tblRestaurants.RestID =(tblLocDet INNER JOIN tblDetails ON tblLocDet.DetailID =tblDetails.DetailID)ON tblLocations.LocationID =tblLocDet.LocIDWHERE tblLocations.CityID ='16' AND tblDetails.DetailName IN($ criteria)ORDER BY tblRestaurants.RestName ASC  

    これが、私が提案する変更とロジックを組み合わせたPHP側全体です。

      <?phprequire "congig.php"; if(!empty($ _ POST ['criteria'])){// empty()は、値が設定されているかどうかを確認してから、値が空かどうかを確認します。 foreach($ _ POST ['criteria'] as $ key => $ value){//検出されたすべての値に対してmysql_real_escape_string()を実行します。 $ clean_criteria =array_map('mysql_real_escape_string'、$ _REQUEST ['criteria']); //配列を文字列に変換します。 $ criteria =implode( "'、'"、$ clean_criteria); } $ rs =mysql_query( "SELECT tblLocations.CityID、tblRestaurants.RestName、tblLocations.Street、tblLocations.Phone、tblLocations.Price、tblLocations.Rating、tblDetails.DetailName FROM(tblRestaurants INNER JOIN tblLocations ON tblRestaurants INNER JOIN(tblLocDet INNER JOIN tblDetails ON tblLocDet.DetailID =tblDetails.DetailID)ON tblLocations.LocationID =tblLocDet.LocID WHERE tblLocations.CityID ='16' AND tblDetails.DetailName IN($ criteria)ORDER BY tblRestaurants.RestName if(!$ rs){echo"クエリを解析できません"; } else if(mysql_num_rows($ rs)==0){echo"レコードが見つかりません"; } else {echo " \ n"; echo " \ n "; echo ""; echo ""; echo ""; echo ""; echo ""; echo " \ n  \ n"; while($ row =mysql_fetch_array($ rs)){echo " \ n "; } echo "
    PLACE ADDRESS PHONE PRICE RATING
    $ row [RestName] $row[アドレス] $row[電話] $row[価格] $row[評価]

    \ n"; }}



    1. TSQLのCOALESCE関数

    2. エラー:クライアントはサーバーから要求された認証プロトコルをサポートしていません。 MySQLクライアントのアップグレードを検討してください

    3. テーブルのID列の明示的な値は、列リストが使用され、IDENTITY_INSERTがONSQLServerの場合にのみ指定できます。

    4. すべての行のあるフィールドから別のフィールドにデータをコピーします