PHP运行MySQL查询

时间:2014-04-03 10:02:14

标签: php mysql sql-like

所以,让我给你一些信息,我有一个支持数据库的博客系统,数据库拥有文章的标题。现在我已经尝试创建一个“相关新闻”功能,它是相当基本的,它只需要获取现有页面的标题并将其拆分(注意$ 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;

现在。它似乎工作正常,但有时候它会返回一个与当前文章没有相同字词的标题,所以我调查了它,似乎它拾取了部分字并返回它,这当然是不是我们想要的,如果你感到困惑,请看一下这张图片:

http://puu.sh/7UhhW.jpg

请注意我如何搜索“dow”,并在当前标题和检索到的标题中找到这些字母。当然我需要它只返回标题中包含完整单词的相关文章,而不是单词的一部分。我做错了什么人?也许我的MySQL查询需要改变?也许有更好的解决方案?我会喜欢一些帮助。

这是一个你可以想象的问题。

感谢您的帮助。

3 个答案:

答案 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'";