我想从MySQL数据库中检索8000条记录,执行一个计算给每条记录一个评级,然后用评级更新数据库。
我有:
require_once('db-connect.php');
//---RETRIEVE FROM DB
mysql_select_db($database_lg, $lg);
$query_r1 = "SELECT * FROM tblposts WHERE status = 'live'";
$r1 = mysql_query($query_r1, $lg) or die(mysql_error());
$row_r1 = mysql_fetch_assoc($r1);
do {
$id = $row_r1['id'];
$v1 = $row_r1['views'];
$v2 = $row_r1['likes'];
$v3 = $row_r1['tagcount'];
$v4 = $row_r1['dcount'];
$v5 = $_POST['content_rating'];
$rating = $v1 + $v2 + $v3 + $v4 + $v5;
//---UPDATE DB
$updateSQL = "UPDATE tblposts SET rating='$rating' WHERE id = '$id'";
mysql_select_db($database_lg, $lg);
$Result = mysql_query($updateSQL, $lg) or die(mysql_error());
} while ($row_r1 = mysql_fetch_assoc($r1));
mysql_free_result($r1);
是这样做的吗?在我看来,我可以通过这种方式进行8000次更新,让我的服务器化为乌有,但我不知道还有什么更优雅的解决方案。如有任何见地,不胜感激。
注意:我意识到mysql_*函数已被弃用。在这个网站上,我不得不再忍受一段时间。
下面的内容如何?
UPDATE
tblposts
SET
rating = views + likes + tagcount + dcount + $value
WHERE
status = 'live';
这意味着:"对于当前为live
的每个状态,使rating
列为views
, likes
, tagcount
和dcount
的和和一个php变量"。基本上是php代码的翻译。
这消除了任何选择和循环的需要。让数据库为你做这些工作。
既然你使用的是mysql_*
,我甚至不会深入讨论安全性和那些东西。我把这个留作参考:
- 如何在PHP中防止sql注入?- & - Booby Tables
为什么我不应该在PHP中使用mysql_*函数?
使用
do..while
时要小心。由于它只在运行至少一次后进行检查,因此如果没有结果,您可能会得到一些notice
/warning
。