我创建了一个页面,您可以在其中搜索数据库(PHP,MySQL,JQuery)。 它工作正常,但我有一个我真的不明白的问题。 如果我搜索“abbandonato”它可以正常工作,但如果我搜索“abband”,“abbando”,“abbandon”,“abbandona”(以及字符串的其他部分)它不起作用。返回的错误(警报中的文本)是“SyntaxError:意外的输入结束”。为什么?如果查询找到“abbandonato”,则查询还必须找到字符串的一部分(“abbando”,“abbandon”,......)。 换句话说,我没有这个问题。
以下是代码:
data2.php
$(function() {
// Funzione per l'autocomplete
$("#formSearch").submit(function(e) {
//Annulla default form action
e.preventDefault();
var ricerca= $("#tbSearch").val();
// Se il campo ricerca non è vuoto carico i dati
if ($("#tbSearch").val().length > 0) {
$('#searchResults').html("Caricamento...");
$.ajax({
url: 'data3.php',
method: 'POST',
asynch: false,
data: {
dati: 1,
ricerca:ricerca
}, // Argomenti mandati in POST
dataType: 'json',
success: function(data) {
$('#searchResults').html("Caricamento...");
var stringa = "";
for(var i in data) {
stringa += '<tr><td>' + data[i]['disc'] + '</td>';
stringa += '<td>' + data[i]['frm'] + '</td>';
stringa += '<td>' + data[i]['lex'] + '</td></tr>';
}
$('#searchResults').html(stringa);
},
error: function(xhr, status, error) {
alert(error);
}
});
}
});
});
data3.php
<?php
require('inc/db_connection.php');
$dati = $_POST["dati"];
if($dati == 1) {
// Query
$result = mysql_query("SELECT tab1.disc, tab1.frm, tab2.lex lex
FROM tab1, tab2
WHERE tab1.disc = tab2.disc
AND BINARY LOWER(frm) LIKE BINARY LOWER('" . trim($_POST["ricerca"]) . "%')
LIMIT 0,500");
// Array per AJAX
$array_risultati = array();
if (mysql_error())
echo json_encode(array(mysql_error()));
else {
// Popolazione $array_risultati
while ($row = mysql_fetch_assoc($result)) {
$array_risultati[] = $row;
}
echo json_encode($array_risultati);
}
}
答案 0 :(得分:0)
尝试:
...LOWER(frm) LIKE BINARY CONCAT(LOWER('" . trim($_POST["ricerca"]), '%') . "')...
我认为正在发生的事情是LOWER()
正在转换'%'
并且可能会导致问题。将'%'
移出LOWER()
,看看会发生什么。
答案 1 :(得分:0)
您没有在PHP代码中传递JSON标头。
在json_encode
header('Content-Type: application/json');
答案 2 :(得分:0)
尝试从查询中删除BINARY
并尝试使用
mysql_query("SELECT tab1.disc, tab1.frm, tab2.lex lex
FROM tab1, tab2
WHERE tab1.disc = tab2.disc
AND LOWER(frm) LIKE LOWER('".trim($_POST["ricerca"])."%')
LIMIT 0,500");
可能会BINARY
将%
转换为附加到您的搜索值的其他代码,并生成一些在您的数据库中找不到的其他单词。
供您参考阅读Lesser Known MySQL Performance Tips
如果您需要进行区分大小写的匹配,请将列声明为 BINARY;不要在查询中使用LIKE BINARY来转换非二进制文件 柱。如果你这样做,MySQL就不会使用该列上的任何索引。