PDOStatement->fetchのループ中でクエリーを発行できない

Tags:
  2010/06/23 03:52

PDOStatement->fetchによるループの中で、さらにクエリーを発行できないよってメモ。

コード例。

while(($row = $pdo->fetch()) !== false){
	$id = $row['id'];
	$address = $row['address'];

	$log->debug("id=$id, address=$address");

	$loc = $gm->get_locations(array('address' => $address));
	if ($loc == 0) {
		$log->fatal("google response some error.");
		break;
	} elseif ($loc == 1) {
		$log->error("status=OVER_QUERY_LIMIT");
		break;
	}
	$log->debug("lat={$loc['lat']}, lng={$loc['lng']}");

	$station = $hr->get_stations($loc);
	$stationName = $station['name'];
	$lineName = $station['line'];

	$log->debug("station=$stationName, line=$lineName");

	$query = "UPDATE joboffer SET station_name = '$stationName', line_name = '$lineName', latitude = {$loc['lat']}, longitude = {$loc['lng']} WHERE id = $id";
	$pdo->exec($query);

	$log->debug($query);

	$affected++;

	sleep($interval);

	break;
}

要するに、fetchの途中に更にクエリーを発行することは出来ませんという仕様。

改善するには、

  • fetchAll()してしまう。
    (いや、メモリーが・・・)
  • fetchでループをせずに、idをfor文でまわすなどして逃げる

くらいしか思いつかない。
良い回避策、改善策はないんでしょうか。