将数组与数据库匹配

时间:2013-02-21 18:34:44

标签: php arrays

我有一个数组(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")函数保存数组。这段代码工作得很好,很流畅,并且确切地在不匹配的地方打破。我很好奇是否有更快更好的方法来执行此任务。请建议我。

谢谢

2 个答案:

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

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