我想从一个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_u*函数已被弃用。在这个有问题的网站上,我不得不和他们住上一段时间。
最佳答案
你看这个怎么样?
UPDATE
tblposts
SET
rating = views + likes + tagcount + dcount + $value
WHERE
status = 'live';
这意味着:“对于当前
live
的每个状态,将列rating
设置为views
、likes
、tagcount
和dcount
和一个php变量的总和”。差不多是你的php代码的翻译。这就不需要任何选择和循环。让数据库为你做这项工作。
既然你使用的是
mysql_*
,我甚至不会深入讨论安全性和那些东西。我就把这个留在这里作为参考:How can I prevent SQL-injection in PHP?-&-Booby Tables
Why shouldn't I use mysql_* functions in PHP?
像那样使用
do..while
时要小心。因为它只在至少运行一次之后进行检查,所以如果没有结果,您可能会得到一些notice
/warning
。关于php - MySQL在PHP while循环内更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38112401/