Php 如何构建适合所有用户的动态mysql查询

Php 如何构建适合所有用户的动态mysql查询,php,mysql,dynamic,Php,Mysql,Dynamic,我需要你对我的网站搜索功能的帮助。我正在开发一个会员区,用户可以根据特定标准或标准组合搜索其他注册用户 我现在的问题是如何构建一个动态mysql查询,以满足搜索条件的每个组合的需要,其中条件的数量是可变的 通常,我可以使用一组预先确定的标准来编写 WHERE param1 = '$param1' AND param2 = '$param2' AND param3 = '$param3' 如何解决此问题?以下是您所问问题的一般示例: $query = "SELECT * FRO

我需要你对我的网站搜索功能的帮助。我正在开发一个会员区,用户可以根据特定标准或标准组合搜索其他注册用户

我现在的问题是如何构建一个动态mysql查询,以满足搜索条件的每个组合的需要,其中条件的数量是可变的

通常,我可以使用一组预先确定的标准来编写

   WHERE param1 = '$param1'
   AND param2 = '$param2'
   AND param3 = '$param3'

如何解决此问题?

以下是您所问问题的一般示例:

$query = "SELECT * FROM mytable";

if ($_POST['name'] == "Jack") {
   $query .= " WHERE name = 'Jack'";
}
if ($_POST['name'] == "Bob") {
   $query .= " WHERE name = 'Bob'";
}

if ($_POST['state'] != "") {
   $query .= " AND state = '" . mysql_real_escape_string($state) . "'";
}

//So now, in total, your query might look like this
//"SELECT * FROM mytable WHERE name = 'Bob' AND state = '$state'"    

$result = mysql_query($query);

您只需在
$query
字符串中添加
if
语句,然后在检查完所有
$\u POST
变量后执行查询。

下面是一个通用示例,说明您的问题:

$query = "SELECT * FROM mytable";

if ($_POST['name'] == "Jack") {
   $query .= " WHERE name = 'Jack'";
}
if ($_POST['name'] == "Bob") {
   $query .= " WHERE name = 'Bob'";
}

if ($_POST['state'] != "") {
   $query .= " AND state = '" . mysql_real_escape_string($state) . "'";
}

//So now, in total, your query might look like this
//"SELECT * FROM mytable WHERE name = 'Bob' AND state = '$state'"    

$result = mysql_query($query);

您只需使用
if
语句添加到
$query
字符串中,然后在检查完所有
$\u POST
变量后执行查询。

使用脚本语言(php)循环输入

然后有一个这样的结构:

WHERE 1=1
然后添加您的

AND paramx = '$px' 

使用脚本语言(php)循环输入

$criteria = array();

//Populate your criteria and parameter arrays with input from the web page here
...
// $criteria should now have stuff in it

$sql = "SELECT * FROM mytable ";//Or whatever your sql query is
$count = 0;
foreach ($criteria as $key => $parameter) {
  if ($count == 0) {
    $sql = $sql."WHERE ".$key." = ".$parameter;
  } else {
    $sql = $sql."AND ".$key." = ".$parameter;
  }
  $count++;
}
然后有一个这样的结构:

WHERE 1=1
然后添加您的

AND paramx = '$px' 
对它

$criteria = array();

//Populate your criteria and parameter arrays with input from the web page here
...
// $criteria should now have stuff in it

$sql = "SELECT * FROM mytable ";//Or whatever your sql query is
$count = 0;
foreach ($criteria as $key => $parameter) {
  if ($count == 0) {
    $sql = $sql."WHERE ".$key." = ".$parameter;
  } else {
    $sql = $sql."AND ".$key." = ".$parameter;
  }
  $count++;
}
也就是说,它极易受到sql注入攻击。试用


也就是说,它极易受到sql注入攻击。尝试使用

一个选项也是从php/asp或您正在使用的任何东西构建查询,如下所示

$param1 = (isset($searchParam1) ? "param1 = $searchParam2" : "1");
$param2 = (isset($searchParam2) ? "param2 = $searchParam2" : "1");
$param3 = (isset($searchParam3) ? "param3 = $searchParam3" : "1");
查询结果如下


选择。。。其中$param1$param2$param3

还有一个选项,可以从php/asp或您使用的任何东西构建查询,如下所示

$param1 = (isset($searchParam1) ? "param1 = $searchParam2" : "1");
$param2 = (isset($searchParam2) ? "param2 = $searchParam2" : "1");
$param3 = (isset($searchParam3) ? "param3 = $searchParam3" : "1");
查询结果如下


选择。。。其中$param1$param2$param3

如果问题是您不知道用户将选择哪一个条件,但希望返回“空白”条件的结果,则可以使用以下方法:

$criteria_1 = $_POST['criteria_1'];
$criteria_2 = $_POST['criteria_2'];
$criteria_3 = $_POST['criteria_3'];

if(!$criteria_1 && !$criteria_2 && !$criteria_1) {

     echo "You must select at least one criteria!";

} else {

   // Run query mentioned below and return results.       

} 
然后,查询将如下所示:

SELECT * from mytable
WHERE
(criteria1 = '$criteria_1' OR '$criteria_1' = '') AND
(criteria2 = '$criteria_2' OR '$criteria_2' = '') AND
(criteria3 = '$criteria_3' OR '$criteria_3' = '')
这会将任何空白(未选定)参数视为空白并忽略它们。请注意,使用上述方法,如果没有给出任何标准,它将返回所有结果

写上述内容的另一种方法是:

SELECT * from mytable
WHERE
criteria1 IN ('$criteria_1', '') AND
criteria2 IN ('$criteria_2', '') AND
criteria3 IN ('$criteria_3', '')

