0

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

例如,如果用户输入一月,SQL 应该是:

SELECT * FROM table WHERE month = 'January'

如果用户输入 March、August、October,则 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 call_user_func_array)。另请参阅我可以将数组绑定到 IN() 条件吗?它为此用例提供了特定的演练(注意命名参数)。

于 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 回答