MySQL内部更新PHP while循环


MySQL update inside PHP while loop

我想从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, tagcountdcount的和一个php变量"。基本上是php代码的翻译

这消除了任何选择和循环的需要。让数据库为你做这些工作。


既然你使用的是mysql_*,我甚至不会深入讨论安全性和那些东西。我把这个留作参考:

    如何在PHP中防止sql注入?- & - Booby Tables
    为什么我不应该在PHP中使用mysql_*函数?


使用do..while时要小心。由于它只在运行至少一次后进行检查,因此如果没有结果,您可能会得到一些notice/warning