搜索具有一个或多个(多个)参数的表单

时间:2015-03-07 00:01:33

标签: php search parameters isset

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

编辑:清理标签礼仪,以便更顺畅地阅读。

的search.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>

results.php

   <?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>';

            }



        } ?>

所以,基本上我想重写上面的内容,而用户可以输入一个或多个参数,并返回所需的结果(例如姓名和大学 - &amp; name = x&amp; college = y或者所有项目,如果需要是)。我想我需要重新思考这两个文件中的逻辑,但我愿意接受你,这个美妙的社区可能有的任何想法或建议!任何建议/指导都将不胜感激。

2 个答案:

答案 0 :(得分:8)

动态构建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()) {
    ...
}

答案 1 :(得分:2)

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

在同一页面上(所有搜索):(我将为您概述此内容。)

<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之类的东西为您显示。