0

私はphpを初めて使用し、問題が発生しています。

結果を並べ替えるためのドロップダウンメニューが3つありますが、何も選択しない場合はデフォルトでSELECT * FROMレストランになり、ドロップダウンが1つだけ選択されている場合は、そのフィールドのみを考慮します。

<form id="form" name="vicinity" method="post" action="restaurant-list.php">
   <select class="form-banner" size="1" id="vicinity" name="vicinity">
      <option value=""> Select one </option>
      <option value="Back Bay">Back Bay</option>
      <option value="Beacon Hill">Beacon Hill</option>
      <option value="Chinatown">Chinatown</option>
   </select><br><br>
   <p class="font-2">Search by Cuisines</p>
   <select class="form-banner" size="1" id="cuisine" name="cuisine">
      <option value=""> Select one </option>
      <option value="American">American</option>
      <option value="Chinese">Chinese</option>
      <option value="Indian">Indian</option>
   </select><br><br>
   <p class="font-2">Search by Price</p>
   <select class="form-banner" size="1"  id="price" name="price">
      <option value=""> Select one </option>
      <option value="$">$ - Cheap</option>
      <option value="$$">$$ - Moderate</option>
      <option value="$$$">$$$ - Pricey</option>
   </select><br><br>
   <input type="submit" id="banner-search" value="Search"/>
</form>

レストランページ(現在、すべてのフィールドが選択されている場合にのみ機能します)を空白のままにすると、何も表示されません。

<?php
require ("db.php");
$vicinity = $_POST["vicinity"];
$cuisine = $_POST["cuisine"];
$price = $_POST["price"];

$query = "SELECT * FROM restaurant WHERE vicinity=\"$vicinity\" AND cuisine=\"$cuisine\" AND price=\"$price\"";
$result = mysql_query($query);
?>

助けやアイデアがあれば、どうすればこれを達成できますか。

4

2 に答える 2

1

PHPコードでこれを実行してください:(インジェクションを防ぐための1つのステップを示すように編集されています)

<?php
require ("db.php");
$vicinity = mysql_real_escape_string($_POST["vicinity"]);
$cuisine = mysql_real_escape_string($_POST["cuisine"]);
$price = mysql_real_escape_string($_POST["price"]);

$query = "SELECT * FROM restaurant WHERE 1=1 ";
if($vicinity) $query .= "AND vicinity=\"$vicinity\" ";
if($cuisine)  $query .= "AND cuisine=\"$cuisine\" ";
if($price)    $query .= "AND price=\"$price\"";
$result = mysql_query($query);
?>

whereの後に1=1を付けると、whereステートメントの前にANDが必要かどうかをテストする必要がなくなり、クエリ結果が変更されなくなります。

于 2012-07-26T21:19:00.160 に答える
0

SQLデータベースがLIKEステートメントをサポートしている場合は、このようなことを行う必要があります。

<?php
require ("db.php");
$vicinity = $_POST["vicinity"];
$cuisine = $_POST["cuisine"];
$price = $_POST["price"];

$query = "SELECT * FROM restaurant WHERE vicinity LIKE \"%$vicinity%\" AND cuisine LIKE \"%$cuisine%\" AND price LIKE \"%$price\%"";
$result = mysql_query($query);
?>

これを使用すると、 SQLインジェクションに対して脆弱になることに注意してください

これを防ぐには、入力にデータがあるかどうかを確認し、SQLフレームワーク(Zend_Dbなど)を使用して値が含まれているかどうか、または変数の値をエスケープしているかどうかに応じてクエリを作成する必要があります。

于 2012-07-26T21:17:31.560 に答える