Php 显示通过搜索查询找到的列

Php 显示通过搜索查询找到的列,php,mysql,search,Php,Mysql,Search,我有一段简单的代码,它从我的一个数据库表中的所有行中搜索三列。表名是“articles”,我搜索的3列是“Title、Description和Tags”。当我搜索一个单词或短语时,它会向我显示结果,我想知道的是,是否有一种方法可以让我显示在3列中找到的结果。我是否必须对结果返回的每一行运行单独的查询,还是有更简单的方法?我在下面包含了一段代码 $query = $_GET['q']; $sql = "SELECT * FROM articles WHERE (`title` LIKE '%".$

我有一段简单的代码,它从我的一个数据库表中的所有行中搜索三列。表名是“articles”,我搜索的3列是“Title、Description和Tags”。当我搜索一个单词或短语时,它会向我显示结果,我想知道的是,是否有一种方法可以让我显示在3列中找到的结果。我是否必须对结果返回的每一行运行单独的查询,还是有更简单的方法?我在下面包含了一段代码

$query = $_GET['q'];
$sql = "SELECT * FROM articles WHERE (`title` LIKE '%".$query."%') OR (`description` LIKE '%".$query."%') OR (`tags` LIKE '%".$query."%') ORDER BY dateadded";
$query = $db->query($sql);
while($row = $query->fetch_assoc()) {
display 
} 

快速修复方法是使用您的条件选择一些附加列:

SELECT *,
  IF(`title` LIKE '%".$query."%',       1, 0)  AS conditionTitle,
  IF(`description` LIKE '%".$query."%', 1, 0)  AS conditionDescription,
  IF(`tags` LIKE '%".$query."%',        1, 0)  AS conditionTags
FROM articles 
WHERE (`title` LIKE '%".$query."%')
  OR (`description` LIKE '%".$query."%')
  OR (`tags` LIKE '%".$query."%') 
ORDER BY dateadded";
现在,您可以检查每行中这些附加列的值,以检查是否在该特定字段中找到了
$query


请注意,您应该使用准备好的语句,因为现在您可能有sql注入问题。

另一种方法是在选择列表中测试表达式中的条件

我认为最简单的解释方法是举例说明。但出于良心,我不能发布易受SQL注入攻击的示例代码

当前查询:

 SELECT a.*
   FROM articles
  WHERE a.`title`       LIKE CONCAT('%', ? ,'%')
     OR a.`description` LIKE CONCAT('%', ? ,'%')
     OR a.`tags`        LIKE CONCAT('%', ? ,'%')
  ORDER
     BY a.dateadded
对于当前查询,我们可以将表达式添加到选择列表中。例如:

 SELECT IF( a.`title`       LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_title 
      , IF( a.`description` LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_description
      , IF( a.`tags`        LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_tags
      , a.*
   FROM articles
  WHERE a.`title`       LIKE CONCAT('%', ? ,'%')
     OR a.`description` LIKE CONCAT('%', ? ,'%')
     OR a.`tags`        LIKE CONCAT('%', ? ,'%')
  ORDER
     BY a.dateadded
对于返回的每一行,将计算选择列表中的表达式。条件测试(
LIKE
comparison)评估为真、假或空。MySQL
IF
函数将第一个参数计算为布尔值,如果为真,则返回第二个参数,elise返回第三个参数

在本例中,如果存在匹配项,表达式将返回
1
。否则,它将返回一个
0
。对于我们可以返回的值,还有很多其他选择。我们还可以将这些条件组合到一个表达式中,以返回一个值

有很多可能的表达式可以包含条件测试。我刚刚使用了MySQL
IF
函数。更符合ANSI标准的表达式可以使用
大小写
,例如

 SELECT CASE WHEN a.`title`       LIKE CONCAT('%', ? ,'%') 
             THEN 1
             ELSE 0
        END AS match_in_title

这样的办法应该行得通。 使用名为search_articles和UNION ALL的已传递表将SELECT查询组合在一起

SELECT
  search_column
, *
FROM (
  SELECT
   'title' AS search_column
   , *
  FROM
   artices
  WHERE
   title LIKE '%query%'

  UNION ALL 

  SELECT
   'description' AS search_column
   , *
  FROM
   artices
  WHERE
   description LIKE '%query%' 

  UNION ALL 

  SELECT
   'tags' AS search_column
   , *
  FROM
   artices
  WHERE
   tags LIKE '%query%'  
)
 AS
   search_articles

一个名为tags的列的出现通常是设计不佳的症状。你可以使用UNION来解决你的问题。是的,我知道列名并不完美。我重新命名了它们,使事情变得简单,这样问我的问题就更容易了。我还需要进一步研究一下你的代码,因为我不确定它在做什么。哈哈,当谈到php和mysql的时候,我还是个新手,试着一天一天教自己所有这些东西,但这是我一定会研究的建议@Born2DoubleUp您将在找到的每一行中增加3列,这些列的值为
yep
nope
(1和0当然很方便…)。只需在例如phpMyAdmin中运行它即可查看结果。@Born2DoubleUp我已切换到整数输出,以便于检查。请注意,此查询可能会多次从
文章中返回同一行。例如,如果
标记
标题
上的行“匹配”@spencer7593 true,则主题启动程序应在所有联合后删除关键字ALL以删除重复项使用
联合
代替
联合所有
实际上并不能解决这一问题,因为
搜索列
返回的值在查询之间是不同的,
'title'
'tags'
。唯一排序操作将保留两行。