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;
}
}
}