【问题标题】:Search Form with One or More (Multiple) Parameters具有一个或多个(多个)参数的搜索表单
【发布时间】:2015-05-08 16:51:43
【问题描述】:

我已经掌握了基础知识,创建了两个文件,一个是用户输入搜索参数的搜索表单,另一个是生成输入项目的结果文件。为简单起见,我们将搜索表单文件指定为 search.php,将结果页面指定为 results.php。

搜索.php

<?php
    
if (!empty($_POST['id']) && isset($_POST['id'])) {
    header("Location: ?m=search.results&id=".$_POST['id']."");
} elseif (!empty($_POST['major']) && isset($_POST['major'])) {
    header("Location: ?m=search.results&major=".$_POST['major']."");
} elseif (!empty($_POST['college']) && isset($_POST['major'])) {
    header("Location: ?m=search.results&college=".$_POST['college']."");
} elseif (!empty($_POST['name']) && isset($_POST['name'])) {
    header("Location: ?m=search.results&name=".$_POST['name']."");
} elseif (!empty($_POST['id']) && !empty($_POST['college']) && !empty($_POST['major'])
                            && isset($_POST['submit']) && !empty($_POST['name'])) {
    echo "<div class='alert alert-danger'>No students found. Please try different parameters.</div>";
}

?>


<h4>Search</h4>

<form method="POST">
    <table width="100%">

<tr><td>ID:</td><td> <input type="text" name="id" class="form-control"></textarea></td></tr>

<tr><td>Name:</td><td> <input type="text" name="name" class="form-control"></textarea></td></tr>

<tr><td>Major:</td><td><select name="major" class="form-control"><option></option><?php echo majorSelect(); ?></select></td></tr>

    <tr><td>College:</td><td><select name="college" class="form-control"><option></option><?php echo collegeSelect(); ?></select></td></tr>

<tr><td colspan="2"><input type="submit" name="submit" value="Search" class="btn btn-lrg btn-primary" style="margin-top:10px;"></td></tr>

    </table>
</form>

结果.php

<!-- Begin Search Parameters -->

<?php

if (isset($_GET['id'])) {
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.uid = '".$_GET['id']."'");
    
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>
                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
} elseif (isset($_GET['major'])) {
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.major = '".$_GET['major']."'");
        
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>

                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
} elseif (isset($_GET['college'])) {
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND a.college = '".$_GET['college']."'");
        
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>
                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
} elseif (isset($_GET['name'])) {
    $name = $_GET['name'];
        
    $students = $db->query("SELECT * FROM `user_details` a, `user` b WHERE a.uid = b.id AND b.name LIKE '%". $name . "%'");
        
    while ($student = $students->fetch()) {
        echo '
            <tr>
                <td>'.$student['uid'].'</td>
                <td>'.$student['name'].'</td>
                    <td>'.$student['major'].'</td>
                    <td>'.$student['college'].'</td>
                <td><a href="?m=profile&id='.$student['id'].'" style="display:block">View</a></td>
                
            </tr>';
    }
}    

所以,基本上我想重写上面的内容,而用户可以输入一个或多个参数,并返回所需的结果(例如,姓名和学院 - &name=x&college=y 或所有项目,如果需要的话)。

【问题讨论】:

  • 您能重新格式化您的代码吗?当您以明显随机的方式放置奇怪的缩进 + php 打开和关闭标签时,阅读起来非常困难
  • 你使用的是PDO还是MySQLI?
  • @tivie 清理了代码和标签礼仪。查看修改。

标签: php search parameters isset


【解决方案1】:

动态构建WHERE 子句。我推荐的方法是将每个条件推送到一个数组中,然后使用implode() 连接所有条件,并根据您的喜好将它们与ANDOR 连接起来。

