Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用一个或多个(多个)参数搜索表单_Php_Search_Parameters_Isset - Fatal编程技术网

Php 使用一个或多个(多个)参数搜索表单

Php 使用一个或多个(多个)参数搜索表单,php,search,parameters,isset,Php,Search,Parameters,Isset,我已经了解了基本知识,在这里我创建了两个文件,一个是用户输入搜索参数的搜索表单,另一个是输出输入项的结果文件。为了简单起见,我们将搜索表单文件指定为search.php,结果页面指定为results.php search.php <?php if (!empty($_POST['id']) && isset($_POST['id'])) { header("Location: ?m=search.results&id=".$_P

我已经了解了基本知识,在这里我创建了两个文件,一个是用户输入搜索参数的搜索表单,另一个是输出输入项的结果文件。为了简单起见,我们将搜索表单文件指定为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>

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

$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()) {
    ...
}

如果您不打算更改数据库中的任何内容—您只是选择—继续使用GET而不是POST。这样做的好处是,它将允许您将URL保存为搜索字符串。您还可以刷新搜索,而无需获取“重新提交邮件”警报。您只需要确保在将值发送到数据库之前对其进行参数化。我通常会通过sanitize函数发送这些值,比如一个正则表达式,它可以确保在需要字母时只有字母,或者在需要数字时只有数字

在同一页上(全部搜索):(我只想为您概述一下。)

>业务
现在您可以显示您的数据了

编辑:我写了答案的另一半,然后他写了第二部分,所以我把它合并了


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

你能重新格式化你的代码吗?当你有奇怪的缩进+php打开和关闭标签以明显随机的方式放置时,阅读起来非常困难。你是在使用PDO还是MySQLI?@tivie清理了代码和标签礼仪。请参阅编辑。查询现在是动态生成的。令人惊叹的。也许我做错了什么,因为print\r给了我:PDOStatement对象([queryString]=>SELECT*FROM
user\u details
a.uid=b.id上的连接
user
b,其中a.major=:major)。。但它似乎什么都没有抓取。在($student=$stmt->fetch())
时,是否有一个循环
?我不知道我做错了什么,但它现在在@Barmar运行。再次感谢您的帮助,好心的先生。@Barmar值得为您的答案添加内容,以防有人尝试。提交空表单字段时,我没有得到返回的数据。也许这就是我所做的,但我在isset条件中添加了以下内容,一切都很好,就像一个符咒。。如果(isset($\u GET['major'])和&!empty($\u GET['major']){$wheres[]='a.major='a.major=:major';$params[':major']=$\u GET['major']只要变量被设置为任何值,
isset
就是真的,即使它被设置为空字符串也是如此。请注意,
empty
对于设置为
0
的变量也是真的,所以不要将其用于可以包含数字的变量。另外,如果您使用
!empty
,您不需要先测试
isset
,它会对自动的。谢谢你的帮助。请看我在下面他帖子上的评论。我相信我就快到了,但做错了什么?
while ($student = $stmt->fetch()) {
    ...
}
<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);
}
?>