2013-02-21 73 views
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")函数包含数组。这段代码工作的很好,很顺利,并且不会发生匹配的地方。我只是好奇,如果有更快,更好的方式来执行这项任务。请给我建议。

,非常感谢

回答

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

应该拥有的一切正确参数。

2

您可以使用MySQL的IN()条款,如

SELECT * FROM myTable WHERE profile_name IN ('foo', 'bar')