В настоящее время я пытаюсь создать карту MBTiles и каждый раз добавлять информацию в свою базу данных. Вот как я настроил свое соединение и выполнил действия в цикле:
if ($pdo_mbtiles == null) { echo "Opening new database connection".PHP_EOL; $pdo_mbtiles = new PDO('sqlite:'.$filename, '', '', array( PDO::ATTR_PERSISTENT => true ) ); $pdo_mbtiles->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo_mbtiles->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } $q = $pdo_mbtiles->prepare("INSERT INTO tiles (zoom_level, tile_column, tile_row,tile_data) VALUES (:zoom_level, :tile_column, :tile_rowTMS, :tile_data)"); $q->bindParam(':zoom_level', $zoom_level); $q->bindParam(':tile_column', $tile_column); $q->bindParam(':tile_rowTMS', $tile_rowTMS); $q->bindParam(':tile_data', $tile_data, PDO::PARAM_LOB); $q->execute();
После цикла 1018 циклов (это число не меняется независимо от того, сколько раз я пытаюсь), я получаю это сообщение об ошибке:
SQLSTATE[HY000]: General error: 14 unable to open database file
Я проверил решение, написанное здесь: Как предотвратить SQLITE SQLSTATE [HY000] [14]? но эхо-сообщение появляется только в первый момент цикла, поэтому я предполагаю, что соединение PDO не закрыто.
Я не нашел другую документацию, относящуюся к этому коду ошибки.
Что здесь может пойти не так?
Я попытался переместить команды подготовки и привязки в состояние следующим образом. Исключение не возникает, но сохраняется только первая плитка (или каждая плитка сохраняется поверх первой, не уверен):
if ($pdo_mbtiles == null) { echo "Opening new database connection".PHP_EOL; $pdo_mbtiles = new PDO('sqlite:'.$filename, '', '', array( PDO::ATTR_PERSISTENT => true ) ); $pdo_mbtiles->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo_mbtiles->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } if ($q == null) { $q = $pdo_mbtiles->prepare("INSERT INTO tiles (zoom_level, tile_column, tile_row,tile_data) VALUES (:zoom_level, :tile_column, :tile_rowTMS, :tile_data)"); $q->bindParam(':zoom_level', $zoom_level); $q->bindParam(':tile_column', $tile_column); $q->bindParam(':tile_rowTMS', $tile_rowTMS); $q->bindParam(':tile_data', $tile_data, PDO::PARAM_LOB); } $q->execute();
Вот файлы во время генерации:
И вот после исключения возникает:
Кроме того, когда возникает исключение, я делаю var_dump своих $ pdo_mbtiles, и вот результат (точно так же, как когда я делаю это с успехом):
object(PDO)#116 (0) { }
Изменить: все еще пытаясь решить эту проблему, я упростил код для создания файла MBTiles. Пока нет успеха, но вот образец, если кто-то хочет воспроизвести проблему. Вы можете скачать его с https://www.dropbox.com/s/33vqamc9tn4c3ux/sample_PHP_MBTiles_generation_bug.zip?dl=0