0

ユーザーが複数の月を入力できるフォームがあり、SQL クエリはそれらの月のデータを返します。

たとえば、ユーザーが 1 月と入力した場合、SQL は次のようになります。

SELECT * FROM table WHERE month = 'January'

ユーザーが 3 月、8 月、10 月と入力した場合、SQL は次のようになります。

SELECT * FROM table WHERE (month = 'March' OR month = 'August' OR month = 'October')

ユーザーは必要な月数を入力できるため、WHERE 条件をこのように動的にするにはどうすればよいでしょうか? アドホック クエリのようなものです。ありがとう!

4

4 に答える 4

2

送信された月の配列からカンマ区切りの文字列を作成し、変数 $months に格納します。例えば:

$form_months = array('September','November','December');
$months = join(',', $form_months);

その結果...

'September','November','December'

その後、次を使用できます。

$sql = "SELECT * FROM table WHERE month IN (" . $months . ")";

そうそう..誰かが「SQL インジェクションに気をつけて、何とか何とか」と言った - しかし、それはあなたが求めているものであり、私があなたを暖かく居心地の良いユーザーセーフな繭に包むためではありません。

于 2013-09-08T01:00:17.567 に答える
1

プレースホルダーの使用をお勧めします。まだ。

何?おっと、そうですね!それでも SQL インジェクションの心配はありません (イェーイ!)。動的 SQL を構築し、関連する値をバインドすることで、問題に少しずつ取り組むことができます。

データの配列から始めると想像してください。

$stuff = array("January", "February");

次に、プレースホルダーを動的に使用して適切なテンプレートを作成する必要があります。たとえば、次のようにします。

.. WHERE (month = ? OR month = ?)
.. WHERE month IN (?, ?)           -- or

(ここで必要だったのは、配列内の要素数を知ることだけでした。これらは、配列内の値を実際に気にすることなく、単純なループを使用して生成できます!簡単に解決できるはずです:-)

次に、(mysqli_stmt_bind) の例(例: use ) に示すように、配列から値をバインドします配列を IN() 条件にバインドできますか?も参照してください。これは、このユース ケースに固有のウォークスルーを提供します (名前付きパラメーターに注意してください)。call_user_func_array

于 2013-09-08T01:07:53.333 に答える
0

PL/SQL の場合は、IN句を試すことができます。

SELECT * FROM table WHERE month IN (/*list of months from user input*/);

SQL インジェクションから保護されていることを願っています。

于 2013-09-08T00:59:34.220 に答える
0

$_POSTまたはを介して配列として月を渡す必要がある場合があります$_GET

たとえば、これが html フォームの月の一部であり、POST 経由で送信するとします。

<input type="checkbox" name="month[]" value="January">January<br>
<input type="checkbox" name="month[]" value="February">February<br>
[...]

あなたのphpプロセッサにはこれがあります

$moth = isset($_POST['month']) ? $_POST['month'] : NULL;//get the array

if(!empty($month)){
 foreach ($month as $month_val) {
    $months_val[] = "'" . mysqli_real_escape_string($dbcon,$month_val). "'";
    //using mysqli
  //$dbcon is the conection parameter
 }
  $months_val_insert = implode(',', $months_val);    


  $month_values = $months_val_insert;


$query = "SELECT * FROM table WHERE month IN ($month_values )";
 }

これがアイデアです

この参照で私を指摘してくれた @ user2246674 に感謝します

于 2013-09-08T01:09:08.897 に答える