【问题标题】:mySQLi PHP database search on button click form按钮单击表单上的 mySQLi PHP 数据库搜索
【发布时间】:2016-11-28 18:08:52
【问题描述】:

我正在尝试在我的主页上实现一个非常简单的搜索表单,但它并不能完全按照我的意愿工作..

看起来表单中的链接运行良好,甚至数据库搜索现在也正常运行,这要归功于最新的更新。

问题是:当搜索准备好并显示结果时(echo $output),我总是只看到一个结果,但我希望所有匹配显示出来..

有什么建议吗?

提前致谢:)

search.php 文件来了:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>



<?php

    $conn = mysqli_connect("localhost", "user", "password", "table");

    if(mysqli_connect_errno() ) {
        echo "Failed to connect: " . mysqli_connect_error();
    }
?>


<?php

    $output = '';

    if(isset($_GET['query']) && $_GET['query'] !== ' ') {

        $searchquery = $_GET['query'];

        $query = mysqli_query($conn, "SELECT * FROM tbl_users WHERE username LIKE '%$searchquery%' OR email LIKE '%searchquery%'") or die(mysqli_error());

        $num_rows = mysqli_num_rows($query);


        if($num_rows== 0) {

                $output = 'No search results for <b>"' . $searchquery . '"</b>';

        } else {

            while($row = mysqli_fetch_array($query)){

                $id = $row['id'];
                $username = $row['username'];
                $email = $row['email'];

                $output = "<a href='profile.php?user=$id'>$username</a>";

            }

        }

    } else {

        header("location: ./");

    }


    print("$output");

    mysqli_close($conn);


?>

【问题讨论】:

    标签: php database forms search mysqli


    【解决方案1】:

    %$query% 需要在查询字符串中用单引号括起来,如下所示:

    SELECT * FROM tbl_users WHERE username LIKE '%$query%' OR email LIKE '%$query%'

    但现在您的代码容易受到 SQL 注入的攻击。你可能应该看看接下来修复它。见:How can I prevent SQL injection in PHP?

    【讨论】:

    • 谢谢,它现在工作得更好了,我更改了代码(见编辑),但因此我有一个新的错误消息:警告:mysqli_fetch_array() 期望参数 1 是 mysqli_result。这还不错,因为这意味着实际的搜索正在工作。并感谢注入提示,但首先我需要让它勉强工作;)
    • 看来您只需将while($row = mysqli_fetch_array($searchquery)){ 更改为使用$query 而不是$searchquery
    • 谢谢,一分钟前确实发现了问题,只是使用了错误的变量-.-愚蠢。谢谢你检查这个!!!无论如何,现在我有另一个新问题 -.- 我希望显示所有匹配项。但结果总是只显示索引最高的结果...
    • 不要把print("$output");放在你当前拥有它的末尾,而是把echo $output;放在while循环的最后,在}之前但在这一行之后:$output = "&lt;a href='profile.php?user=$id'&gt;$username&lt;/a&gt;";
    • 伊恩,你太棒了,所以这个问题终于解决了。我想我可以从这里管理它 :) 非常感谢您的帮助先生,我已经为此工作了几个小时!