我写了一个代码来更新我网站中的密码加密。 代码是......
<?php
$db= mysql_pconnect("localhost","root","root");
mysql_select_db("nitconnect");
$query="select password from register limit 1000";
$result=mysql_query($query);
$c=0;
while($ans=mysql_fetch_array($result))
{
$newpass=sha1($ans[0].'Q*iV%qKz$&!C');
$newone="update register set password='{$newpass}' where password='{$ans[0]}'";
mysql_query($newone);
}
?>
如何更正此错误?
答案 0 :(得分:1)
除了在php.ini中设置php的max_execution_time之外,没有其他真正的解决方案,但是:
mysql原生支持sha1,所以也许你可以做一些像
这样的事情update register set password = sha1(concat(password, 'Q*iV%qKz$&!C'))
这应该比你的php解决方案快得多。
除非你在古老的盒子上,否则你的查询性能仍然很低。也许你没有为密码字段定义索引?
答案 1 :(得分:1)
<?php
$db= mysql_pconnect("localhost","root","root");
mysql_select_db("nitconnect");
$query="UPDATE register SET password = SHA1(CONCAT(password, 'Q*iV%qKz$&!C')) WHERE 1";
$result=mysql_query($query);
?>
答案 2 :(得分:0)
假设MySQL的原生SHA1方法(如罗马建议的)不起作用,请尝试将其添加到循环中:
set_time_limit(10);
它基本上会在每次调用该函数时重置PHP超时,再给它10秒钟。
答案 3 :(得分:0)
您正在选择1000条记录,然后在foreach循环中使用每个值并再次更新数据库,这可能会让您失去时间,尝试通过将其放在脚本之上来增加时间限制:
ini_set('max_execution_time', 14000); // or whatever value
答案 4 :(得分:0)
另一个解决方案是以块的形式进行记录,然后使用标头将自己发送回相同的脚本,传递最后更新的记录的索引,然后执行下一个块。
类似的东西:
if(issset($_GET['start']) {
$start = $_GET['start'];
} else {
$start = 0;
}
$query="select password from register limit $start, 50";
... do your stuff ...
$start = $start + 50;
header("Location: http://www.example.com/yourscript.php?start=$start");