如何进一步过滤搜索步骤的结果?
Posted
技术标签:
【中文标题】如何进一步过滤搜索步骤的结果?【英文标题】:How to further filter the result from searching step? 【发布时间】:2016-11-29 20:27:03 【问题描述】:我有一个存储 student_name 和 class_name 的表 student_tb
student_id | student_name | class_name
1 | John | 1
2 | Herry | 2
3 | Peter | 1
4 | Tom | 2
我创建了一个表单来在数据库中搜索学生姓名,如下所示:
<form style="text-align: center;" method='POST'>
<input type="text" name='input_text' id='input_text' placeholder="Input text to search" required>
<button type="submit" name='search' value="search" ">Search</button>
</form>
<div class="container" style="text-align: center;">
<?php
if(isset($_POST['search']))
$sql = "SELECT * FROM student_tb WHERE student_name LIKE '%".$_POST['input_text']."%' ";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_assoc($result))?>
<ul>
<li><h3><?php echo $row["student_name"] . $row["class_name"]; ?></h3></li>
</ul>
<?php ?>
</div>
假设,我将添加两个复选框,用于进一步过滤搜索步骤的结果。当我单击复选框时,您能指导我如何实现它吗?比如我输入'T',搜索结果是Peter 1
和Tom 2
。之后,我点击复选框class 1
,结果只剩下彼得1。非常感谢
<div id="filter" style="text-align: center;">
<input type="checkbox" id="class1" name="class1" value="class1">
<label for="class1">Class 1</label>
<input type="checkbox" id="class2" name="class2">
<label for="class2">Class2</label>
</div>
【问题讨论】:
【参考方案1】:只需将这些复选框定义为数组 (name="class[]")
,给它们一个等于您的 class_name ID 的值并在构建 SQL 查询时检查它们:
<form style="text-align: center;" method='POST'>
<input type="text" name='input_text' id='input_text' placeholder="Input text to search" required>
<div id="filter" style="text-align: center;">
<input type="checkbox" id="class1" name="class[]" value="1">
<label for="class1">Class 1</label>
<input type="checkbox" id="class2" name="class[]" value="2">
<label for="class2">Class2</label>
</div>
<button type="submit" name="search" value="search">Search</button>
</form>
<div class="container" style="text-align: center;">
<?php
if (isset($_POST['search']))
dump($_POST);
$sql = "SELECT * FROM student_tb WHERE student_name LIKE '%" . $_POST['input_text'] . "%' ";
if(isset($_POST['class']))
foreach ($_POST['class'] AS $k => $v)
if ($k == 0)
$sql .= " AND (class_name = " . $v;
else
$sql .= " OR class_name = " . $v;
$sql .= ")";
$result = mysqli_query($conn, $sql) or die(mysqli_error($conn));
while ($row = mysqli_fetch_assoc($result))
?>
<ul>
<li><h3><?php echo $row["student_name"] . $row["class_name"]; ?></h3></li>
</ul>
<?php
?>
</div>
内置 SQL 查询:
SELECT
*
FROM
student_tb
WHERE
student_name LIKE '%T%'
AND (class_name = 1 OR class_name = 2)
请注意,如果您发送多个复选框,则必须将它们与 OR 子句结合使用才能正确过滤数据。
更新:这是脚本(html 和 PHP),能够:
按字符串搜索;
通过自动提交应用复选框过滤器;
提交后保留所有值;
重置表格;
<form name="searchForm" method="post">
<input type="hidden" name="formSubmit" value="1">
<input
type="text"
name='input_text'
id='input_text'
placeholder="Input text to search"
required
value="<?php if (isset($_POST['input_text'])) echo $_POST['input_text'] ?>">
<div id="filter">
<input
type="checkbox"
id="class1"
name="class[0]"
value="1"
onclick="this.form.submit()" <?php if (isset($_POST['class'][0])) echo $_POST['class'][0] ? 'checked' : ''; ?>>
<label for="class1">Class 1</label>
<input
type="checkbox"
id="class2"
name="class[1]"
value="2"
onclick="this.form.submit()" <?php if (isset($_POST['class'][1])) echo $_POST['class'][1] ? 'checked' : ''; ?>>
<label for="class2">Class2</label>
</div>
<button type="submit" name="search" value="search">Search</button>
<button type="reset" name="reset" value="reset" onclick="window.location.href = '<?php echo $_SERVER['PHP_SELF']; ?>'">Reset</button>
</form>
<div class="container">
<?php
if (isset($_POST['formSubmit']))
dump($_POST);
$sql = "SELECT * FROM student_tb WHERE student_name LIKE '%" . $_POST['input_text'] . "%' ";
if (isset($_POST['class']))
$c = 0;
$sql .= " AND (";
foreach ($_POST['class'] AS $k => $v)
if($c == 0) $sql .= "class_name = " . $v;
else $sql .= " OR class_name = " . $v;
$c++;
$sql .= ")";
$result = mysqli_query($conn, $sql) or die(mysqli_error($conn));
while ($row = mysqli_fetch_assoc($result))
?>
<ul>
<li><h3><?php echo $row["student_name"] . $row["class_name"]; ?></h3></li>
</ul>
<?php
?>
</div>
这个变化有点静态,肯定可以改进,但你会明白的。
【讨论】:
谢谢。如果我选中一个框并进行搜索,效果会很好。但是,如果我没有选中任何框并插入文本进行搜索。它有一个小错误如下:(注意:未定义索引:第 26 行 index.php 中的类警告:第 26 行 index.php 中为 foreach() 提供的参数无效警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,第 35 行 index.php 中给出的布尔值)....在这种情况下,搜索过程只需执行 WHERE student_name LIKE '%" . $_POST['input_text'] . "%' " 是的,我的小姐,我们需要检查是否有任何复选框作为 POST 参数传递 - 检查更新的脚本。 谢谢,我明白了。它的代码很短,很容易理解。我只想再问你一个问题。是否可以进行现场表演?例如,当我单击复选框 1 时将显示过滤结果 而不是点击按钮搜索? 是的,是可能的,但是您需要稍微修改脚本以实现这一点,例如在第一次提交后将输入字段值保留在其中,将onclick="this.form.submit()"
添加到复选框(并再次保持其状态)并寻找其他一些 POST 值,但不是 search
以检测表单是否已提交。以上是关于如何进一步过滤搜索步骤的结果?的主要内容,如果未能解决你的问题,请参考以下文章