mysql_fetch_row没有返回新的更新行

时间:2013-02-26 10:34:36

标签: php mysql

我在mysql中有一个表,如下所示 -

++++++++++++
+ my_table +
++++++++++++
id
is_done
++++++++++++

我有一个PHP脚本,它执行如下操作 -

<?php

$q=mysql_query("SELECT * FROM my_table WHERE is_done=0");

while($res=mysql_fetch_assoc($q)){
  $id=$res['id'];
  //do something lengthy
  sleep(60);  
  mysql_query("UPDATE my_table SET is_done=1 WHERE id='$id'");
}

?>

现在,如果我手动更改mysql中的一行并为该行设置is_done=1,脚本仍会处理该行。如何调整我的脚本以从mysql读取新的和更新的行并跳过已标记为已完成的行?

2 个答案:

答案 0 :(得分:0)

为什么不把简单的事情搞定。使用睡眠的目的是什么?

mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0");

您没有在整个表格中查询并逐个更改。

如果您需要使用睡眠,请尝试以下方法:

mysql_query("UPDATE my_table SET is_done=1 WHERE is_done=0 and id='$id'");

答案 1 :(得分:0)

如果你担心调用不必要的sql语句,我建议将id聚合到一个数组并在循环外更新(性能):

<?php
$q=mysql_query("SELECT * FROM my_table WHERE is_done=0");
$ids = array();
while($res=mysql_fetch_assoc($q)){
$ids[]=$res['id'];
//do something lengthy
sleep(60);
}
mysql_query("UPDATE my_table SET is_done=1 WHERE id IN ('".implode("','", $ids)."')");
?>

对于已包含新数据的行,MySQL不会执行任何操作(没有受影响的行,其中is_done = 1)。

如果您正在执行的操作令人担心,您可以使用Transaction来确保您正在执行的操作是Atomic,或Table Locking以确保不会发生任何更改脚本正在运行。