0

所以我在表单中使用了多个复选框并毫无问题地查询数据库。现在我想添加一个下拉列表并将其与带有复选框的查询结合起来。当我运行这个时,我得到一个

    Warning: Invalid argument supplied for foreach() 

这是我的表格

     <form name="search_form" method="post" action="event_list">
     <table>
     <tr>
     <td>Venue</td>
     <td><input type="checkbox" name="check_list[]" value="AAC"><label >AAC</label><br />
     <input type="checkbox" name="check_list[]" action="" value="AKC" id="check_list[]"/><label >AKC</label><br />
     <input type="checkbox" name="check_list[]" action="" value="ASCA"/><label >ASCA</label><br />
     <input type="checkbox" name="check_list[]" action="" value="CKE"/><label >CKE</label><br />
     <input type="checkbox" name="check_list[]" action="" value="CPE"/><label >CPE</label><br />
     <input type="checkbox" name="check_list[]" action="" value="DOCNA"/><label >DOCNA</label><br />
     <input type="checkbox" name="check_list[]" value="NADAC"><label >NADAC</label><br />
     <input type="checkbox" name="check_list[]" action="" value="TDAA"/><label >TDAA</label><br />
     <input type="checkbox" name="check_list[]" action="" value="UKC"/><label >UKC</label><br />
     <input type="checkbox" name="check_list[]" action="" value="UKI"/><label >UKI</label><br />
     <input type="checkbox" name="check_list[]" action="" value="USDAA"/><label >USDAA</label><br />
     </td>
     </tr>
     <tr>
     <td style="text-align: left;">State:</td>
     <td style="text-align: left;">
     <select name="state" id="state" onChange="setCities();">
     <option name="drop_down[]" value="Alabama">Alabama</option>
     <option name="drop_down[]" value="Texas">Texas</option>
     </select>
     </td>
     </tr>
     <td align="right"><input type="submit" name="submit" value="Submit"></td>
     </tr>
     </table>
     </form>

这是我的PHP

     <?php 
     $options = Array();
     $options2 = Array();
     foreach ($_POST['check_list'] as $check)
     $options[] = 'venue=' . "'$check'"; 

     foreach ($_POST['drop_down'] as $drop)
     $options2[] = 'state=' . "'$drop'";

     $sql = "SELECT * FROM venue_event_all";
     if (count($options))
     $sql .= " WHERE " . implode(' OR ', $options);
     if (count($options2))
     $sql .= " AND " . implode(' OR ', $options2);

    $result=mysql_query($sql) or die(mysql_error());

    ?>
4

3 回答 3

0

<select>输入中, 的值<option>与选择的名称配对发送到 POST/GET。

name在自身上设置 aoption不会做任何事情。下拉值仍将与选择的名称一起使用。

您可以使用它来检查它

echo $_POST['state'];

因此,使用此值设置到您的查询中。

编辑:强制 - 请不要使用 MySQL,因为它已被弃用并且不再由 PHP 维护。使用 MySQLi 或 PDO。此外,请在查询中使用之前清理您的输入。当你不这样做时,就会发生这种情况。

于 2013-02-18T15:27:40.240 回答
0

如果数组为空或未设置,foreach 将显示错误,因此您需要先检查它:

if(isset($_POST[0]) and count($_POST) > 0)
{
 foreach...
}
于 2013-02-18T15:27:48.890 回答
0

我不会只对sql注入进行咆哮,而是给你一个解决方案。使用合理数量的代码使查询安全
的唯一方法是safeMysql库(基于 Jeffrey 代码,未经测试,但可在生产中自由使用):

<?php 
include 'safemysql.class.php';
$db = new SafeMysql();
$options = array();

if (!empty($_POST['check_list'])) {
    $options[] = $db->parse('venue IN (?a)', $_POST['check_list']);
}
if (!empty($_POST['drop_down'])) {
    $options[] = $db->parse('state IN (?a)', $_POST['drop_down']);
}
$sql = "SELECT * FROM venue_event_all";
if ($options) {
    $sql .= " WHERE " . implode(' AND ', $options);
}
$data = $db->getAll($sql);
于 2013-02-18T15:40:09.627 回答