我正在使用旧网站广告登录功能永远。我试图找到这个底部,但我不确定是什么导致它。
登录功能使用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 Class
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;
}
}
答案 0 :(得分:3)
由于您没有索引,我建议在username
和password
上添加综合索引:
CREATE INDEX `idx_user_pass` ON `user_table` (`username`, `password`)
查看MySQL CREATE INDEX
syntax以获取完整详情。
正如我在评论主题中所提到的,你的代码没有任何本质上的缓慢。
我会注意到一些需要注意的事情(我怀疑你知道这一点,因为你很长一段时间都是SO成员)。建议删除@
错误抑制运算符。您确实已经对$rs
进行了错误检查,因此此处无需进行额外的抑制。
$row = @mysql_fetch_object($rs);
//----^^
我知道你已经熟悉PDO并准备了其他问题的陈述,所以不需要进入......
答案 1 :(得分:1)
好吧,似乎ike一切都正常,代码本身,它可能是有麻烦的服务器,它减慢了脚本。
另外,$password = md5($_POST['thepassword']); $user = $_POST['theusername'];
:
不要再使用md5哈希了,而是去sha2,对于用户来说,请至少使用mysql_real_escape_string来保证它周围的安全:)
答案 2 :(得分:0)
速度方面,该函数与mysql_fetch_array()相同,并且 几乎与mysql_fetch_row()一样快(差别无关紧要)。
但即使您的代码具有更好的性能,我也怀疑它与您的代码有关。我认为数据库有点慢,你在你正在搜索的fiels中使用带有索引的INNODB吗?这要快很多..
答案 3 :(得分:0)
首先如评论中所述,您应该检查您的表是否有索引。为此,您可以通过运行此查询来确定是否是这种情况:
EXPLAIN SELECT id, active FROM [users_tables] WHERE `username` = '[username]' AND `password` = '[password]'
(用权利值替换[...])
然后,我认为你应该避免在session_generate_id和mysql_fetch_object之前使用@。
另外,检查函数userInfo是否没有执行另一个MySQL请求,如果你有一个忙表,一旦你检查登录密码,最好是获取所有数据,而不是两次。
最后,将你的表(谨慎使用此过程,你可以丢失数据)从MyISAM更改为InnoDB,因为最后一行每行锁定一次,MyISAM每表锁定一次。