我目前正在进行实时搜索,直接从mysql数据库显示结果。
代码有效,但不是我想要的。
让我们从一个例子开始,以便更容易理解:
我的数据库有5列:
id, link, description, try, keywords
在key up上运行ajax请求的脚本如下:
$("#searchid").keyup(function () {
var searchid = encodeURIComponent($.trim($(this).val()));
var dataString = 'search=' + searchid;
if (searchid != '') {
$.ajax({
type: "POST",
url: "results.php",
data: dataString,
cache: false,
success: function (html) {
$("#result").html(html).show();
}
});
}
return false;
});
});
results.php文件中的如下所示:
if ($db->connect_errno > 0) {
die('Unable to connect to database [' . $db->connect_error . ']');
}
if ($_REQUEST) {
$q = $_REQUEST['search'];
$sql_res = "select link, description, resources, keyword from _db where description like '%$q%' or keyword like '%$q%'";
$result = mysqli_query($db, $sql_res) or die(mysqli_error($db));
if (mysqli_num_rows($result) == 0) {
$display = '<div id="explainMessage" class="explainMessage">Sorry, no results found</div>';
echo $display;
} else {
while ($row = $result->fetch_assoc()) {
$link = $row['link'];
$description = $row['description'];
$keyword = $row['keyword'];
$b_description = '<strong>' . $q . '</strong>';
$b_keyword = '<strong>' . $q . '</strong>';
$final_description = str_ireplace($q, $b_description, $description);
$final_keyword = str_ireplace($q, $b_keyword, $keyword);
$display = '<div class="results" id="dbResults">
<div>
<div class="center"><span class="">Description :</span><span class="displayResult">' . $final_description . '</span></div>
<div class="right"><span class="">Keyword :</span><span class="displayResult">' . $final_keyword . '</span></div>
</div>
<hr>
</div>
</div>';
echo $display;
}
}
}
现在,假设我的数据库中有这一行:
id = 1
link = google.com
description = it's google
totry = 0
keywords: google, test, search
如果我在搜索栏中输入:
google, test
我有正确的结果,但如果我输入:
test, google
我没有结果,显然订单是错误的。 所以基本上,想要实现的东西有点像“标签”,所以我可以搜索正确的关键字而无需使用正确的顺序。
我可以使用我当前的代码(如果是,如何?)或我需要更改某些内容?
提前感谢任何建议。
PS:我知道这不是读取数据库的最佳方式,因为它有一些安全问题,我稍后会改变它,因为这是我很久以前写的旧脚本,我更感兴趣让它正常工作,我将改变方法。答案 0 :(得分:2)
规范您的架构
关系数据库的规则非常简单(至少前三个)。
关键字:google,test,search
......打破了第二条规则。每个关键字都应位于相关表中的自己的行中。然后你可以简单地将你的查询写成....
Bitmap preview = ffmmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
(其中atomize爆炸查询字符串,将mysqli_escape_paramter()应用于每个条目以避免破坏您的代码,将每个术语括在单引号中并连接结果)。
或者你可以使用MySQL's full text indexing透明地为你做这件事。
尽管飓风在他/她的回答中提出了一些好处,但他们没有提到那里提出的解决方案都没有扩展到无法有效处理大量数据(将字段分解为新表/使用全文)索引确实)。
答案 1 :(得分:1)
未经测试的代码,但会根据您的需要进行修改,
$q = $_REQUEST['search'];
$q_comma = explode(",", $q);
$where_in_set = '';
$count = count($q_comma);
foreach( $q_comma as $q)
{
$counter++;
if($counter == $count) {
$where_in_set .= "FIND_IN_SET('$q','keywords')";
}else {
$where_in_set .= "FIND_IN_SET('$q','keywords') OR ";
}
}
$sql_res = "select link, description, resources, keyword from _db where $where_in_set or description like '%$q%'";
答案 2 :(得分:0)
我能想到两种解决方案:
使用全文index and search。
您可以将搜索字符串拆分为php中的单词,例如使用explode()和serach表示不在单个serach条件中的单词,而是单独的单词。后者可能非常耗费资源,因为您在多个领域进行搜索。
答案 3 :(得分:0)
LIKE&#39;%google,test%&#39;将匹配id = 1但不匹配&#39;%google,test%&#39; (昏迷之间没有空格)也没有&#39;%google test%&#39; (空格分隔符)也没有&#39;%test,google%&#39;。将每个关键字作为单独的表格放置,或者您可以将输入关键字拆分为多个单个关键字,并使用OR运算符,例如LIKE&#39; google%&#39;或者像测试%&#39;
答案 4 :(得分:0)
不是理想的解决方案,但您可以将php视为由逗号分隔的关键字数组(使用explode),而不是将搜索数据字符串视为一个元素。然后,您可以根据发送的关键字数量来构建查询。
例如,使用&#34; google,test&#34;您的查询将是:
display: inline
$ q1和$ q2在哪里&#34; google&#34;和&#34;测试&#34;。
答案 5 :(得分:0)
首先,正如你所说这样做不是一个好方法。我想你正在写一个自动完成器。
&#34; google,test&#34;或&#34;测试,谷歌&#34;是一个附加的词。首先,您需要为用户定义分隔符。通常它是一个空格&#39; &#39;
当你定义它时,你需要拆分单词。
$words = explode(" ",$q);
// now you get two words "google," and "test"
然后你需要创建一个sql,为你提供多次搜索机会。
中有很多例子现在你得到了你的结果。
从db中选择所有结果,并在一段时间内从另一个文本中搜索文本。它为您提供了相似性的重点。最好的结果就是你的结果。
重要信息
如果你问我的意见,不要像bcs一样使用它,这是非常昂贵的。在html端使用自动完成工具。这是example