同样,不允许任何输入返回所有criteria1结果。

如果问题是您不知道用户将选择哪些条件,但希望返回“空白”条件的结果,则可以使用以下方法:

$criteria_1 = $_POST['criteria_1'];
$criteria_2 = $_POST['criteria_2'];
$criteria_3 = $_POST['criteria_3'];

if(!$criteria_1 && !$criteria_2 && !$criteria_1) {

     echo "You must select at least one criteria!";

} else {

   // Run query mentioned below and return results.       

} 
然后,查询将如下所示:

SELECT * from mytable
WHERE
(criteria1 = '$criteria_1' OR '$criteria_1' = '') AND
(criteria2 = '$criteria_2' OR '$criteria_2' = '') AND
(criteria3 = '$criteria_3' OR '$criteria_3' = '')
这会将任何空白(未选定)参数视为空白并忽略它们。请注意,使用上述方法,如果没有给出任何标准,它将返回所有结果

写上述内容的另一种方法是:

SELECT * from mytable
WHERE
criteria1 IN ('$criteria_1', '') AND
criteria2 IN ('$criteria_2', '') AND
criteria3 IN ('$criteria_3', '')

同样,不允许任何条目返回所有criteria1结果。

我见过这样的查询,因此,如果您不想为特定列输入值,请为该列输入NULL:

SELECT *
FROM users
WHERE param1 = :param1
UNION
SELECT *
FROM users
WHERE param2 = :param2
UNION
SELECT *
FROM users
WHERE param3 = :param3

这假设您将为每个列编制索引,并且您正在执行布尔and搜索(并使用PDO)。

我见过类似的查询,因此如果您不想为特定列输入值,请为该列传递NULL:

SELECT *
FROM users
WHERE param1 = :param1
UNION
SELECT *
FROM users
WHERE param2 = :param2
UNION
SELECT *
FROM users
WHERE param3 = :param3

这假设您将对每一列进行索引,并执行布尔and搜索(并使用PDO)。

希望与PHP共享此代码以构建动态mysql查询 Thx&问候

$vocabulary = (($page == "vocabulary") ? "image_name <> ''" : ""); 
$groupcat = (($group != "") ? "group = $group" : ""); 

$var = array($vocabulary, $groupcat);   

$counter = "0";
$param = "";
for ($i=0;$i<count($var);$i++)
{
    if ($counter == "0" && $var[$i] != "" )     $param = "WHERE ";
    if ($counter > "0" && $var[$i] != "" ) $param = " AND ";

    if ($param  != "") 
    {
        $condition .= $param . $var[$i];
        $param="";
        $counter++;
    }
}   
echo "Condition : ". $condition;
词汇=($page=“词汇”)?“图像名称”:”;
$groupcat=(($group!=”)?“group=$group:”);
$var=array($词汇,$groupcat);
$counter=“0”;
$param=“”;
对于($i=0;$i“0”&&$var[$i]!=”)$param=“AND”;
如果($param!=“”)
{
$condition.=$param.$var[$i];
$param=“”;
$counter++;
}
}   
回声“条件:”$条件

希望与大家分享这段代码,用PHP构建动态mysql查询 Thx&问候

$vocabulary = (($page == "vocabulary") ? "image_name <> ''" : ""); 
$groupcat = (($group != "") ? "group = $group" : ""); 

$var = array($vocabulary, $groupcat);   

$counter = "0";
$param = "";
for ($i=0;$i<count($var);$i++)
{
    if ($counter == "0" && $var[$i] != "" )     $param = "WHERE ";
    if ($counter > "0" && $var[$i] != "" ) $param = " AND ";

    if ($param  != "") 
    {
        $condition .= $param . $var[$i];
        $param="";
        $counter++;
    }
}   
echo "Condition : ". $condition;
词汇=($page=“词汇”)?“图像名称”:”;
$groupcat=(($group!=”)?“group=$group:”);
$var=array($词汇,$groupcat);
$counter=“0”;
$param=“”;
对于($i=0;$i“0”&&$var[$i]!=”)$param=“AND”;
如果($param!=“”)
{
$condition.=$param.$var[$i];
$param=“”;
$counter++;
}
}   
回声“条件:”$条件

您可能需要提供更多信息(您的架构、查询空间、现有代码…)。或者我想我们可以猜到。答案是什么?我赢了什么?问题是您希望任何一个条件为真,还是希望一个查询中给定数量的条件为真?我的意思是,如果更像
其中a='$a'或b='$b'或c='$c'
,或者更像
其中a='$a'和(b='$b'或c='$c')
?您可能需要提供更多信息(您的模式、查询空间、现有代码…)。或者我想我们可以猜到。答案是什么?我赢了什么?问题是您希望任何一个条件为真,还是希望一个查询中给定数量的条件为真?我的意思是,if应该更像
其中a='$a'或b='$b'或c='$c'
,或者更像
其中a='$a'和(b='$b'或c='$c')
?谢谢你的回答。在用户未能输入任何标准的情况下。我不能通过检查………..来停止quey表单的运行吗。。。。。。。。。。。。。。如果(“$param1”=”)&&($param2”=”)&($param3”=”){echo“所有字段均为空”;exit();}感谢您的帮助。您是说如果所有条件均为空,则不希望返回任何结果?您可以在运行查询之前执行此操作,是的。编辑答案。谢谢你的回答。在用户未能输入任何标准的情况下。我不能通过检查………..来停止quey表单的运行吗。。。。。。。。。。。。。。如果(“$param1”=”)&&($param2”=”)&($param3”=”){echo“所有字段均为空”;exit();}感谢您的帮助。您是说如果所有条件均为空,则不返回任何结果?可以这样做