0

私はかなり単純なログインシステムを設計中です。現在、ユーザーがログインしようとするときに次のコードを使用して、ユーザーがログインしようとしているユーザー名と一致するエントリがデータベースにあるかどうかを判断します。(コードの後半で、一致するパスワードなどをチェックします。その部分については心配していません。)

現在、SELECTを使用してデータベース全体を変数($ wholeUserDatabase)に取り込み、それを繰り返し処理して、「username」フィールドが一致するかどうかを判断しています。

今のところ正常に動作します。しかし、私のデータベースには現在3人のユーザーがいます。データベース全体を変数に取り込むこの方法は、サイトを公開して(理論的には)より多くのユーザーを獲得すると、非常に遅くなりますか?

$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))であるとしましょう。この場合、DBマシンから転送します。

10 ^ 5 *(30 + 64)*2バイト=18.8MBのデータ。

これは、ユーザー名とパスのみがDBに保存されている10^5ユーザーの場合です。運が良ければ、10^6または10^7のユーザーを獲得できますか?

一般に、このクラスに分類されるデータの量を転送します:O(ユーザー)

于 2012-07-09T23:12:03.667 に答える