【问题标题】:PHP: search comma separated string in mysql?PHP:在mysql中搜索逗号分隔的字符串?
【发布时间】:2016-06-11 14:23:41
【问题描述】:

我有一个 mysql 查询,它只是查看 mysql 以查找 LIKE 字符串并显示结果。

在同一个 mysql 查询中,我有 2 个LIKE

1 始终是单个字符串,另一个可以是单个字符串,有时也可以是多个字符串,以逗号分隔。

当我使用我的代码时,即使我在 mysql 数据库中拥有所有字段并且我在列中也拥有所有搜索字符串,但我根本没有得到任何结果。

这是我的代码:

$area = 'London';
$res = 'santandar, HSBC, RBS, ';
$sql = "SELECT * FROM banks WHERE location LIKE '%$area%' AND name LIKE '%$res'";

我也用 preg_match 尝试过,它没有返回任何东西:

$sql = "SELECT * FROM banks WHERE location LIKE '%$area%' AND name LIKE '".preg_match($res)."'";

如果我删除第二个 LIKE 并且我的代码如下所示,它就可以正常工作:

sql = "SELECT * FROM banks WHERE location LIKE '%$area%'";

所以当我尝试使用逗号分隔的字符串进行搜索时,问题就开始了。

有人可以就这个问题提出建议吗?

编辑:

PHP 变量是 POSTS,因此它们可以是每个帖子中的任何内容。

他们是这样的:

$area = $_POST['area'];
$res = $_POST['res'];

【问题讨论】:

  • 看起来你想要一个 LIKE IN / CONTAINS 语句,例如名称 LIKE IN ('%sandar%', '%HSBC%', '%RBS%')。在 mysql AF​​AIK 中不可能。
  • 向我们展示一些包含您认为应该匹配的数据的示例记录。
  • 您是在创建 $res 代码级别。如果是这样,您可以尝试in 之类的.. name in (".$res.")";
  • @Iftikhar,php 变量 $res 和 $area 都是 PHP POST。我只是用这些字符串向你们展示了它们发布后的样子。

标签: php mysql


【解决方案1】:

您应该使用OR 条件:

 $res_array  = explode(',' $res)

 $num_elem= count($res_array)  // with this value you can build dinamically the query 

"SELECT * FROM banks WHERE location LIKE '%$area%' 
 AND ( name LIKE concat('%', $res_array[0]), 
     OR  LIKE concat('%', $res_array[1]) 
     OR  LIKE concat('%', $res_array[2]) ";

【讨论】:

  • hmm... 但只有在我们知道字符串的情况下才有用。字符串是 PHP 帖子...因此,它们在每个帖子上可能不同。
  • 我已经用一个建议更新了答案..如果您通过邮寄方式接收字符串,您会在数组中分解字符串并动态构建查询
  • 只有在您知道我们将在帖子中获得多少字符串的情况下,您的第二次编辑才有用。正如我所说,我们永远不知道我们在帖子中得到了什么。它可以是 1 也可以是多个(没有设定数量/数量)。
  • 我已经更新,然后回答管理您收到的字符串并纠正错别字的建议
  • 这行不通,因为在 OP 中您可以看到末尾有一个额外的逗号,而且逗号周围有空格,因此您将搜索“”,如以及“汇丰银行”。
【解决方案2】:

您需要将其拆分为单独的 LIKEs 和 OR,例如:

...WHERE location LIKE '%{$area}' AND (name LIKE '%{$name1}%' OR name LIKE '%{$name2}' OR ...)

您可以使用一些 PHP 逻辑相当简单地编写此代码:

function build_like_or( $values, $field_name ) {
    // Create an array from the comma-separated values
    $names = explode( ',', $values );
    // Trim all the elements to remove whitespaces
    $names = array_map( 'trim', $names );
    // Remove empty elements
    $names = array_filter( $names );
    $where = array();
    // Loop over each, placing the "LIKE" clause into an array
    foreach( (array)$names AS $name ) {
        $where[] = "{$field_name} LIKE '%{$name}%'";
    }

    // Glue up the LIKE clauses.
    $where = '(' . implode(' OR ', $where) . ')';
    // Results will be something like:
    // $where = "(name LIKE '%santadar%' OR name LIKE '%HSBC%')"
    return $where;
}

用法:

$area = 'London';
$res = 'santandar, HSBC, RBS, ';
$name_where = build_like_or( $res, 'name');
$sql = "SELECT * FROM banks WHERE location LIKE '%$area%' AND {$name_where}";
// echo $sql outputs "SELECT * FROM banks WHERE location LIKE 'London' AND (name LIKE '%santadar%' OR name LIKE '%HSBC%' OR name LIKE '%RBS%')

【讨论】:

  • 谢谢.. $names 是什么,它从何而来?
  • 另外,$values、$field_name 是什么?它们来自哪里?
  • 参见“使用”示例。 build_like_or 是一个可以传入参数的函数。该函数接受两个参数:$values(在您的情况下为$res 字符串)和$field_name(在您的情况下为$name 字符串)。这允许您根据需要随时调用它,并根据需要使用尽可能多的不同字段或字段名称。
  • 有关您的问题的更多信息(关于$names 及其来源等),请参阅这篇文章:tutorialspoint.com/php/php_functions.htm
  • @Jackson - 我已经对其进行了测试,它运行良好,完全一样。很抱歉您不了解函数的工作原理,但这段代码完全正确,并且完全符合您的要求。 任何编写 PHP 函数的人实际上都会明白 $values 和 $field_name 的来源。你读过我链接的文章吗?我在这个答案中没有足够的空间来提供有关函数如何工作的完整教程。
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多