您應該在SQL中使用IN
子句來執行此操作。從表中選擇所有的東西,以便在PHP中確定它是否包含您要查找的用戶名是沒有道理的,而且非常浪費。你能想象如果你有一個100萬用戶的桌子會發生什麼,你需要看看他們中的兩個是否在列表中?您將要求您的DBMS向PHP返回100萬行,以便您可以搜索每個這些名稱,然後確定它們中的任何一個是否是您正在查找的。你要求你的DBMS做很多工作(發送表中的所有行),並且你還要求PHP做很多工作(將所有這些行存儲在內存中並計算匹配),不必要的。
根據您的需求,有一個更高效和更快的解決方案。
首先,如果你只需要知道,所有這些用戶的存在於表中,然後使用SELECT COUNT(username)
,而不是和你的數據庫將返回單個行與多少行表中發現的值。這樣,你有一個全部或沒有辦法(如果這就是你要找的)。無論是在表格中找到3行還是在數組中有3個元素,或者沒有。這也利用了你的表索引(你應該正確索引)並且意味着更快的結果。
$admins = array("username","username2","username3");
// Make sure you properly escape your data before you put in your SQL
$list = array_map('mysql_real_escape_string', $admins);
// You're going to need to quote the strings as well before they work in your SQL
foreach ($list as $k => $v) $list[$k] = "'$v'";
$list = implode(',', $list);
$users = "SELECT COUNT(username) FROM usrsys WHERE username IN($list)";
$query_users = mysql_query($users);
if (!$query_users) {
echo "Huston we have a problem! " . mysql_error(); // Basic error handling (DEBUG ONLY)
exit;
}
if (false === $result = mysql_fetch_row($query_users)) {
echo "Huston we have a problme! " . mysql_error(); // Basic error handling (DEBUG ONLY)
}
if ($result[0] == count($admins)) {
echo "All admins found! We have {$result[0]} admins in the table... Mission complete. Returning to base, over...";
}
如果你真的這樣做需要所有數據然後從SQL的COUNT
,你會簡單地獲得這些用戶的所有行(如果發現)。
$admins = array("username","username2","username3");
// Make sure you properly escape your data before you put in your SQL
$list = array_map('mysql_real_escape_string', $admins);
// You're going to need to quote the strings as well before they work in your SQL
foreach ($list as $k => $v) $list[$k] = "'$v'";
$list = implode(',', $list);
$users = "SELECT username FROM usrsys WHERE username IN($list)";
$query_users = mysql_query($users);
if (!$query_users) {
echo "Huston we have a problem! " . mysql_error(); // Basic error handling (DEBUG ONLY)
exit;
}
// Loop over the result set
while ($result = mysql_fetch_assoc($query_users)) {
echo "User name found: {$result['username']}\n";
}
可是,我真的勸你使用舊的分機/ MySQL的API,因爲它已被棄用,並從使用已經氣餒了相當一段時間,在PHP MySQL數據庫接口重新考慮。我強烈建議您開始使用新的替代API,例如PDO或MySQLi,並參閱手冊中的指南以獲取有關選擇API的幫助。
在PDO中,例如,這個過程對於準備好的語句和參數化查詢來說會很簡單,因爲您不必擔心所有這些轉義。
有以舉例的PDOStatement::Execute page(例5),顯示你是如何做到使用IN子句與準備好的語句的方式......然後,您可以在代碼和它的其他地方重複使用此聲明提供了性能優勢,同時也讓您更難以無意中將自己暴露給SQL注入漏洞。
// Connect to your database
$pdo = new PDO("mysql:dbname=mydb;host=127.0.0.1", $username, $password);
// List of admins we want to find in the table
$admins = array("username","username2","username3");
// Create the place holders for your paratmers
$place_holders = implode(',', array_fill(0, count($admins), '?'));
// Create the prepared statement
$sth = $dbh->prepare("SELECT username FROM usrsys WHERE username IN ($place_holders)");
// Execute the statement
$sth->execute($admins);
// Iterate over the result set
foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {
echo "We found the user name: {$row['username']}!\n";
}
你的PHP代碼,甚至看起來與PDO :)
**擡起頭好多了!** PHP的未來版本是*自嘲和刪除*了'mysql_'系列函數。現在將是[切換到PDO](http://php.net/book.pdo)或[mysqli](http://php.net/book.mysqli)的好時機。 – Charles