我需要您对我的网站搜索功能的帮助。我正在开发一个会员区,用户可以在其中根据某些标准或标准组合搜索其他注册用户。
我现在的问题是如何构建一个动态 mysql 查询以适应每种搜索条件组合的需要,其中条件的数量是可变的。
通常,我可以使用预先确定的一组标准来编写
WHERE param1 = '$param1'
AND param2 = '$param2'
AND param3 = '$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', '')
同样,根本不允许输入以返回所有条件 1 结果。
这是您要问的通用示例:
$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
后执行查询。$_POST
我见过这样的查询,因此如果您不想为特定列输入值,则为该列传递 NULL:
SELECT *
FROM users
WHERE param1 = :param1
UNION
SELECT *
FROM users
WHERE param2 = :param2
UNION
SELECT *
FROM users
WHERE param3 = :param3
这假设您将为每一列建立索引,并且您正在执行布尔 AND 搜索(并使用 PDO)。
使用您的脚本语言(php)循环输入...
然后有这样的结构:
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 注入攻击。尝试使用PHP PDO
一个选项也是从 php/asp 或任何你使用的东西构建查询,像这样
$param1 = (isset($searchParam1) ? "param1 = $searchParam2" : "1");
$param2 = (isset($searchParam2) ? "param2 = $searchParam2" : "1");
$param3 = (isset($searchParam3) ? "param3 = $searchParam3" : "1");
查询就像
选择 ... 在哪里 $param1 $param2 $param3
想分享此代码以使用 PHP Thx 构建动态 mysql 查询
$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;