我有一个数组(61),其中包含可能的用户名,我想根据数据库条目验证它们中的每一个。我使用以下代码:
foreach(profileName("Dev","Db") as $k => $val){
$db->query("SELECT profile_name FROM eb_user_account WHERE profile_name = '$val'");
if($db->numRows() == 0){
echo $val ." [match found at key: {$k}]";
break;
}
}
profileName("Dev","Db")
函数保存数组。这段代码工作得很好,很流畅,并且确切地在不匹配的地方打破。我很好奇是否有更快更好的方法来执行此任务。请建议我。
谢谢
答案 0 :(得分:2)
您可以使用MySQL的IN()
子句,例如
SELECT * FROM myTable WHERE profile_name IN ('foo', 'bar')
答案 1 :(得分:0)
您正在寻找mySQL的IN
运算符和PHP implode()
函数的组合:
$query = sprintf(
'SELECT profile_name FROM eb_user_account WHERE profile_name IN (%s)',
implode(',', profileName("Dev","Db"))
);
值得注意的是,如果您使用参数化查询,则无法传递任意长度的参数列表。例如:
$stmt = $dbh->prepare('SELECT * FROM table WHERE col IN (?)');
$rs = $stmt->execute(array(implode(',', $myarray)));
会失败。 IN
语句中的参数数量必须与占位符数相匹配。例如:
$stmt = $dbh->prepare('SELECT * FROM table WHERE col IN (?,?,?)');
$rs = $stmt->execute(array(1,2,3));
第二个想法......
$myarray = profileName("Dev","Db");
$placeholders = array_fill(0, count($myarray), '?');
$query = sprintf(
'SELECT profile_name FROM eb_user_account WHERE profile_name IN (%s)',
implode(',', $placeholders);
);
$stmt = $dbh->prepare($query);
$rs = $stmt->execute($myarray);
应该正确参数化所有内容。