【问题标题】:search mysql LIKE using php array使用 php 数组搜索 mysql LIKE
【发布时间】:2014-03-13 12:06:06
【问题描述】:

我有一个只有几列的小表,其中之一是将有关类别的信息存储为 INT(只是一个简单的数字),例如。

id | name             | category

11 | one file         | 1
15 | some other file  | 2

当在整个站点显示数据时,我只是将类别的数字转换为存储在 PHP 数组中的值:

$swm_array = array(
 '1' => 'Electrical',
 '2' => 'HVAC',
 '3' => 'Plumbing',
);

使用 LIKE 运算符搜索表格时,如果我输入一个数字,我可以很容易地找到类别。我需要的是实际输入类别的值,而不是它的键,然后根据表中的条目找到它。我一直在尝试使用完全奇怪的东西将数组包含在搜索中,但没有成功。

在这里,在这些论坛中找到一条线索:在查询中内爆,但我无法提取它。

如果你们能在这里帮助我,我将永远感激不尽:)

我的 SQL 查询:

SELECT DISTINCT
    `swm_id`,
    `name`,
    `desc1`,
    `category`,
    `file`
FROM
    `swims`

WHERE
  (
       `name` LIKE '%".$q."%'
    OR `desc1` LIKE '%".$q."%'
    OR `file` LIKE '%".$q."%'
    OR `swm_id` LIKE '%".$q."%'
    **OR `category` LIKE '%".$q."%'**
  )
  AND `active` = '1'

非常感谢!

问候, 格雷格

【问题讨论】:

  • 我建议您使用另一个表来存储由您正在使用的类别编号键入并包含类别名称的类别。然后你可以将你的游泳表加入到这个类别表中,并从那里检查类别名称。

标签: php mysql arrays sql-like


【解决方案1】:

在查询之前,在 php 中:

$r = array_search($q, $swm_array);

然后在您的查询中:

**OR `category` = '".$r."'**

请注意,这不会像 MySQL “LIKE”一样,只有在您不输入完整类别时才会起作用。

【讨论】:

    【解决方案2】:

    如果您打算使用IN (comma-separated-list) 进行 SQL 查询,implode() 将是一个很好的解决方案,但由于您使用的是 LIKE,所以这不起作用。

    像这里的解决方案这样的 REGEX 可以工作:MySQL LIKE IN()?

    但是你已经在一个数组中拥有了你需要的东西;不妨遍历它并创建您的查询:

    $sqlLikes = " 1=1 ";
    foreach($swm_array as $swm) {
      $sqlLikes .= " OR  `name` LIKE '%".$swm."%'
        OR `desc1` LIKE '%".$swm."%'
        OR `file` LIKE '%".$swm."%'
        " ;
    }
    

    这会给你这样的 $sqlLikes:https://eval.in/119441

    string(338) " 1=1 OR  `name` LIKE '%Electrical%'
            OR `desc1` LIKE '%Electrical%'
            OR `file` LIKE '%Electrical%'
            OR  `name` LIKE '%HVAC%'
            OR `desc1` LIKE '%HVAC%'
            OR `file` LIKE '%HVAC%'
            OR  `name` LIKE '%Plumbing%'
            OR `desc1` LIKE '%Plumbing%'
            OR `file` LIKE '%Plumbing%'
            "
    

    那么你可以:

    SELECT DISTINCT
        `swm_id`,
        `name`,
        `desc1`,
        `category`,
        `file`
    FROM
        `swims`
    
    WHERE
      (
          $sqlLikes
      )
      AND `active` = '1'
    

    【讨论】:

    • 您好,感谢您的意见!问题是我还需要搜索类别,并且类别作为数字存储在数据库中。因此,我需要将搜索字符串转换为数字,例如。 Electric into 1, HVAC into 2, Plumbing into 3 etc. 我不知道如何在搜索中使用阵列,更多!我现在什至不知道这是否可能。谢谢!
    【解决方案3】:

    我也需要搜索Category,Category存储在 数据库作为一个数字。因此,我需要翻译搜索字符串 成一个数字,例如。电进1,暖通进2,水暖进3等等。

    推荐的方法是创建一个类别表,并将您在此处列出的表的category 条目设为该表的外键。这样您就可以连接这两个表并从类别表中搜索name 属性。

    除此之外,您可以创建数组的反向映射。获取原始数组:

    $swm_array = array(
     '1' => 'Electrical',
     '2' => 'HVAC',
     '3' => 'Plumbing',
    );
    

    你可以翻转它,这样你就有一个反向地图。

    $swm_flipped_map = array_flip($swm_array);
    

    这将创建:

    [
        'Electrical' => '1',
        'HVAC' => '2',
        'Plumbing' => '3',
    ]
    

    通过这种方式,您可以返回与该类别关联的数字,就像您通过键在任何数组中查找项目一样。如:

    $electrical_num = $swm_flipped_map['Electrical'];
    

    这将返回 '1'。只需使用您已经熟悉的 WHEREOR 语句将其合并到您的查询中即可。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2015-05-27
      • 2011-04-09
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多