Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP/MySQL正确过滤并选择框_Php_Mysql_Select - Fatal编程技术网

使用PHP/MySQL正确过滤并选择框

使用PHP/MySQL正确过滤并选择框,php,mysql,select,Php,Mysql,Select,我目前在MySQL中有一个包含多个字段的大表。我目前正试图允许用户通过选择框按每个字段进行筛选 我有4个领域:学校、部门和州 使用PHP,我对如何根据用户在选择框中选择的选项进行过滤没有问题 例如,如果提交了以下3项: <select id="school"> <option value="13">John Brown School</option> </select> <select id="division"> <opt

我目前在MySQL中有一个包含多个字段的大表。我目前正试图允许用户通过选择框按每个字段进行筛选

我有4个领域:学校、部门和州

使用PHP,我对如何根据用户在选择框中选择的选项进行过滤没有问题

例如,如果提交了以下3项:

<select id="school">
 <option value="13">John Brown School</option>
</select>

<select id="division">
 <option value="I">I</option>
</select>

<select id="state">
 <option value="NY">New York</option>
</select>

但是,如果我想有一个“All”选项(在选择框中),我将如何在查询或WHERE子句中实现它,以便它不会过滤该特定字段?

您只需创建一个您专门查找的选项即可。事实上,在这种情况下,最好的选择是让你的选择框有一个“全部”选项,或者干脆把它们留空。空白选项可以是默认值。我会将其设置为:

<option value="">-- All schools --</option>
 etc.

现在,如果用空白值选择任何选择选项(即使用ALL),它们将不是WHERE子句的一部分。


如果不同时转义传入的$\u POST数据,则会受到SQL注入攻击,因此需要做的一件事是在$\u POST值上运行,我将其添加到示例中。不过,听起来您已经意识到了这一点。

不考虑sql注入等,下面是一种方法的基本逻辑。Psudo代码或课程

<select id="select1">
    <option value="">All</option>
    <option value="value1">Value1</option>
    ...
</select>



$sql = "select ... from ... where 1 = 1 ";

if ( !empty($_POST["select_1"]) ) {
    $sql .=" and field1 = select1value";
}

if ( !empty($_POST["select_2"]) ) {
    $sql .=" and field2 = select2value";
}

if ( !empty($_POST["select_one"]) ) {
    $sql .=" and field3 = select3value";
}

// Etc.

全部的
价值1
...
$sql=“从……中选择……其中1=1”;
如果(!空($\u POST[“选择\u 1”])){
$sql.=“和字段1=select1value”;
}
如果(!空($\u POST[“选择\u 2”])){
$sql.=“和字段2=select2value”;
}
如果(!空($\u POST[“选择一个”])){
$sql.=“和字段3=select3value”;
}
//等等。
这样,在1=1的情况下,您就不必担心是否根据是否存在部分或全部“和”来追加/前置“和”。默认情况下选择“全部”(空白选择值),并根据每个选择的存在进行过滤


当然,您需要对其进行一些清理、保护、将值放入变量等,但这是基本逻辑。

我希望您使用准备好的语句来避免SQL注入。我是说,我只是保持了它的简洁性,以使“问题”尽可能简单。
$whereClauses = array();
if (! empty($_POST['school'])) $whereClauses[] = 'school='.mysql_real_escape_string($_POST['school']);
if (! empty($_POST['division'])) $whereClauses[] ='division='.mysql_real_escape_string($_POST['division']);
if (! empty($_POST['state'])) $whereClauses[] = 'state='.mysql_real_escape_string($_POST['state']);

$where = '';
if (count($whereClauses) > 0) {
    $where = 'WHERE '.implode(' AND ',$whereClauses);
}

$query = "SELECT * FROM table ".$where;
<select id="select1">
    <option value="">All</option>
    <option value="value1">Value1</option>
    ...
</select>



$sql = "select ... from ... where 1 = 1 ";

if ( !empty($_POST["select_1"]) ) {
    $sql .=" and field1 = select1value";
}

if ( !empty($_POST["select_2"]) ) {
    $sql .=" and field2 = select2value";
}

if ( !empty($_POST["select_one"]) ) {
    $sql .=" and field3 = select3value";
}

// Etc.