SQL WHERE条件取决于表单输入

时间:2013-09-08 00:56:07

标签: php sql dynamic where-clause

我有一个表单,用户可以输入多个月,我的SQL查询返回这些月份的数据。

例如,如果用户输入January,则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 个答案:

答案 0 :(得分:1)

从提交的月数组中创建一个逗号分隔的字符串,并将其存储到变量$ months。例如:

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

导致......

'September','November','December'

然后您可以使用:

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

哦,是的..有人说“小心SQL注射,等等,等等” - 但这就是你的电话,不是因为我把你包裹在用户安全的茧中,让你感到温暖和舒适。

答案 1 :(得分:1)

我建议使用占位符。仍然。

什么?哇,哎呀!仍然不用担心SQL注入(是的!)并且可以用很好的小块来解决问题 - 构建动态SQL然后绑定相关值。

想象一下,我们从一组数据开始:

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

然后我们只需要动态创建带有占位符的相应模板,例如:

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

(这里我们唯一需要知道的是数组中有多少元素。这些元素可以使用一个简单的循环生成而不需要实际关注数组中的值!应该很容易解决: - )

然后绑定数组中的值 as shown in the (mysqli_stmt_bind) examples(例如使用call_user_func_array)。另请参阅Can I bind an array to an IN() condition?,其中提供了此用例的特定演练(请注意命名参数)。

答案 2 :(得分:0)

对于PL / SQL,您可以尝试IN子句。

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

我希望你能防范SQL Injection

答案 3 :(得分: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,我指出了这个reference