0

我正在设计一个相当简单的登录系统,我目前在用户尝试登录时使用以下代码来确定数据库中是否存在与用户尝试登录的用户名匹配的条目。(稍后在代码中,我检查匹配的密码等;我不担心那部分。)

目前,我使用 SELECT 将整个数据库抓取到一个变量($wholeUserDatabase)中,然后遍历它以确定“用户名”字段是否匹配。

它现在工作正常。但是我的数据库现在有三个用户。当我将网站发布给公众并(理论上)获得更多用户时,这种将整个数据库抓取到变量中的方法会变得非常缓慢吗?

$connection = mysql_connect($mysql_host,$mysql_user,$mysql_password);

mysql_select_db($mysql_database, $connection);

// Take the whole user database, and store it in $wholeUserDatabase.
$wholeUserDatabase = mysql_query("SELECT * FROM myTable")
    or die(mysql_error());  

$boolFoundUser = false;

/* Iterate once for every entry in the database, storing the current entry 
of the database into a variable $currentEntry, which is an array containing 
everything related to the one user. */
while($currentEntry = mysql_fetch_array($wholeUserDatabase)) {

    /* Does the "username" field of the current entry match the one 
    the user tried to log in with? */
    if ($currentEntry['username'] == $_POST['username']) {

        /* If it does, break the loop so that the $currentEntry variable 
        will contain the information for the user who is trying to log in,
        which I will later need to check passwords, etc. */
        $boolFoundUser = true;
        break;
    }
}

mysql_close($connection);

谢谢你的帮助。如果我需要重新考虑这部分,请告诉我。我希望这对其他人有帮助。

4

3 回答 3

4

是的!这将是可怕的,可怕的缓慢。不要选择整个数据库,只需选择您需要的。

于 2012-07-09T23:02:18.183 回答
3

我不明白你为什么要这样做。这有点违背了首先拥有数据库的目的。我的意思是,如果你想以这种方式做事,文件 i/o 就足够了(即从纯文本文件中写入/读取)。

你想要做的是一个 SELECT * FROM myTable Where username=$username && password==$password...

这更好,因为(a)您可以在用户名上创建索引,这将使数据库搜索/查找更快,(b)从 i/o 和处理的角度来看,它的成本要低得多,因为(a)您没有推送所有数据(整个数据库)从数据库到应用程序,(b)如果它的索引正确(所以更快),mySQL不需要迭代整个数据库......

问候

于 2012-07-09T23:06:42.003 回答
0

从数据库中获取所有用户显然是一个非常糟糕的主意。了解您将导致多少数据传输。想象一下,您在发布后获得了 10^5 个用户。假设 users 表的模式至少是:users(username varchar(30), password varchar(64))。在这种情况下,您将从数据库机器传输:

10^5 * (30 + 64) * 2 字节 = 18.8 MB 数据。

这适用于 10^5 个用户,您只有一个用户名和一个存储在数据库中的通行证。如果你很幸运并获得了 10^6 或 10^7 个用户怎么办?

通常,您将传输属于此类的数据量:O(users)

于 2012-07-09T23:12:03.667 回答