【问题标题】:PHP doesn't output error from mysql query for non-existent rows for autocompletePHP不会从mysql查询中输出错误以自动完成不存在的行
【发布时间】:2017-09-05 23:58:18
【问题描述】:

我有一个当前能够根据用户输入自动完成的表单,它查询 MySQL 数据库并成功列出表中所有可能的匹配项并给出建议。现在我想处理不存在的行。我无法让我的 PHP 文件回显错误。这是我目前所拥有的:

我猜我的auto search function 在我的javascript 中main.php 我需要将错误消息返回到页面吗?

搜索.php

<?php
//database configuration
$host = 'user';
$username = 'user';
$password = 'pwd';
$name = 'name';

 //connect with the database
$dbConnection = new mysqli($host,$username,$password,$name);


if(isset($_GET['term'])){
            //get search term
    $searchTerm = '%'.$_GET['term'].'%';

    //get matched data from skills table
    if($query = $dbConnection->prepare("SELECT * FROM nametbl WHERE name LIKE ? ORDER BY name ASC")) {

        $query->bind_param("s", $searchTerm);
        $query->execute();
        $result = $query->get_result();

        //$row_cnt = $result->num_rows;
        //echo $row_cnt;
        if($result -> num_rows){
            while ($row = $result->fetch_assoc()) {
                $data[] = $row['name'];
            }

            //return json data
            echo json_encode($data);
            mysqli_close($dbConnection);
        }
        else { echo '<pre>' . "there are no rows." . '</pre>'; }
    }
    else {
        echo '<pre>' . "something went wrong when trying to connect to the database." . '</pre>';
    }


}
?>

main.php

<div id="gatewayInput">
<form method="post">
      <input type="text" id="name" name="name" placeholder="Name..."><br><br>
      <?php 
        include("search.php"); 
      ?>    
</div>

...
...
...

<script src ="../../../jqueryDir/jquery-3.2.1.min.js"></script>
<script src ="../../../jqueryDir/jquery-ui.min.js"></script>
<script type="text/javascript">

//auto search function
$(function() {
      $( "#name" ).autocomplete({
          source: 'search.php'
      });
});

【问题讨论】:

  • 您的代码易受 SQL 注入攻击,您需要修复此问题。
  • @Enstage 我的代码在哪里容易受到 SQL 注入的影响,如何做到这一点?
  • 不返回结果的查询不是失败。您的 $query 变量将包含一个结果对象,除非您的查询实际上产生某种错误(如语法错误)
  • @PatrickEvans 我明白你的意思。让我尝试使用下面 Chris 建议的 num 行。
  • 现在您应该检查$query 是否有错误,LIKE 语句的语法错误。您的$searchTerm 变量应包含%,即$searchTerm = '%'.$_GET['term'].'%'。并在查询中有LIKE ?

标签: javascript php jquery mysqli


【解决方案1】:

1.您的方法类型在表单中发布 在 main.php 中

在 search.php 中,您使用了“if(isset($_GET['term'])){”

我猜这需要修复。两者都需要是 POST 或 GET。

  1. 您再次使用包含方法,search.php 中的整个代码将被内嵌并被视为一个文件 main.php。所以你不需要使用 GET 或 Post 方法。
  2. get 和 Post 方法的工作原理是 3.1)你有一个从浏览器(main.php)提交数据的html或PHP,并且这个请求由一个动作类(search.php)提供服务

示例:- 在 main.php 中 3.2) 现在在 search.php 中你可以使用类似 if(isset($_POST['term'])){

【讨论】:

  • 能否请您完成您的示例。我读到一半就被截断了:(
【解决方案2】:

您可以使用num_rows(例如if ($result -&gt; num_rows))查看查询是否返回任何内容。

【讨论】:

  • 是的,对于不存在的行,我的数字行不会向我的页面返回任何内容。当我在我的字段中添加$row_cnt = $db-&gt;num_rows; 时,它会在我输入字段时停止自动提示。当我删除时,就像自动建议一样再次工作......奇怪
  • 不存储$row_cnt,为什么不直接放入一个子句在没有结果时通知用户呢?例如:if($result -&gt; num_rows) {while (...) {...}} else { // Notify user that there are no suggestions available }
  • 好的,我更新了我的代码。我的代码适用于现有表,但是,对于不存在的表,我应该在哪里看到错误?我在页面上的任何地方都没有看到它,也没有在控制台中看到它。是因为我在 search.php 中使用 GET,这就是为什么它无法将回显发送回 main.php?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多