現在、ループして 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 接続が閉じられていないと想定しています。
このエラー コードに関連する他のドキュメントは見つかりませんでした。
ここで何がうまくいかない可能性がありますか?
以下のような状態で、prepareコマンドとbindコマンドを動かしてみました。例外は発生しませんが、最初のタイルのみが保存されます (または、すべてのタイルが最初のタイルの上に保存されますが、わかりません):
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();
また、例外が発生したときに、$pdo_mbtiles の var_dump を実行すると、結果は次のようになります (成功した場合とまったく同じです)。
object(PDO)#116 (0) {
}
編集:この問題を解決しようとして、コードを単純化して MBTiles ファイルを作成しました。まだ成功していませんが、誰かが問題を再現したい場合は、ここにサンプルがあります. https://www.dropbox.com/s/33vqamc9tn4c3ux/sample_PHP_MBTiles_generation_bug.zip?dl=0からダウンロードできます。