0

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

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

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

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

我该如何解决这个问题?

4

7 回答 7

2

如果问题是您不知道用户将选择哪个标准,但想要返回“空白”标准的结果,您可以使用以下方法:

$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 结果。

于 2012-04-30T21:45:56.143 回答
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

于 2012-04-30T21:36:02.887 回答
1

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

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

这假设您将为每一列建立索引,并且您正在执行布尔 AND 搜索(并使用 PDO)。

于 2012-04-30T21:50:54.800 回答
0

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

然后有这样的结构:

WHERE 1=1

然后添加你的

AND paramx = '$px' 

对它...

于 2012-04-30T21:36:46.540 回答
0
$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

于 2012-04-30T21:40:07.073 回答
0

一个选项也是从 php/asp 或任何你使用的东西构建查询,像这样

$param1 = (isset($searchParam1) ? "param1 = $searchParam2" : "1");
$param2 = (isset($searchParam2) ? "param2 = $searchParam2" : "1");
$param3 = (isset($searchParam3) ? "param3 = $searchParam3" : "1");

查询就像

选择 ... 在哪里 $param1 $param2 $param3

于 2012-04-30T21:40:45.337 回答
0

想分享此代码以使用 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;
于 2013-07-16T00:02:38.987 回答