PHP,管理员用户系统

时间:2012-12-09 06:47:35

标签: php

我想知道你是否认为这是可能的: 好的,我有一个存储用户名的数据库,我想回应一个名为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 个答案:

答案 0 :(得分:2)

您绝对应该在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";
}

但是,我真的建议您重新考虑使用旧的ext / 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看起来更好:)

答案 1 :(得分: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
    }
}?>

答案 2 :(得分:0)

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

while ($row = mysql_fetch_array($users)) {
if (in_array($users[0], $admins))
    echo $users[0];
}

答案 3 :(得分: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>";
    }
}
?>