PHP,管理员用户系统

PHP,管理员用户系统,php,Php,我想知道你是否认为这是可能的: 好的,我有一个存储用户名的数据库,我想回显一个名为admins.php的文件中的管理员,如果他们匹配到目前为止我得到的数据库中的用户名: admins.php; $admins = array("username","username2","username3"); 及 while循环应该能够响应与admins.php文件匹配的用户。我想我应该使用类似(inarray())的东西,但我真的不确定。如果您希望语法只从$admins数组中拉入用户,那么您可以使用类似

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

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


while循环应该能够响应与admins.php文件匹配的用户。我想我应该使用类似(inarray())的东西,但我真的不确定。

如果您希望语法只从
$admins
数组中拉入
用户
,那么您可以使用类似的东西:

$users="SELECT username FROM usrsys WHERE username IN ('".join("','",$admins)."')";
<?php
while($row = mysql_fetch_assoc($query_users)){
    if(in_array($row['username'],$admins)){
        //do admin stuff here
    }else{
        //do NON-admin stuff here
    }
}?>
其中php函数
JOIN
将打印
username、username2、username3
。生成的MySQL语句如下所示:

SELECT username FROM usrsys WHERE username IN ('username','username2','username3')
或者,如果您希望遍历
$query\u vars
数组并将管理员与非管理员分开,那么您可以使用以下方法:

$users="SELECT username FROM usrsys WHERE username IN ('".join("','",$admins)."')";
<?php
while($row = mysql_fetch_assoc($query_users)){
    if(in_array($row['username'],$admins)){
        //do admin stuff here
    }else{
        //do NON-admin stuff here
    }
}?>

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

while ($row = mysql_fetch_array($users)) {
if (in_array($users[0], $admins))
    echo $users[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>";
    }
}
?>

您应该在SQL中使用
IN
子句来完成此操作。从表中选择所有内容以在PHP中确定它是否包含您要查找的用户名是没有意义的,而且是非常浪费的。你能想象如果你有一个100万用户的表格,你需要看看他们中是否有两个在这个列表上会发生什么吗?您将要求您的DBMS将100万行返回到PHP,以便您可以搜索这些名称中的每一个,然后确定其中是否有您正在寻找的名称。您要求DBMS做大量工作(发送表中的所有行),也要求PHP做大量工作(将所有这些行存储在内存中并计算匹配),这是不必要的

根据您的需要,有一个更高效、更快的解决方案

首先,如果您只需要知道表中存在所有这些用户,那么使用
选择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中删除
计数
,您只需获取这些用户的所有行(如果找到)


然而,我真的敦促您重新考虑使用旧的ext/mysql API与PHP中的mysql数据库进行接口,因为它已经被弃用了,并且在相当长的一段时间内不被使用。我强烈建议您开始使用新的替代API,如PDO或MySQLi,并参阅手册中的指南以获得选择API的帮助

例如,在PDO中,这个过程对于准备好的语句和参数化查询非常简单,因为您不必担心所有这些转义

在(示例#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时甚至看起来更好:)

join thing看起来更接近我想要的东西,但是当我回显$users并尝试将其用作phpmyadmin中的SQL命令时,它在“where子句”中显示未知列“username”,啊,我想我知道为什么,这是因为用户未在数据库中注册。编辑:事实上,我现在尝试了一个实际用户,结果还是一样的。原因是您必须像引用SQL代码中的任何字符串一样引用
in
子句中的字符串值。SQL需要您像PHP一样引用字符串。@SamuelOK只是一些小注释,请使用内爆不连接(由于BC原因,连接在PHP中仍然是别名——但从语义上讲,在代码中使用内爆更好,因为只有少数旧时的PHP4开发人员一眼就能认出这个名称)。第二,这仍然是错误的做法。没有对数据进行转义,也没有检查空值(如果我有一个空数组,您刚刚返回了整个表),在这里完全不需要使用in_数组。你已经知道它在数组中了(你的SQL是这么说的)。注意!PHP的未来版本正在弃用并删除
mysql\uuz
函数系列。现在将是一个很好的时间,或。