Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 动态构造SQL搜索查询?_Php_Mysql_Sql_Arrays - Fatal编程技术网

Php 动态构造SQL搜索查询?

Php 动态构造SQL搜索查询?,php,mysql,sql,arrays,Php,Mysql,Sql,Arrays,我正在尝试根据用户的输入构建搜索查询,但是我在和以及WHERE关键字方面遇到了问题。代码如下: if (isset($_POST['submitBtn'])) { $gender = $_POST['gender']; $level = $_POST['level']; $status = $_POST['status']; $query = 'SELECT * FROM candidate '; $where = array(); $cri

我正在尝试根据用户的输入构建搜索查询,但是我在
以及
WHERE
关键字方面遇到了问题。代码如下:

if (isset($_POST['submitBtn'])) {

    $gender = $_POST['gender'];
    $level = $_POST['level'];
    $status = $_POST['status'];

    $query = 'SELECT * FROM candidate ';
    $where = array();

    $criteria = array('gender' => $gender, 'level' => $level, 'status' => $status);
    foreach ($criteria as $key => $value) {
        if ($value !== 'all') {
            $where[] = $key . ' = ' . $value;
        }
    }

}
输出如下所示:

Array
(
    [0] => gender = masculine
    [1] => level = low
    [2] => status = future
)
如果未选择任何选项,则默认为“全部”,并从
$where[]
中排除该选项

我需要实现这一点,或任何类似的目标:

Array
(
    [0] => WHERE gender = masculine
    [1] => AND level = low
    [2] => AND status = future
)
仅当选择了一个或多个选项时,才必须追加
,其中
;仅当选择了两个或多个选项时,才必须追加


在我使用的代码中,我有9个搜索输入。为了清楚起见,我在代码片段中只显示了三个。您能帮我解决这个问题吗?

试试这个:我想您需要字符串中的where子句,而不是数组中的where子句,在这里您可以从两个子句中选择一个,然后删除另一个

<?php 
$where=array();$flag=0;// use flag to identify the where/and
 $whereClause="";
 $criteria = array('gender' => "masculine", 'level' => "low", 'status' => "future");
    foreach ($criteria as $key => $value) {
        if ($value !== 'all') {
            if($flag == 0){
             $where[] = " WHERE " .$key . ' = ' . $value;//if you need array
             $whereClause='WHERE '.$key . ' = "' . $value.'"';//if you need string
            }else{
             $where[] = " AND " .$key . ' = ' . $value;
             $whereClause .=' AND '.$key . ' = "' . $value.'"';
            }
             $flag++;
        }
    }
    echo "<pre>";
    print_r($where);
    echo "</pre>";

   echo $whereClause;
?>

您需要放置一个递增器(
$inc
),然后将条件设置为:

if (isset($_POST['submitBtn'])) {

    $gender = $_POST['gender'];
    $level = $_POST['level'];
    $status = $_POST['status'];

    $query = 'SELECT * FROM candidate ';
    $where = array("Where 1=1");

    $criteria = array('gender' => $gender, 'level' => $level, 'status' => $status);
    foreach ($criteria as $key => $value) {
        if ($value !== 'all') {
            $where[] = 'AND '.$key . ' = ' . $value.' ';
        }
    }

}
在我看来,还有一种更干净的方法可以做到这一点:

 $query = 'SELECT * FROM candidate ';
 $where='';
 $criteria = array('gender' => $gender, 'level' => $level, 'status' => $status);
 foreach ($criteria as $key => $value) {
    if ($value !== 'all') {
        if($where=='')
            $where='WHERE '.$key . ' = ' . $value;
        else
            $where.=' AND '.$key . ' = ' . $value;

    }
}
$query.=$where; //final query
您可以这样做:

<?
    if (isset($_POST['submitBtn'])) {

        $gender = $_POST['gender'];
        $level = $_POST['level'];
        $status = $_POST['status'];

        $query = 'SELECT * FROM candidate ';
        $where = array();

        $criteria = array('gender' => $gender, 'level' => $level, 'status' => $status);
        foreach ($criteria as $key => $value)
        {
            if ($value !== 'all')
            {
                switch ($key)
                {
                    case 1:
                    {
                        $query = " WHERE " .$key . ' = ' . $value;
                        break;
                    }

                    case 2:
                    {
                        $query = " AND " .$key . ' = ' . $value;
                        break;
                    }

                    case 3:
                    {
                        $query = " AND " .$key . ' = ' . $value;
                        break;
                    }

                }
                $where[] = $query;
            }
        }

    }

您也可以使用简单的switch语句


谢谢。如果我按照你之前的答案加上这个:
$query.=内爆(“,$where)”,是否有效?内爆比字符串串联好,但在您的情况下,这两种方法都不会有太大的区别。
<?
    if (isset($_POST['submitBtn'])) {

        $gender = $_POST['gender'];
        $level = $_POST['level'];
        $status = $_POST['status'];

        $query = 'SELECT * FROM candidate ';
        $where = array();

        $criteria = array('gender' => $gender, 'level' => $level, 'status' => $status);
        foreach ($criteria as $key => $value)
        {
            if ($value !== 'all')
            {
                switch ($key)
                {
                    case 1:
                    {
                        $query = " WHERE " .$key . ' = ' . $value;
                        break;
                    }

                    case 2:
                    {
                        $query = " AND " .$key . ' = ' . $value;
                        break;
                    }

                    case 3:
                    {
                        $query = " AND " .$key . ' = ' . $value;
                        break;
                    }

                }
                $where[] = $query;
            }
        }

    }