php - 高级搜索、PHP 和 MySQL

标签 php mysql

我正在尝试创建一个看起来像这样的高级搜索表单;

http://img805.imageshack.us/img805/7162/30989114.jpg

但是我应该为查询写什么?

如果只有两个文本框我知道怎么做,但是三个,用户这样做的可能性太大了。

$query = "SELECT * FROM server WHERE ???";

“???”应该怎么写

我知道如何在查询中使用 AND OR,但假设用户只填写两个文本框和一个空文本框。如果我写这样的东西;

$query = "SELECT * FROM server WHERE model='".$model."' and brand='".$brand."' and   SN='".$SN.'" ";

结果将作为空集返回。我希望用户可以选择是否填写一个、两个或三个标准。如果我使用 OR,结果将不准确,因为如果模型有两个名称相同(例如:M4000)但品牌不同(例如:IBM 和 SUN)的数据。如果我使用 OR 并且用户想要搜索 M4000 和 SUN,它将同时显示 M4000。这就是它不准确的原因。

最佳答案

如果用户可以决定他想为你的搜索输入多少条件,而你想组合这些条件(只有用户实际填写的那些),那么你必须动态创建你的 SQL 查询以只包含那些字段由用户填写的搜索。我给你举个例子。

简单搜索表单的代码可能如下所示:

$search_fields = Array(
    // field name => label
   'model'     => 'Model',
   'serialNum' => 'Serial Number',
   'brand'     => 'Brand Name'
);
echo "<form method=\"POST\">";
foreach ($search_fields as $field => $label) {
    echo "$label: <input name=\"search[$field]\"><br>";
}
echo "<input type=\"submit\">";
echo "</form>";

实际搜索的代码如下:

if (isset($_POST['search']) && is_array($_POST['search'])) {
    // escape against SQL injection
    $search = array_filter($_POST['search'], 'mysql_real_escape_string');
    // build SQL
    $search_parts = array();
    foreach ($search as $field => $value) {
        if ($value) {
            $search_parts[] = "$field LIKE '%$value%'";
        }
    }
    $sql = "SELECT * FROM table WHERE " . implode(' AND ', $search_parts);
    // do query here
}
else {
    echo "please enter some search criteria!";
}

在上面的代码中,我们动态构建 SQL 字符串以仅对输入的条件进行搜索(“AND”)。

关于php - 高级搜索、PHP 和 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901926/

相关文章:

php - 通过单击 HTML 按钮和 php 更新 SQL 行

php - Symfony2 : Spaces in image when using GD

php - 通过多对多关系的对象字段从数据库中获取对象

mysql - 如何将列设置为唯一,但仅在某种情况下?

c# - 避免 SQL 查询、预订应用程序中的重复值

mysql - Django和mysql在不同服务器上的性能

php - 带有来自服务器(php)的图像的Android Firebase推送通知在应用程序处于后台时未在通知中显示图像

php - 将字符串分解为没有空元素的数组?

php - 如果他使用 var 来解释 PHP OOP,这是否是旧的解释?

java - Java 中 MySQL 插入语句的性能 : Batch mode prepared statements vs single insert with multiple values