【问题标题】:Search MySQL Database with Multiple Fields in a Form在一个表单中使用多个字段搜索 MySQL 数据库
【发布时间】:2012-03-08 05:42:51
【问题描述】:

我创建了一个表单,用户可以在其中搜索数据库,结果取决于用户填写表单的方式。
例如,假设我有 name、address、city、state 和 zip 字段,并且用户填写 name 和 city 字段,结果反映了输入。当表单提交时,所有记录都会显示出来。 为此,我写了这个:

if(isset($_POST['submit'])) {
        $sql = mysql_query("SELECT * FROM table WHERE name LIKE '%" . $_POST['name'] . "%'
                   OR address LIKE '%" . $_POST['address'] . "%'
                   OR city LIKE '%" . $_POST['city'] . "%'
                   OR state LIKE '%" . $_POST['state'] . "%'
                   OR zip LIKE '%" . $_POST['zip'] . "%'");
    }


        <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
            <tr>
                <td>Name:</td>
                <td><input type="text" name="name" /></td>
            </tr>
            <tr>
                <td>Address:</td>
                <td><input type="text" name="address" /></td>
            </tr>
            <tr>
                <td>City:</td>
                <td><input type="text" name="city" /></td>
            </tr>
            <tr>
                <td>State:</td>
                <td><input type="text" name="state" /></td>
            </tr>
            <tr>
                <td>Zip:</td>
                <td><input type="text" name="zip" /></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input type="submit" name="submit" value="Search" /></td>
            </tr>
        </form>
    </table>

    <?php
        if(isset($_POST['submit'])) {
            while($row = mysql_fetch_array($sql)) {
                echo $row['name'] . "<br />";
            }
        }   
    ?>

但在这种情况下,用户可以将字段留空。

【问题讨论】:

标签: php


【解决方案1】:

试试这个:

if(isset($_POST['submit'])) {
    // define the list of fields
    $fields = array('name', 'address', 'city', 'state', 'zip');
    $conditions = array();

    // loop through the defined fields
    foreach($fields as $field){
        // if the field is set and not empty
        if(isset($_POST[$field]) && $_POST[$field] != '') {
            // create a new condition while escaping the value inputed by the user (SQL Injection)
            $conditions[] = "`$field` LIKE '%" . mysql_real_escape_string($_POST[$field]) . "%'";
        }
    }

    // builds the query
    $query = "SELECT * FROM TABLE ";
    // if there are conditions defined
    if(count($conditions) > 0) {
        // append the conditions
        $query .= "WHERE " . implode (' AND ', $conditions); // you can change to 'OR', but I suggest to apply the filters cumulative
    }

    $result = mysql_query($query);

【讨论】:

  • 这里的编码对恶意用户不安全。请阅读stackoverflow.com/questions/60174/…
  • 我看到这个答案被标记为最佳和升级,但 $_POST['field'] 不应该是第 9 行的 $_POST[$field] 吗?我不想编辑,因为我不是一个足够熟练的 php-er 来确定,或者知道为什么它是这样写的。它现在对我有用,我改变了它,但是我打开了一个安全漏洞(帖子输入已经过清理)。
  • @digitaltoast 你是对的。谢谢你的纠正。我更新了答案
  • Stelian - 我遇到了这个答案,我试图自己尽力修改它,但我遇到了一些麻烦。你介意扫一眼吗? stackoverflow.com/questions/33917688/php-multiple-input-search 当我运行它时,它会给我数据库中的所有结果,而不是特定的几个
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
相关资源
最近更新 更多