【问题标题】:PHP SQL Match like value from arrayPHP SQL匹配数组中的值
【发布时间】:2018-07-23 17:15:41
【问题描述】:

所以我正在使用 PHP 和 SQL (PDO) 编写一个查询,该查询将从一组复选框 (names[]) 中获取值,例如有人可以提交值“Bob”、“John”和“Bill " 我想将它们与数据库中的一列相匹配。

问题:数据库是从使用多年的 Excel 电子表格导入的,我匹配的列没有设置格式,数据库中存储的一些值示例可能如下所示:

"Bill & Bob"
Bill
John and Bill
"Bill"
John, Bill, and Bob
John will perform the task

如您所见,我需要使用 Like %value% 来匹配值,因为发布请求将只发送 Bill、John 和 Bob。我的问题是如何处理传递的数组,因为它可能只是 John,也可能是 2 或全部 3,但你不能使用像 WHERE column LIKE in(array) 这样的东西,对吗?我最好的选择是为每个名称运行一次查询并将结果附加到单个数组吗?我知道我可以做出某种动态声明,例如:

WHERE column LIKE '%Bob%' OR
 column LIKE '%John%' OR
 column LIKE '%Bill%';

我这样做的问题是,如果输入不正确,上述方法容易受到 SQL 注入的影响?即使我使用 bindValue() 并使每个变量都成为可绑定变量,那么我也必须弄清楚有多少绑定,而且我觉得如果将来必须添加名称,这将比应有的更困难。最好的方法是我上面所说的关于一个查询执行多次,每个名称一次,然后将结果附加在一起的最佳方法?

提前致谢。

编辑: 驱动是PDO,引擎是MSSQL

【问题讨论】:

  • 旁注:您应该规范化您的数据库。你现在的情况带来了很多问题。
  • 数据库引擎是 MSSQL 我的意思是说我使用 PDO 作为驱动程序。我会编辑帖子。
  • 用户可以输入他们想要的任何东西吗?还是复选框定义了名称?
  • 因此用户提交的表单包括当前 9 个名称(将来可能会并且可能会更改)、5 个不同的部门、12 个月和 2 个与任务名称和任务描述匹配的文本框.复选框本身是定义的名称和值。

标签: php sql-server pdo sql-like sql-in


【解决方案1】:

你可以这样做。

//Prepare an array with names
$names = [
  ':name_1' => '%Bob%',
  ':name_2' => '%Bill%',
];
//build the where 
$whereQuery = '';
foreach($names as $bind => $value) {
  if(empty($whereQuery)) $whereQuery .= ' OR ';
  $whereQuery .= ' column LIKE '.$bind;
}
//here is missing the code with SQL and pdo preparing query
//after preparing query just execute with $names
$sth->execute($names);

小心此示例仅提供帮助您找出解决方案的代码。

希望对你有帮助

【讨论】:

    【解决方案2】:

    您绝对应该规范化您的数据库。

    但只是快速的方法,因为提到了 php,你可以生成类似的查询

    $names = ['John','Bob','Bill'];
    $query = 'SELECT * FROM my_weird_table WHERE ';
    $first = true;
    foreach ($names as $name) {
        if ($first) {
            $query .= '`column` LIKE "%'.$name.'%" ';
            $first  = false;
        } else {
             $query .= 'OR `column` LIKE "%'.$name'.'%" ';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      相关资源
      最近更新 更多