使用php数组搜索mysql LIKE

时间:2014-03-13 12:06:06

标签: php mysql arrays sql-like

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

id | name             | category

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

当在网站上显示数据时,我只需使用存储在PHP数组中的值转换类别的数字:

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

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

在这里发现,在这些论坛中,一个导致:内部隐藏查询,但我无法将其拉出来。

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

我的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'

非常感谢!

此致 格雷格

3 个答案:

答案 0 :(得分:0)

在查询之前,在php中:

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

然后在你的查询中:

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

请注意,这不会充当MySQL“LIKE”,只有在您不输入完整类别时才会有效。

答案 1 :(得分:0)

如果您要使用implode()进行SQL查询,

IN (comma-separated-list)将是一个很好的解决方案,但由于您使用的是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'

答案 2 :(得分:0)

  

我也需要搜索类别,并且类别存储在   DB作为数字。因此,我需要翻译搜索字符串   例如,一个数字。电气成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语句将其合并到您的查询中即可。