json_encode()不会将数据发送回AJAX调用

时间:2016-05-11 05:25:23

标签: php jquery ajax mysqli

所以我试图创建并实现实时搜索功能。这是我的PHP代码。

<?php

ini_set('display_errors', 1);
error_reporting(~0);

define('DB_USER', '*****');
define('DB_PASSWORD', '*****');
define('DB_SERVER', 'localhost');
define('DB_NAME', 'MUSIC');
if (!$db = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME)) {
    die($db->connect_errno.' - '.$db->connect_error);
}

$arr = array();
    $sql = "SELECT * FROM main WHERE titles LIKE '%%'";
    $result = $db->query($sql) or die($mysqli->error);
    if ($result->num_rows > 0) {
        while ($obj = $result->fetch_object()) {
            $arr[] = array('title' => $obj->titles);
        }
    }

echo json_encode($arr);
?>

我打电话的脚本:

&#13;
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
    $('#keyword').on('input', function() {
    	var searchKeyword = $(this).val();
    	if (searchKeyword.length >= 3) {
    		$.post('search.php', { keywords: searchKeyword }, function(data) {
    			alert("Here");
    			$('ul#content').empty()
    			$.each(data, function() {
    				alert("Here as well");
    				$('ul#content').append('<li><a href="example.php?id=' + this.id + '">' + this.title + '</a></li>');
    			});
    		}, "json");
    	}
        });
    });
    </script>
&#13;
&#13;
&#13;

适用于代码的HTML的一小部分:

&#13;
&#13;
<form role="form" method="post">
     <input type="text" class="form-control" id="keyword" placeholder="Enter keyword"></form><ul id="content"></ul>
&#13;
&#13;
&#13;

现在,我的脚本没有收到任何数据,至少没有让它发出警告信号(&#34;此处也是#34;)&#34;。但是,第一个&#34;警报(&#34;在这里&#34;)&#34;确实会出现。另外,我知道脚本正在输入search.php,因为我插入到我的数据库中测试它,并且它确实插入了每个keyup。任何想法为什么它不返回任何数据?数据库条目现在有标题,艺术家和ID。

您会在脚本中注意到有一个&#34;关键字&#34;设置被发送。我删除了这个,因为我认为当我只是试图让它发送时(通常关键字将在SQL语句的LIKE部分)是不必要的。然而,这可能导致问题吗?无法看到。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先,永远不要使用or die(),特别是使用mysqli构造函数(提示:永远不会是假的)。

其次,如果遇到错误,您应该以外部消费者(例如您的JS应用程序)可以理解发生错误的方式进行响应。

第三,使用带参数绑定的预准备语句。这应该不言而喻。

<?php

// these should really be set in your environment's php.ini
ini_set('display_errors', 'On');
error_reporting(E_ALL);

// set mysqli to throw exceptions
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $db = new mysqli('localhost', '*****', '*****', 'MUSIC');
    $stmt = $db->prepare("SELECT `id`, `titles` from `main` WHERE `titles` LIKE CONCAT('%', ?, '%')");
    $stmt->bind_param('s', $_POST['keywords']);
    $stmt->execute();
    $stmt->bind_result($id, $titles);

    $response = [];
    while($stmt->fetch()) {
        $response[] = ['id' => $id, 'title' => $titles];
    }
    $stmt->close();

    header('Content-type: application/json');
    echo json_encode($response);
    exit;
} catch (Exception $e) {
    http_response_code(500);
    echo $e;
}

当然,如果您的查询不包含任何结果,那么您的JS $.each将不会迭代任何内容。您需要通过选中data.length来处理客户端这样的案例。

在我看来,您应该尝试FULLTEXT索引和MATCH查询,而不是LIKE