【问题标题】:PHP running MySQL queryPHP 运行 MySQL 查询
【发布时间】:2018-03-17 21:35:57
【问题描述】:

所以让我给你一些信息,我有一个博客系统,它支持数据库,数据库保存文章的标题。现在我尝试创建一个“相关新闻”功能,它相当基本,它只是获取现有页面的标题并将其拆分为这样(注意 $row_object_title 只是从数据库中提取的标题):

$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 查询需要更改?也许有更好的解决方案?希望得到一些帮助。

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

提前感谢您的帮助。

【问题讨论】:

  • 你能把 echo $sql;在 $squery(stuff) 之前并显示完整的查询?
  • @przeqpiciel 当然:选择 object_title FROM webmanage_objects WHERE object_title LIKE '%messaging%' OR object_title LIKE '%service%' OR object_title LIKE '%whatsapp%' OR object_title LIKE '%goes%' OR object_title LIKE '%down%' OR object_title LIKE '%same%' OR object_title LIKE '%day%' OR object_title LIKE '%it%' OR object_title LIKE '%boasts%' OR object_title LIKE '%of%' OR object_title LIKE ' %record%' OR object_title LIKE '%usage%' AND parentid=564 AND is_visible=1 AND archived=0 ORDER BY published_date DESC LIMIT 0,10
  • 如果您将此查询放入 phpmyadmin 会怎样?是你想要的回报吗?在我看来,您应该像这样从表中选择字段(您构建了 OR 的查询)AND (parentid=564 AND is_visible=1 AND archived=0) ORDER BY ... 其他东西

标签: php mysql sql-like


【解决方案1】:

试试LIKE '% {$keyword} %'

您的查询也容易受到 SQL 注入的攻击。

How can I prevent SQL injection in PHP?

编辑:更好的方法是使用正则表达式:

REGEXP '[[:<:]]{$keyword}[[:>:]]'

而不是LIKE...

【讨论】:

  • 我已经知道了,这里需要咨询安全问题。我现在就试试你的建议。
  • 这似乎已经完成了工作,你能解释一下这是如何解决的吗?
  • 他在查找单词之前和之后放置空格,就像搜索以该关键字开头的单词或以该单词结尾的单词 - IMO :)
  • 您的通配符和单词现在用空格分隔。不过,这可能不适用于第一个词和最后一个词。
  • 也许你应该使用正则表达式而不是像语句?
【解决方案2】:

尝试使用=== 运算符而不是== 运算符来比较字符串。一个很好的理由可以找到here

此外,您在每一侧都使用% 包装您的查询。这表示返回包含这些字符串的所有匹配项。因此,“Dow”包含在“Down”中并将被返回。您可能希望在 % 周围添加一个空格,以便仅获得与您的关键字相同的匹配项。

【讨论】:

  • 这不能回答问题
  • 是的,这更适合作为评论,但我确实做出了改变,它没有任何区别。
【解决方案3】:

您能否实现“LIKE”搜索以包括前面和后面的空格?您可能需要满足三个条件才能满足句子开头和结尾的单词:

$sql .= "object_title LIKE '% $keyword %' OR LIKE '$keyword %' OR LIKE '% $keyword'";

【讨论】:

  • 请解释这会有什么不同。
  • 这三个条件允许 $keyword 出现在句子的开头、结尾或中间。因此,根据您的示例,其中: $keyword = "dow" '% $keyword %' 匹配 'sometext dow some more text','$keyword %' 匹配'dow sometext' 和 '% $keyword' 匹配'some text dow'
猜你喜欢
  • 2016-01-03
  • 2012-01-04
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
相关资源
最近更新 更多