2

私は古いサイトの広告に取り組んでおり、ログイン機能は永遠にかかります。私はこれの底に到達しようとしていますが、何が原因なのかわからないだけです。

ログイン機能はAJAXを使用します。

AJAX

$password = md5($_POST['thepassword']);
$user = $_POST['theusername'];

$loginVar = $usersClass->login($user, $password);

if(is_array($loginVar))
{
    $_SESSION['loggedIn'] = $loginVar; 
    @session_regenerate_id(true);

    print "success";

}else{
    print "Whoops, something went wrong! Try again.";
}

PHPクラス

public function login($username, $password)
{

    $rs = mysql_query("SELECT `id`,`active` from `$this->usersTable` WHERE 
        `username` = '".mysql_real_escape_string($username)."' AND 
        `password` = '".mysql_real_escape_string($password)."'");

    if($rs) {
        $row = @mysql_fetch_object($rs);

            return $this->userInfo($row->id);

    }else{
        return false;
    }

}
4

4 に答える 4

3

usernameインデックスがないため、 andに複合インデックスを追加することをお勧めしますpassword

CREATE INDEX `idx_user_pass` ON `user_table` (`username`, `password`)

詳細については、MySQLCREATE INDEX構文を確認してください。

コメント スレッドで述べたように、そのままのコードで本質的に遅いということはありません。

注意すべき点をいくつか書き留めておきます (長い間 SO のメンバーであったため、このことはご存知かと思います)。@エラー抑制演算子を削除することをお勧めします。既にエラー チェックがオンに$rsなっているため、ここで追加の抑制を行う必要はありません。

$row = @mysql_fetch_object($rs);
//----^^

そして、あなたはすでに PDO と他の質問からの準備されたステートメントに精通していることを知っているので、それに入る必要はありません...

于 2013-01-20T21:06:39.297 に答える
1

ええと、コード自体はすべて問題ないようです。サーバーに問題があり、スクリプトの速度が低下している可能性があります。また、$password = md5($_POST['thepassword']); $user = $_POST['theusername'];:md5ハッシュを使用しないでください。代わりに、sha2を使用してください。ユーザーの場合は、少なくともその周辺のセキュリティのためにmysql_real_escape_stringを使用してください:)

于 2013-01-20T21:01:16.623 に答える
0

最初にコメントで述べたように、テーブルにインデックスがあるかどうかを確認する必要があります。そのためには、次のクエリを実行して、そうであるかどうかを確認できます。

EXPLAIN SELECT id, active FROM [users_tables] WHERE `username` = '[username]' AND `password` = '[password]'

([...] を権利の値に置き換えます)

それから、session_generate_id と mysql_fetch_object の前に @ を使用することは避けるべきだと思います。

また、別の MySQL リクエストを実行していない場合は、関数 userInfo を確認してください。テーブルが混雑している場合は、ログイン パスワードを 2 回確認するよりも、1 回ですべてのデータを取得することをお勧めします。

最後に、テーブルを MyISAM から InnoDB に変更します (このプロセスには注意してください。データが失われる可能性があります)。最後のテーブルには行ごとのロックがあり、MyISAM にはテーブルごとのロックがあるためです。

于 2013-01-20T21:07:37.543 に答える
0
  1. PDO または mysql_fetch_assoc を使用してみてください。PHP.net によると、この関数は mysql_fetch_assoc よりもわずかに遅くなります。

速度に関しては、この関数は mysql_fetch_array() と同じで、mysql_fetch_row() とほぼ同じ速さです (違いはわずかです)。

  1. エコーは印刷よりもわずかに高速です。

しかし、コードのパフォーマンスが向上したとしても、それがコードと関係があるとは思えません。データベースが少し遅いと思います。検索しているフィールドのインデックスで INNODB を使用していますか? これははるかに高速です..

于 2013-01-20T21:03:32.047 に答える