$wheres = array();
$params = array();
if (!empty($_GET['id'])) {
    $wheres[] = 'a.uid = :uid';
    $params[':uid'] = $_GET['id'];
}
if (!empty($_GET['major'])) {
    $wheres[] = 'a.major = :major';
    $params[':major'] = $_GET['major'];
}
if (!empty($_GET['name'])) {
    $wheres[] = 'b.name LIKE :name';
    $params[':name'] = '%'.$_GET['name'].'%';
}
// And so on for all parameters

$sql = "SELECT * 
        FROM user_details AS a
        JOIN user AS b ON a.uid = b.id";
if (!empty($wheres)) {
    $sql .= " WHERE " . implode(' AND ', $wheres);
}
$stmt = $db->prepare($sql);
$stmt->execute($params);

然后按照原始代码显示结果。

while ($student = $stmt->fetch()) {
    ...
}

【讨论】:

  • 感谢您的帮助。请参阅下面我对他的帖子的评论。我相信我快到了,但做错了什么?
【解决方案2】:

如果您不打算更改数据库中的任何内容 - 您只是在选择 - 请继续使用 GET 而不是 POST。这样做的好处是它允许您将 URL 保存为搜索字符串。您还可以刷新搜索,而不会收到重新提交帖子提醒。您只想确保在将值发送到数据库之前对其进行参数化。我通常会通过 sanitize 函数发送这些值,例如一个正则表达式,它确保你只有字母,如果你期望字母,或者一个数字,如果你期望数字。

在同一页面上(所有搜索):(我只是为您概述一下。)

<form action="<?= $_SERVER["REQUEST_URI"]; ?>" method="GET">
    <input name="major" value="<?= $_GET["major"]; ?>" />
    <select name="college">
        <option value="1" <?PHP if( $_GET["college"] == 1 ) echo 'selected="true"'; ?>>Business</option>
    </select>
</form>

<?PHP
if( ! empty( $_GET ) ){
    if (isset($_GET['major'])) {
       $wheres[] = 'a.major = :major';
       $params[':major'] = $_GET['major'];
    }
    if (isset($_GET['name'])) {
       $wheres[] = 'b.name LIKE :name';
       $params[':name'] = '%'.$_GET['name'].'%';
    }
    // And so on for all parameters

    $sql = "SELECT * 
        FROM user_details AS a
        JOIN user AS b ON a.uid = b.id";
    if (!empty($wheres)) {
        $sql .= " WHERE " . implode(' AND ', $wheres);
    }
    $stmt = $db->prepare($sql);
    $stmt->execute($params);
}
?>

现在您可以显示您的数据了。

编辑:我写了答案的另一半,然后他写了第二半,所以我只是将其合并...

此外,这方面的下一个复杂级别是将 PHP 从搜索文件中取出并将其放入另一个文件中。当您按下表单中的搜索按钮时,您将使用 AJAX 来调用 PHP 元素。然后 PHP 文件将通过 Ajax 返回结果。您可以返回预格式化的 HTML 或 JSON,并让 JQuery 之类的东西为您显示它。

【讨论】:

  • 现在动态生成查询。惊人的。也许我做错了什么,因为 print_r 给了我: PDOStatement Object ( [queryString] => SELECT * FROM user_details a JOIN user b ON a.uid = b.id WHERE a.major = :major ) ..但它似乎没有获取任何东西。
  • 你有循环while($student = $stmt-&gt;fetch())吗?
  • 我不知道我做错了什么,但它现在可以工作@Barmar。再次感谢您的帮助,先生。
  • @Barmar 值得添加到您的答案中,以防人们尝试这样做。提交空表单字段时,我没有返回数据。也许这就是我正在做的事情,但是我在 isset 条件中添加了以下内容,一切都很好,就像一个魅力.. if (isset($_GET['major']) && !empty($_GET['major'] )) { $wheres[] = 'a.major = :major'; $params[':major'] = $_GET['major'];
  • isset 为真,只要变量设置为任何值,即使它设置为空字符串。请注意,empty 对于设置为 0 的变量将是 true,因此不要将其用于可以包含数字的变量。另外,如果你使用!empty,你不需要先测试isset,它会自动测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多