具有一个或多个(多个)参数的搜索表单
我已经掌握了基础知识,在其中创建了两个文件,一个是用户输入搜索参数的搜索表单,另一个是输入文件的搜索结果文件.为了简单起见,我们将搜索表单文件指定为search.php,将结果页面指定为results.php.
I've gotten the basics down, where I've created two files, the search form where a user inputs search parameters, and the results file that cranks out inputted items. For the sake of simplicity we'll designate the search form file as search.php and the results page as results.php.
清理了标签礼节,以使阅读更顺畅.
Cleaned up tab etiquette for smoother reading.
<?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>';
}
} ?>
因此,从本质上讲,我想重写上面的内容,而用户可以输入一个或多个参数,并返回所需的结果(例如name和college-& name = x& college = y或所有需要的项是).我认为我需要重新考虑两个文件中的逻辑,但是我愿意接受您(这个很棒的社区)可能提出的任何想法或建议!任何建议/指导将不胜感激.
So, essentially I would like to rewrite the above whereas a user can input one or more parameters, and the desired result is returned (e.g. both name and college - &name=x&college=y OR all items if need be). I'm thinking i'll need to rethink the logic in both files, but I'm open to any ideas or suggestions you, this wonderful community, might have! Any advice/guidance would be greatly appreciated.
动态构建WHERE
子句.我推荐的方法是将每个条件放入数组,然后使用implode()
串联所有条件,并根据需要将它们与AND
或OR
连接.
Build the WHERE
clause dynamically. My recommended approach is to push each condition onto an array, and then use implode()
to concatenate all the conditions, connecting them with AND
or OR
as is your preference.
$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);
然后按照原始代码显示结果.
Then display the results as in your original code.
while ($student = $stmt->fetch()) {
...
}