0

我有一个数组(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")函数保存数组。此代码运行良好且流畅,并且在不发生匹配的地方完全中断。我只是好奇是否有更快更好的方法来执行此任务。请建议我。

感谢

4

2 回答 2

2

您可以使用 MySQL 的IN()子句,例如

SELECT * FROM myTable WHERE profile_name IN ('foo', 'bar')
于 2013-02-21T18:39:09.563 回答
0

您正在寻找 mySQLIN运算符和 PHPimplode()函数的组合:

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

应该正确参数化所有内容。

于 2013-02-21T18:44:51.757 回答