致命错误
问题描述:
我写了一个代码在我的网站更新密码加密.. 代码..致命错误
<?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);
}
?>
我如何纠正这一错误?
答
多个设置存在PHP的更高的max_execution_time在php.ini中,但没有实际的解决办法:
MySQL的原生支持SHA1,所以也许你可以做这样的事情
update register set password = sha1(concat(password, 'Q*iV%qKz$&!C'))
这应该是很多比你的php解决方案更快。
您的查询的表现仍然很低,除非您在一个古老的盒子上。也许你没有为密码字段定义索引?
答
<?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);
?>
答
假设MySQL的本地SHA1方法(如罗马建议)不工作,你可以添加以下到您的循环:
set_time_limit(10);
它基本上将重置PHP超时每次调用该函数,给它需要10秒钟才能完成。
答
您正在选择1000条记录,然后在foreach循环中使用每个值并再次更新数据库,这可能是您超出时间的原因,请尝试通过将其放在脚本之上来延长时间限制:
ini_set('max_execution_time', 14000); // or whatever value
答
另一种解决方案是以块的形式做记录,然后使用头将自己发送回相同的脚本,传递最后更新记录的索引,然后执行下一个块。
喜欢的东西:
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");
多少查询,你在做什么?你可以测试'回声'输出来确定超时发生在哪一点?此外,添加mysql错误处理,以便您可以找出脚本是否管理连接到数据库。 www.php.net/mysql_error – 2010-02-13 13:41:54
如果您为更好的可见性格式化代码(使用编辑器中的代码选项)并显示您遇到的错误,可以提供帮助。 “ – 2010-02-13 13:42:29
”在php中致命错误(**执行时间超过60s **)“ – badp 2010-02-13 13:44:12