【问题标题】:Imploding an array into a MySQL query将数组内爆到 MySQL 查询中
【发布时间】:2014-04-01 15:04:52
【问题描述】:

所以我有一个博客系统,我想为“相关新闻”建立一个部分,我不是在制作“标签”系统,而只是简单地搜索和存储文章的当前标题(从database) 并展开它以便以后能够将所有单词放入查询中,以后的查询将搜索数据库中的所有标题以找到这些单词中的任何一个,如果找到,它将返回标题列表。以下是相关代码:

// note to stackoverflow peeps, $row_object_title is just the title that is pulled form the database
$row_object_title_lower = strtolower($row_object_title);
$keywords = explode(" ",$row_object_title_lower);

稍后在页面上运行的代码:

$keywords_imploded = implode("','",$keywords);
$myquery = sql_query("SELECT object_title FROM table WHERE object_title IN ('$keywords_imploded')

现在我尝试通过打印标题来列出标题,但没有显示任何内容。

我确定数据库中有匹配的标题。

谢谢

【问题讨论】:

  • 是的,在你制造出严重的噩梦injection hole之前,你会想要添加一些SQL escaping
  • 回显 $myquery 以判断出了什么问题
  • @Askanison4 显示:资源 id #17
  • 您需要回显查询字符串,例如$sql = "SELECT ...",您正在回显查询 RESULT。
  • IN 子句将在右侧的值列表中查找左侧的内容。例如: WHERE id IN (2,3,5) - 如果 id 在该列表中,它将返回 true。在你的情况下,情况正好相反。您可能必须使用以下几个来构建查询: object_title LIKE %keyword%

标签: php mysql explode implode


【解决方案1】:

您的关键字数组是通过以下方式生成的:

$keywords = explode(" ",$row_object_title_lower);

如果您有“我的超级博客文章”之类的标题怎么办?你会得到:

$keywords = array( "My", "Super", "Blog", "Post" );

稍后,您使用这些内爆的值进行查询:

$keywords_imploded = implode("','",$keywords);
$myquery = sql_query("SELECT object_title FROM table WHERE object_title IN ('$keywords_imploded')

SELECT 查询将如下所示:

SELECT object_title FROM table WHERE object_title IN ( 'My', 'Super', 'Blog', 'Post' );

我认为这不会找到任何东西。

你需要重新评估你是如何处理标题列表的(我认为这就是你想要的,对吧?)。

【讨论】:

    【解决方案2】:

    您似乎误解了 IN 子句的工作原理。

    IN 子句将在右侧的值列表中查找左侧的内容。例如: WHERE id IN (2,3,5) - 如果 id 在该列表中,它将返回 true。你的情况正好相反。

    这样的东西应该可以满足您的需求,但可能会有更好的选择。

    $sql = '';
    foreach ($keywords AS $keyword)
    {
        if ($sql != '')
            $sql .= ' OR ';
    
        $sql .= "object_title LIKE '%$keyword%'";
    }
    
    $query = 'SELECT object_title FROM table WHERE '.$sql;
    

    % 是通配符。

    请记住先转义值。

    【讨论】:

      【解决方案3】:

      试试:

      $keywords_imploded = join("','", $keywords);
      $myquery = sql_query("SELECT object_title FROM table WHERE object_title IN ($keywords_imploded)
      

      【讨论】:

      • IN('$keywords_imploded') -- 如果你使用 implode 而没有像 OP 中的两个倒逗号,这会中断
      • 我希望我能对你投反对票,这仅适用于整数,字符串需要两个引号。
      • 如果我错了,请纠正我,所以你所做的只是用“join()”替换 implode ???你确实意识到 join 只是 implode 的别名
      • 它是...我在收件箱中收到了一条消息。单击它,看到它被标记为已接受。 5 秒后它消失了……
      • @superphonic 哈哈谢谢,至少我知道我没有在那里失去理智:p
      猜你喜欢
      • 1970-01-01
      • 2020-08-28
      • 2013-08-23
      • 1970-01-01
      • 2012-07-20
      • 2016-03-05
      • 2014-01-18
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多