我制作了一个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']
}
答案 0 :(得分:4)
假设您对数据库中的每个条目都有唯一的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。我们将它们存储在变量中,循环遍历它并获取每行的最新数据。
正如其他人所说,你不能在同时拥有最新数据的同时迭代结果集。这是另一种选择。
答案 1 :(得分:1)
我可能会从最低的id开始逐个获取行,然后将该id增加1,直到达到最大ID。如果没有带有该ID的记录,只需跳转到下一个。
答案 2 :(得分:0)
那么当数据转换成图像时会发生什么?数据行是否保留在表格中?
不重要,您只需将LIMIT 1添加到SELECT的末尾,您就可以获得与您的请求匹配的第一个条目。
答案 3 :(得分:0)
你可以通过一次获得30行来妥协。您可以实现某种将任何更新的行添加到重做列表的机制。
编辑:
表格多久更新一次?结果集更改的一半与30ish更改不同。这是一次性的操作吗?如果经常这样做,那么你将一遍又一遍地浏览整个结果集,寻找变化。此外,如果你来到第987行,创建一个徽标,当你转到第1032行,有人会更改第987行,会发生什么?
如果更新活动是最小的,我会尝试获取整个结果集,创建更新触发事件以记录更改,执行所有徽标,然后根据日志记录返回并更新徽标。 (这可能有点矫枉过正。)
答案 4 :(得分:-1)
你不能。您需要一次一个地手动执行一行,每次查询一行。当您发出SELECT
查询时,MySQL会缓冲结果。因此,当发出查询和获取行之间的数据发生变化时,您将获得旧的缓冲数据。
如果您不想为每一行运行查询,您可以简单地批量执行。例如,查询100条记录并对其进行处理。查询下一个100等等。