使用 WHERE 和 OR 在 MySQL PDO 语句中执行数组值[重复]

问题描述 投票:0回答:3

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

通常我会用我的陈述来做到这一点:

$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=?
中的任一值来浏览我的数据库。但是,有时会出现多个相似的名称,有没有办法预先压缩数组,或者在这种情况下最好的做法是什么?

谢谢!

php mysql arrays pdo prepared-statement
3个回答
0
投票

您可以通过多种方式做到这一点,但既然您提到了

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);

这也会有同样的效果,而且看代码会稍微清楚是怎么回事。


-1
投票

尝试用

name IN
代替
name =


-1
投票

首先,你需要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");

© www.soinside.com 2019 - 2024. All rights reserved.