PDOPHPSQLite3データベース接続一般エラー14
2つのsqlite3.xデータベース(iPhoneから)があります。1つはゲームアプリからのもので、もう1つはアドレス帳です。
phpconfで'on'のログと表示エラーがあります。
PHP / PDOを使用すると、結果ページで取得して「img src ='data:...」でレンダリングした画像ブロブを含む、ゲームデータベースのフィールドと値を表示できます。 plistバイナリブロブなどをキャッチする他のフィールド。
最初のページを生成するためにperlスクリプトを使用しており、サンプルデータはsqlite3へのシステムコールを使用して取得されます。スクリプトは、cli引数として提供されたディレクトリを再帰的に検索しています。
基本的に、データベース内の各テーブルから(データサンプルとして)最初のレコードを取得し、さらに問い合わせるフィールドのオプションをユーザーに提供し、それらのオプションをフォームハンドラーに渡します。フォームハンドラーは、ターゲットに対してクエリを実行します。テーブル、および選択した列からのデータの取得。
しかし...アドレス帳データベースに接続しようとすると、「データベースを開くことができません」という一般的なエラーが発生します。
データベースのアクセス許可と所有権を確認し、両方を同じディレクトリに配置して、完全に公開しました。考えられるすべてのことを実行しましたが、それでも喜びはありません。
本当に奇妙なのは、sqlite3を使用してコマンドラインからすべてのデータベースに非常にうまくクエリを実行できることですが、PDOを使用するとこのエラーが発生します。
すべてが次のようにつまずきます:
($db and $strSQL vals passed from previous page)
$dbh = new PDO('sqlite:'.$db);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$result = $dbh->query($strSQL);
テーブルから単純な主キー列を選択してもエラーが発生するので、データ処理の問題ではないと確信しています。 FirefoxとChromeデータベースに対してこれと同じスクリプトを試したこともあります...まったく問題ありません。
アイデア/ポインタ/提案を本当にいただければ幸いです。これは私の頭を使っています!
乾杯。
答え :
解決策:
OK ...データベースファイル自体が広く開かれているにもかかわらず(chmod 777)、それらが置かれているディレクトリは書き込み可能でなければならないようです。コマンドラインからのsqliteが書き込み可能なディレクトリを必要としないことでどのように回避されるかはまだわかりませんが、PHP/PDOクエリには確かに必要です。
結果を表示していなかったデータベースには、ログ先行書き込み(WAL)ビットが設定されており(ファイルヘッダーのバイト18および19)、SQLiteがデータベースのWALバージョンを作成できるようにディレクトリを書き込み可能にする必要があります。照会されました。バイト18と19は、非WALデータベースの場合は0x01と0x01に設定され、WAL対応データベースの場合は0x020x02に設定されます。
何が原因でしたか?...クエリを再実行してたまたま移動したときに、ファイル名の末尾に「-wal」と「-shm」が追加されたアドレス帳データベースファイルのコピーが突然表示されました。 DBをテスト用の書き込み可能なディレクトリに入れます。
図を見てください!
PS。。 興味深いことに、ジャーナルモードが変更されるたびに(dbクエリ "pragma journal_mode = [wal | off]"を使用)、バイト94および95の2バイトカウンターが1ずつ増加します。モード間を切り替えるときにdbのハッシュ値をチェックするときにこれに注意し、同じ2つのハッシュを取得できませんでした。データベースの前後でxxdを実行し、出力をtxtファイルにパイプ処理してから、2つのtxtファイルを差分しました...これらのカウンターバイトがありました。
答え :
解決策:
「データベースを開くことができません」というエラーメッセージに基づいて、sqliteファイルにアクセスできません。 前のページの「$db」変数を確認したと思います。
明確な答えを出すのは難しいです。 sqliteファイルまたはPHPコードに問題があるかどうかを確認するために、PDOなしで試すことができますか。
結果を投稿して見てみましょう。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。