2

私は不動産スクリプトを開発しています。スクリプトには、ユーザーが価格範囲を指定できる検索オプションがあります。user_price_lowからuser_price_highになり、リストはデータベースからフェッチする必要があります。db_price_highおよびdb_price_low。

一致するものを見つけようとしてBETWEENステートメントを使用しました。

WHERE price_low BETWEEN '.$_REQUEST['minprice_buy'].' AND '.$_REQUEST['maxprice_buy']

でも驚いたことに...

ユーザーのuser_price_high=60およびuser_price_low=20であり、レコードのdb_price_low=30およびdb_price_high=120の場合

この場合、私のクエリは無効です。

私はMySqlQuery-日付範囲内の日付範囲を見ようとしましたが、それは私が望むものと一致しますか?

4

3 に答える 3

4

Chandan、$_*関数をクエリに直接入力することはありません。これはSQLインジェクションの穴です。

コードを次のように変更します。

$min_price = mysql_real_escape_string($_REQUEST['minprice_buy']);
$max_price = mysql_real_escape_string($_REQUEST['maxprice_buy']);
$query = "SELECT whatever 
          FROM whichever 
          WHERE price_low BETWEEN '$min_price' AND '$max_price' ";
// Dont forget these quotes       ^          ^     ^          ^
// Or mysql_real_escape_string() will not work!.

質問に関しては、クエリを次のように変更します。

WHERE '$min_price' BETWEEN price_low AND price_high 
  AND '$max_price' BETWEEN price_low AND price_high

次のことも検討してください。

WHERE ('$min_price' BETWEEN price_low AND price_high) 
  OR  ('$max_price' BETWEEN price_low AND price_high)

ここでは、常に両方が範囲内にある必要はありませんmin_pricemax_price

参照:「BobbyTables」XKCDコミックからのSQLインジェクションはどのように機能しますか?

于 2011-09-07T16:10:38.147 に答える
2

範囲に共通点があるかどうかを確認したい場合は、

WHERE greatest(price_low,user_price_low)<=least(price_high,user_price_high)

ユーザー範囲がすべての範囲内にあるかどうかを確認する場合は、
未定義動作を使用できます。user_preice_low>user_price_high

WHERE user_price_low>=price_low && user_price_high<=price_high
于 2011-09-07T16:14:46.413 に答える
-2

だから私が理解していることに応じて、それはすべきではありません

WHERE price_low >= '.$_REQUEST['minprice_buy'].' AND price_high <='.$_REQUEST['maxprice_buy']'

クエリで入力を使用する前に、を使用して入力を検証します。mysql_real_escape_string();クエリで$ _GET、$ _ REQUEST、$_POST変数を直接使用しないでください。

于 2011-09-07T16:11:05.730 に答える