如何使用mysqli和php语法创建搜索引擎

时间:2017-04-29 10:08:50

标签: php html mysqli search-engine

所以,我想创建自己的搜索引擎,通过在搜索框中输入标题来查找数据,并从我的数据库和输出中获取数据,就像用户输入搜索框一样..所以这是我的码: 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>";
                }
              }
            }
    
  2. 然后我总是得到这个结果:

    注意:使用未定义的常量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

    任何人都可以解决这个问题并告诉我为什么我总是遇到这个错误? 提前致谢! :)

2 个答案:

答案 0 :(得分:0)

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

<?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>";
                }
              }
            }
}
         ?>

答案 1 :(得分:0)

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

$_POST[go_t]需要$_POST['go_t']

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

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

if (isset($_POST['go_c']) && $_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%'");

无论用户在搜索过滤器中输入什么内容,这些内容的写入方式都将直接传递到您的数据库中;你需要逃避,或者更好的是,使用准备好的陈述(谷歌将成为你的朋友;查看PDO)。

解决跨站点脚本问题;如果找不到搜索结果,您可以直接将用户的关键字输出到浏览器而不会转义它。如果他们添加了<script>代码或类似代码,则可能会从您的用户那里窃取Cookie,或者更糟糕。

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

我意识到这只是一个小例子,但我要小心不要将这类代码投入生产。