【问题标题】:how to create search engine with mysqli and php syntax如何使用 mysqli 和 php 语法创建搜索引擎
【发布时间】:2017-04-29 18:24:44
【问题描述】:

所以,我想制作自己的搜索引擎,通过在搜索框上键入标题来查找数据,并从我的数据库和输出中获取数据,就像用户在搜索框中输入的内容一样......所以这是我的代码: 1. HTML 代码(搜索框)

<form id="hform-search" class="hform-search" method="post" action="">
        <input id="search-box" class="form-control" type="text" placeholder=" I want to learn.." name="keyword" autocomplete="off" autofocus="" />
        <div id="suggesstion-box"></div>
        <input type="submit" class="btn btn-default f-tutorials" name="go_t" value="Find Tutorials" />
        <input type="submit" class="btn btn-default f-course" name="go_c" value="Find Courses" />
        <p class="hero-subtitle"><em>"Let us help you to involve"</em> </p>
        </div>

</form>
  1. PHP 代码

        $conn = mysqli_connect("localhost","root","","neurorial");
          if ($_POST[go_t] == 'Find Tutorials') {
            $keyword_t = $_POST[keyword];
            $find_t = mysqli_query($conn, "SELECT * FROM search WHERE video_tutorial LIKE '%$keyword_t%' ");
            $check_t = mysqli_num_rows($find_t);
            if ($check_t == 0) {
              echo 'sorry the video with this " $keyword_t " keyword is not found';
            }else {
              while ($rows_t=mysqli_fetch_array($find_t) ) {
                echo "$rows_t[video_tutorial]<br>";
              }
            }
          }
    
          if ($_POST['go_c'] == 'Find Courses') {
            global $conn;
            $keyword_c = $_POST['keyword'];
            $find_c = mysqli_query($conn, "SELECT * FROM search WHERE course LIKE '%$keyword_c%'");
            $check_c = mysqli_num_rows($find_c);
            if ($check_c == 0) {
            echo "maaf pencarian Course dengan keyword $keyword_c tidak di temukan";
              }else {
                while ($find_c = mysqli_fetch_array($find_c) ) {
                  echo "$find_c[course]<br>";
                }
              }
            }
    

然后我总是得到这个结果:

注意:使用未定义的常量 go_t - 在第 87 行的 D:\KAMPUS\Server\htdocs\PW\Neuro.inc\index.php 中假定为“go_t”

注意:未定义索引:第 87 行 D:\KAMPUS\Server\htdocs\PW\Neuro.inc\index.php 中的 go_t

注意:未定义的索引:第 100 行 D:\KAMPUS\Server\htdocs\PW\Neuro.inc\index.php 中的 go_c

谁能解决这个问题并告诉我为什么我总是得到这个错误? 提前致谢! :)

【问题讨论】:

    标签: php html mysqli search-engine


    【解决方案1】:

    这是因为你的代码也在提交表单之前执行

    <?php
    if ($_POST){ //<------------ Add this condition
            $conn = mysqli_connect("localhost","root","","neurorial");
              if ($_POST['go_t'] == 'Find Tutorials') { //<---------------- change here
                $keyword_t = $_POST[keyword];
                $find_t = mysqli_query($conn, "SELECT * FROM search WHERE video_tutorial LIKE '%$keyword_t%' ");
                $check_t = mysqli_num_rows($find_t);
                if ($check_t == 0) {
                  echo 'sorry the video with this " $keyword_t " keyword is not found';
                }else {
                  while ($rows_t=mysqli_fetch_array($find_t) ) {
                    echo "$rows_t[video_tutorial]<br>";
                  }
                }
              }
    
              if ($_POST['go_c'] == 'Find Courses') {
                global $conn;
                $keyword_c = $_POST['keyword'];
                $find_c = mysqli_query($conn, "SELECT * FROM search WHERE course LIKE '%$keyword_c%'");
                $check_c = mysqli_num_rows($find_c);
                if ($check_c == 0) {
                echo "maaf pencarian Course dengan keyword $keyword_c tidak di temukan";
                  }else {
                    while ($find_c = mysqli_fetch_array($find_c) ) {
                      echo "$find_c[course]<br>";
                    }
                  }
                }
    }
             ?>
    

    【讨论】:

    • 谢谢,所以当我复制粘贴你的代码时,如果单击 go_t,我会收到此错误:注意:使用未定义的常量关键字 - 在 D:\KAMPUS\Server\htdocs\PW 中假设为“关键字”第 89 行的 \Neuro.inc\index.php 抱歉,找不到带有此阿富汗关键字的视频 注意:未定义的索引:第 101 行 D:\KAMPUS\Server\htdocs\PW\Neuro.inc\index.php 中的 go_c
    • 如果我点击 go_c 按钮,我得到了这个: 注意:未定义的索引:D:\KAMPUS\Server\htdocs\PW\Neuro.inc\index.php 中的 go_t 在线 88 maaf pencarian Course dengan 关键字阿富汗 tidak di temukan
    • 为什么你有 2 个提交在同一个表单上?
    • 如果在同一个表单上,点击后是否生效?那么如何在同一行使用两个提交来扫描搜索框并从数据库中获取数据?
    【解决方案2】:

    您收到了您提到的特定错误,因为您没有在 PHP 代码的第二行引用 go_t

    $_POST[go_t] 必须是 $_POST['go_t']

    您还应该检查以确保在数组中也设置了键 - 这使得您的 if 语句如下所示:

    if (isset($_POST['go_t']) &amp;&amp; $_POST['go_t'] == 'Find Tutorials') {

    if (isset($_POST['go_c']) &amp;&amp; $_POST['go_c'] == 'Find Courses') {

    正如@b-desai 还指出的那样,您也可以添加if ($_POST) 条件;但这只是意味着除非请求通过 POST 进来,否则代码根本不会运行。

    就目前而言,您的代码存在一些非常严重的缺陷,这些缺陷会在以后再次困扰您。最重要的是,它受到 SQL 注入、跨站点脚本 (XSS) 和 CSRF 的影响。最后一点,这里就不说了,大家自己研究一下吧。

    为了解决 SQL 注入问题 - 永远不要在 SQL 查询中使用插值字符串,就像您在这些行中所做的那样:

    $find_t = mysqli_query($conn, "SELECT * FROM search WHERE video_tutorial LIKE '%$keyword_t%' ");

    $find_c = mysqli_query($conn, "SELECT * FROM search WHERE course LIKE '%$keyword_c%'");

    这些内容的编写方式,无论用户在您的搜索过滤器中输入什么,都将直接传递到您的数据库中;您需要避免这种情况,或者更好的是,使用准备好的语句(Google 将成为您的朋友;查找 PDO)。

    解决跨站脚本问题;如果没有找到搜索结果,则将用户的关键字直接输出到浏览器而不转义。如果他们添加了&lt;script&gt; 标签或类似标签,他们可能会从您的用户那里窃取 cookie,或者更糟。

    您应该始终确保转义所有输出,并始终假设您的用户是恶意的 - 其中一些是恶意的。

    我知道这只是一个小例子,但我会警告不要将此类代码投入生产。

    【讨论】:

    • 谢谢先生,那么让我的搜索引擎安全和工作的最佳解决方案是什么?当用户在搜索框上键入并单击其中一个按钮时,他们将重定向到与他们想要搜索的内容相同的类别页面(例如,如果他们单击 go_c 按钮,他们将重定向到课程页面),我希望回答欢呼:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多