我一直在寻找一个解决方案,您可以使用一个预准备语句获取数据库并使用数组值执行它
通常我会用我的陈述来做这件事:
$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=?
中的任一值来浏览我的数据库。但是,有时候会有多个相似的名字,有没有办法在手头压缩数组,或者在这样的情况下最好的做法是什么?
谢谢!
答案 0 :(得分: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 :(得分:-1)
尝试使用name IN
代替name =
。
答案 2 :(得分:-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");