所以我试图创建并实现实时搜索功能。这是我的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);
?>
我打电话的脚本:
<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;
适用于代码的HTML的一小部分:
<form role="form" method="post">
<input type="text" class="form-control" id="keyword" placeholder="Enter keyword"></form><ul id="content"></ul>
&#13;
现在,我的脚本没有收到任何数据,至少没有让它发出警告信号(&#34;此处也是#34;)&#34;。但是,第一个&#34;警报(&#34;在这里&#34;)&#34;确实会出现。另外,我知道脚本正在输入search.php,因为我插入到我的数据库中测试它,并且它确实插入了每个keyup。任何想法为什么它不返回任何数据?数据库条目现在有标题,艺术家和ID。
您会在脚本中注意到有一个&#34;关键字&#34;设置被发送。我删除了这个,因为我认为当我只是试图让它发送时(通常关键字将在SQL语句的LIKE部分)是不必要的。然而,这可能导致问题吗?无法看到。
感谢您的帮助。
答案 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
。