Php 如何构建适合所有用户的动态mysql查询
我需要你对我的网站搜索功能的帮助。我正在开发一个会员区,用户可以根据特定标准或标准组合搜索其他注册用户 我现在的问题是如何构建一个动态mysql查询,以满足搜索条件的每个组合的需要,其中条件的数量是可变的 通常,我可以使用一组预先确定的标准来编写Php 如何构建适合所有用户的动态mysql查询,php,mysql,dynamic,Php,Mysql,Dynamic,我需要你对我的网站搜索功能的帮助。我正在开发一个会员区,用户可以根据特定标准或标准组合搜索其他注册用户 我现在的问题是如何构建一个动态mysql查询,以满足搜索条件的每个组合的需要,其中条件的数量是可变的 通常,我可以使用一组预先确定的标准来编写 WHERE param1 = '$param1' AND param2 = '$param2' AND param3 = '$param3' 如何解决此问题?以下是您所问问题的一般示例: $query = "SELECT * FRO
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();}感谢您的帮助。您是说如果所有条件均为空,则不返回任何结果?可以这样做