0

我想知道你是否认为这是可能的:好的,所以我有一个存储用户名的数据库,我想回显一个名为 admins.php 的文件中的管理员,如果他们与数据库中的用户名匹配,到目前为止我得到了:

admins.php;
$admins = array("username","username2","username3");

$users="SELECT username from usrsys";
$query_users=mysql_query($users);
while loop here.

while 循环应该有望回显与 admins.php 文件匹配的用户。我想我应该使用(inarray())之类的东西,但我真的不确定。

4

4 回答 4

2

您绝对应该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 甚至看起来好多了 :)

于 2012-12-09T07:47:42.977 回答
0

尝试这个:

<?php
# include admins.php file that holds the admins array
include "admins.php";

# join all values in the admins array using "," as a separator (to use them in the sql statement)
$admins = join(",", $admins);

# execute the query
$result = mysql_query("
    SELECT username
    FROM usrsys
    WHERE username IN ($admins)
");

if ($result) {
    while ($row = mysql_fetch_array($result)) {
        echo $row["username"] . "<br>";
    }
}
?>
于 2012-12-09T07:36:56.803 回答
0

如果您正在寻找仅从数组中提取的语法,users那么$admins您可以使用以下内容:

$users="SELECT username FROM usrsys WHERE username IN ('".join("','",$admins)."')";

php 函数JOIN将在哪里打印username,username2,username3. 您生成的 MySQL 语句将如下所示:

SELECT username FROM usrsys WHERE username IN ('username','username2','username3')

或者,如果您希望遍历您的$query_vars数组并将管理员与非管理员分开,那么您可以使用以下内容:

<?php
while($row = mysql_fetch_assoc($query_users)){
    if(in_array($row['username'],$admins)){
        //do admin stuff here
    }else{
        //do NON-admin stuff here
    }
}?>
于 2012-12-09T07:01:20.730 回答
0

只需包含 admins.php 文件并在循环中使用下一个构造:

while ($row = mysql_fetch_array($users)) {
if (in_array($users[0], $admins))
    echo $users[0];
}
于 2012-12-09T07:06:30.537 回答