IN
これを行うには、SQLで句を使用する必要があります。探しているユーザー名が含まれているかどうかをPHPで判断するためにテーブルからすべてを選択することは意味がなく、非常に無駄です。100万人のユーザーのテーブルがあり、そのうちの2人がそのリストに含まれているかどうかを確認する必要がある場合、どうなるか想像できますか?あなたは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データベースとインターフェイスすることを再検討することを強くお勧めします。これは、非推奨であり、かなり長い間使用が推奨されていないためです。PDOやMySQLiなどの新しい代替APIの使用を開始し、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でさらに良く見えます:)