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

由于您没有索引,我建议在usernameand上添加一个复合索引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
  1. 尝试使用 PDO 或 mysql_fetch_assoc,根据 PHP.net,此功能比 mysql_fetch_assoc 稍慢,

在速度方面,该函数与 mysql_fetch_array() 相同,并且几乎与 mysql_fetch_row() 一样快(差异不大)。

  1. 回声比打印稍快;

但是,即使您的代码具有更好的性能,我也怀疑它与您的代码有关。我认为数据库有点慢,您是否在正在搜索的字段中使用带有索引的 INNODB?这个快很多。。

于 2013-01-20T21:03:32.047 回答
0

首先,如评论中所述,您应该检查您的表是否有索引。为此,您可以通过运行以下查询来确定是否是这种情况:

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

(将 [...] 替换为权限值)

然后,我认为您应该避免在 session_generate_id 和 mysql_fetch_object 前面使用@。

此外,如果它没有执行另一个 MySQL 请求,请检查函数 userInfo,如果您有一个繁忙的表,最好在检查登录密码后获取所有数据而不是两次。

最后,将您的表(注意此过程,您可能会丢失数据)从 MyISAM 更改为 InnoDB,因为最后一个每行有一个锁,而 MyISAM 每个表都有一个锁。

于 2013-01-20T21:07:37.543 回答