問題の核心は、列 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 " \ n \ n"; while($ row =mysql_fetch_array($ rs)){echo "PLACE "; echo "ADDRESS "; echo "PHONE "; echo "PRICE "; echo "RATING "; echo "\ n "; } echo " $ row [RestName] $row[アドレス] $row[電話] $row[価格] $row[評価]
\ n"; }}