2

ユーザーにもログインが必要なWebサイトを継承しました。

ログインはAjaxとPHPを使用しますが、4000人のユーザーしか登録されていない場合、このログイン手順が完了するまでに最大1分かかることがあります。

これは、ログインのコーディング方法が原因である可能性がありますか?

AJAX

 <form name="login-form" onsubmit="return false">
            <input type="text" id="the_username" value="Username" onfocus="emptyUsername(this);" onblur="clickrecall(this,'Username')"  class="focusfield input push"  />
            <input type="password" id="the_password" value="Password" class="input" onfocus="emptyPassword(this);" onblur="clickrecall(this,'Password')" /> 
            <span id="dialog-login-fail" title="Login failed"></span>
            <input type="submit" onclick="javascript:void(0);"  id="loginBtnBre" class="sign-in signin-submit-btn" value="Login Now" /> 
 </form>

PHP

<?php
require 'config.inc.php';

foreach($_POST as $k=>$v) 
{
$_POST[$k] = trim($v);
}

if(!isset($_POST['theusername']) or !isset($_POST['thepassword']))
{
    print "Please use all fields";
}elseif(empty($_POST['theusername'])){
    print "Please enter a username";
}elseif(empty($_POST['thepassword'])){
    print "Please enter a password";
}elseif($_POST['theusername'] == "username" && $_POST['thepassword'] == "password")
{
    print "Password & User cannot be the ones already listed";
}elseif(!preg_match("/^[a-z0-9]+$/i", $_POST['theusername']))
{
    print "Please use only characters and numbers for username, no spaces, dashes or others!";
}else{

    $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.";
    }
}

?>

クエリ

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

3 に答える 3

1

最初にブラウザを変更して、ブラウザに問題がないことを確認します(まれですが、それでも時々発生します)。

次に、PHPプロファイラーを試して、「遅い」バックエンドコードを特定します。http://erichogue.ca/2011/03/linux/profiling-a-php-application/にも素晴らしいチュートリアルがあります

于 2012-10-08T10:49:21.720 に答える
0

ユーザー名またはパスワードのフィールドにインデックスがない可能性があります

走る:

alter table `TableName` add index `username` (`username`(500));
alter table `TableName` add index `password` (`password`(500));

TableNameがテーブルの名前であるmysqlプロンプトから、再試行します。それで処理が速くなる場合は、インデックスをより適切な長さに調整してください。

また、パスワードをクリアテキストとしてデータベースに保存するべきではありません。最低限、ハッシュ文字列(MD5など)として保存するか、それ以上に、塩漬けのMD5ハッシュとして保存します。

ユーザー名に基づいて選択するように選択を変更し(パスワードをドロップ)、追加のチェックを実行して、入力されたパスワードが返された行のパスワードと一致することを確認します。

于 2012-10-08T11:55:59.117 に答える
0

正しい情報が掲載されているかどうかは、firefox の firebug 機能を使って知ることができますか? 「ログイン」機能以外は問題ないことがわかります。クエリをエコーし​​、firebug からコピーしてデータベースに実行できます。そのクエリの実行にかかる時間を追跡し、それに数秒追加します。データベース クエリに時間がかかるかどうかを確認します。

クエリに時間がかかる場合は、SQL クエリを最適化する必要があります

于 2012-10-08T10:44:44.120 に答える