我已经制作了一个PHP脚本,从名称创建徽标,来自MySQL数据库的数千条记录。
创建一个标志每条记录最多需要几秒钟,所以整个过程需要几天的时间。我现在所做的脚本,事先得到所有的数据,然后开始制作的标志。但是,当脚本运行时,尚未处理的记录中的数据可能会更改!
我如何通过一个结果集迭代,同时仍然得到最新的数据时,下一个记录的处理?
这是我现在使用的:
$sql = "SELECT * FROM names";
$mysqli = new mysqli($server, $user, $password, $database);
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($record = mysqli_fetch_assoc($result)) {
$records[] = $record
}
$result->close();
}
} while ($this->DB->next_result());
}
foreach($records as $record) {
//create the logo from $record['name']
}
假设数据库中的每个条目都有唯一的ID,并且您确信该脚本可以"永远"运行,那么像这样的东西应该可以工作:
$result = mysql_query('SELECT `id` FROM `logos`');
$ids = array();
while($id = mysql_fetch_row($result)){
$ids[] = $id[0];
}
// we now have all the ids stored in an array which we'll loop through.
foreach($ids as $id){
$result = mysql_query('SELECT * FROM `logos` WHERE `id`=' . $id);
$row = mysql_fetch_assoc();
// process
}
这是做什么呢?我们首先获取当前驻留在数据库中的所有ID。我们将它们存储在一个变量中,循环遍历该变量并获取每一行的最新数据。
正如其他人所说,您不能在拥有最新数据的同时迭代结果集。
我可能会逐个获取行,从最低的id开始,然后只是增加一个id,直到达到最大id。如果没有这个id的记录,就跳到下一个。
那么当数据被转换成图像时会发生什么呢?数据行保留在表中吗?
没关系,你可以把LIMIT 1加到SELECT的末尾,你就会得到第一个符合你请求的条目。
您可以折衷一下,比如一次获取30行。你可以实现某种机制,将任何更新的行添加到重做列表中。
编辑:表多久更新一次?一半的结果集变化不同于30%的结果集变化。这是一次性行动吗?如果经常这样做,那么您将一遍又一遍地检查整个结果集,寻找更改。另外,如果您来到第987行,创建了一个徽标,当您移动到第1032行时,有人更改了第987行,会发生什么情况?
如果更新活动是最小的,我会尝试获得整个结果集,创建一个更新触发器事件来记录更改,做所有的徽标,然后返回并根据日志更新徽标。(这可能有点过头了)
你不能。您需要手动一步一步地遍历行,每次查询一行。当您发出SELECT
查询时,MySQL会缓冲结果。因此,当数据在发出查询和获取行之间发生变化时,您将获得旧的缓冲数据。
如果您不想为每一行运行查询,您可以简单地批量执行。例如,查询100条记录并对其进行处理。查询下一个100,依此类推