2013-02-21 68 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')