您绝对应该IN
在 SQL 中使用子句来执行此操作。从表中选择所有内容以便在 PHP 中确定它是否包含您要查找的用户名是没有意义的,而且非常浪费。你能想象如果你有一个有 100 万用户的表并且你需要查看其中两个是否在该列表中会发生什么吗?您将要求您的 DBMS 将 100 万行返回给 PHP,以便您可以搜索每个名称,然后确定它们中的任何一个是否是您要查找的名称。您要求您的 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...";
}
如果您确实想要所有数据,COUNT
则从 SQL 中删除,您将简单地获取这些用户的所有行(如果找到的话)。
$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";
}
但是,我真的强烈建议您重新考虑使用旧的 ext/mysql API 与 PHP 中的 MySQL 数据库进行交互,因为它已被弃用并且在很长一段时间内一直不鼓励使用。我真的强烈建议您开始使用新的替代 API,例如 PDO 或 MySQLi,并查看手册中的指南以获取有关选择 API 的帮助。
例如,在 PDO 中,此过程对于准备好的语句和参数化查询将非常简单,因为您不必担心所有这些转义。
PDOStatement::Execute 页面中有一个示例(示例 #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 甚至看起来好多了 :)