【问题标题】:Executing array values in a MySQL PDO statement with WHERE and OR使用 WHERE 和 OR 在 MySQL PDO 语句中执行数组值
【发布时间】:2013-02-06 09:50:07
【问题描述】:

我一直在寻找一种解决方案,您可以使用一条准备好的语句获取数据库并使用数组值执行它

通常我会在我的声明中这样做:

$search = $db->prepare("SELECT * FROM table WHERE name = ?");
$search->execute(array($name));

但是如果我有一个这样的数组呢:

Array ( 
  [0] => Array 
  ( 
    [name] => Burger Joint 
  ) 
  [1] => Array 
  ( 
    [name] => Burger Joint 
  ) 
  [2] => Array 
  ( 
    [name] => Burgers 
  ) 
  [3] => Array 
  ( 
   [name] => Meats 
  )
)

我想以某种方式在语句中使用数组WHERE name=? 中的任一值浏览我的数据库。但是,有时会有多个相似的名称,有没有办法事先压缩数组或者在这种情况下最好的做法是什么?

谢谢!

【问题讨论】:

标签: mysql arrays pdo prepared-statement


【解决方案1】:

您可以通过多种方式做到这一点,但既然您提到了OR,让我们使用它:

首先,您的可能值数组。让我们把你的数组塑造成一个唯一值的数组:

$values_array = array_unique(
    array_map(
        function($element) { 
            return $element['name']; 
        },
        $original_array
    )
);
// $values_array now contains array('Burger Joint', 'Burgers', 'Meats')

现在,我们通过引入尽可能多的占位符来构建准备好的查询:

$query = sprintf('SELECT * FROM table WHERE %s',
    implode(
        ' OR ',
        array_fill(
            'name = ?', 
            count($values_array)
        )
    )
);
// $query now contains 'SELECT * FROM table WHERE name = ? OR name = ? OR name = ?'

并执行它:

$search = $db->prepare($query);
$search->execute($values_array);

或者,您可以改用IN,像这样构建您的查询:

$query = sprintf('SELECT * FROM table WHERE name in (%s)',
    implode(
        ', ',
        array_fill(
            '?', 
            count($values_array)
        )
    )
);
// $query now contains 'SELECT * FROM table WHERE name in (?, ?, ?)'

$search = $db->prepare($query);
$search->execute($values_array);

这会产生同样的效果,而且通过查看代码更清楚发生了什么。

【讨论】:

  • @andrewliu 你说得对,为什么 所有答案都被否决了?他们还在努力!而且,您找到问题的答案了吗?
【解决方案2】:

尝试name IN 而不是name =

【讨论】:

  • 我想了更多,我想我不清楚。我需要使用数组中的一个/或一个值,而不仅仅是使用所有值。 IN 会起作用吗?
  • 是的,如果您将值作为数组传递,它应该可以工作。在一个值的情况下,数组只有一个元素。
  • ? 标记用于避免 SQL 注入。我在这里没有考虑过,所以这不是一个完整的答案。检查此answer。您可以使用 str_split、implode 或使用此类函数的组合来准备数组以避免 SQL 注入。(也可以参考答案的 cmets)
【解决方案3】:

首先,您需要 IN。 field IN (1,2) 等于 field=1 OR field=2
接下来,您需要某种辅助函数,将创建正确 SQL 语句的所有技术细节远离应用程序业务代码。一行,而不是 50 行。

$data = $db->getAll("SELECT * FROM table WHERE name IN (?a)",$names);

最后,您似乎是从另一个查询中获取您的姓名。
在这种情况下,您只需使用 JOIN 运行单个查询。您可以在[mysql] 标签下提出另一个问题,提供您的两个查询。

要仅将名称放入数组,您必须使用另一个辅助函数(尽管您必须自己创建它或先获取某个位置):

$names = $db->getCol("here goes your query to get names");

【讨论】:

  • 我通过另一个正确的查询获得了一个数组,但它不是来自我的数据库。我基本上是在这样做$array[] = array("name"=>$names); 但是如果我在数组中有超过 1 个值,比如这样:$array[] = array("name"=>$names,"id"=>$id,"plural"=>$plural); 我如何只指定名称?在 getAll() 函数的末尾会是 $names['name'] 吗?
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多