带有一个或多个(多个)参数的search表单

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

编辑:清理标签礼节更stream畅的阅读。

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

因此,基本上我想重写上面的内容,而用户可以input一个或多个参数,并返回所需的结果(例如名称和学院 – &名称= X&学院= Y或所有项目,如果需要的话)。 我想我需要重新思考这两个文件中的逻辑,但我愿意接受任何想法或build议,你这个美好的社区,可能有! 任何意见/指导将不胜感激。

dynamic构buildWHERE子句。 我推荐的方法是将每个条件推送到数组上,然后使用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()) { ... } 

如果你不打算改变数据库中的任何东西 – 你只是select – 继续使用GET而不是POST。 这样做的好处是可以将URL保存为searchstring。 您也可以刷新search,而不需要重新提交post提醒。 您只需确保在将参数发送到数据库之前对参数进行参数化。 我通常会通过清理函数来发送这些值,例如正则expression式,如果您期望字母,则确保您只有字母;如果您期望数字,则只有数字。

在同一页面上(全部search):(我只是想为你勾画这​​个)。

 <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从search文件中取出并放入另一个文件中。 当您按下表单中的searchbutton时,您将使用AJAX调用PHP元素。 然后PHP文件将通过Ajax返回结果。 您可以返回HTML格式或JSON,让像JQuery这样的东西为您显示。