所以,让我给你一些信息,我有一个支持数据库的博客系统,数据库拥有文章的标题。现在我已经尝试创建一个“相关新闻”功能,它是相当基本的,它只需要获取现有页面的标题并将其拆分(注意$ row_object_title只是从数据库中提取的标题):< / p>
$row_object_title_lower = strtolower($row_object_title);
$keywords = explode(" ",$row_object_title_lower);
然后我通过我的函数运行它:
exclude_conjuctions($keywords);
该函数的代码(查找某些单词并将其从数组中删除:
function exclude_conjuctions($array){
global $keywords_new;
$keywords_new = $array;
$conjuctions = array("here","to","and","but","or","nor","for");
$counter = count($keywords_new);
foreach($conjuctions as $conjuction){
for($i=0;$i <= $counter;$i++){
if ($keywords_new[$i] == $conjuction){
unset($keywords_new[$i]);
}
}
}
return $keywords_new;
}
所以现在我将构建我的查询以检索标题中包含关键字的所有文章:
$sql = '';
foreach ($keywords_new AS $keyword)
{
if ($sql != '')
$sql .= ' OR ';
$sql .= "object_title LIKE '%$keyword%'";
}
$squery = 'SELECT object_title FROM example_table WHERE '.$sql;
现在。它似乎工作正常,但有时候它会返回一个与当前文章没有相同字词的标题,所以我调查了它,似乎它拾取了部分字并返回它,这当然是不是我们想要的,如果你感到困惑,请看一下这张图片:
请注意我如何搜索“dow”,并在当前标题和检索到的标题中找到这些字母。当然我需要它只返回标题中包含完整单词的相关文章,而不是单词的一部分。我做错了什么人?也许我的MySQL查询需要改变?也许有更好的解决方案?我会喜欢一些帮助。
这是一个你可以想象的问题。
感谢您的帮助。
答案 0 :(得分:2)
尝试LIKE '% {$keyword} %'
此外,您的查询容易受到SQL注入攻击。
How can I prevent SQL injection in PHP?
编辑:更好的方法是使用正则表达式:
REGEXP '[[:<:]]{$keyword}[[:>:]]'
而不是LIKE...
答案 1 :(得分:0)
尝试使用===
运算符代替==
运算符来比较字符串。可以找到一个很好的理由here
此外,您在每边都使用%
打包查询。这表示返回包含这些字符串的所有匹配项。因此&#39; Dow&#39;包含在&#39; Down&#39;并将被退回。您可能希望在%
周围添加空格,以便只获得与您的关键字相同的匹配项。
答案 2 :(得分:0)
你能实施&#34; LIKE&#34;搜索包括前一个和后一个空格?你可能需要有三个条件才能满足句子开头和结尾的单词:
$sql .= "object_title LIKE '% $keyword %' OR LIKE '$keyword %' OR LIKE '% $keyword'";