-1

PHPを使用してファイルデータを処理するために、テキストファイルを空のsqliteデータベースに解析しています。私はデータベース接続を確立します:

try {
  $db = new PDO('sqlite:temp.db');
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
  echo 'Connection failed: ' . $e->getMessage();
  die($error);
}

ユーザー ファイル データは大きく、順序付けされておらず、複数の内部外部キー依存関係があるため、外部キーで DEFERRABLE INITIALLY DEFERRED を使用して、データを単一のトランザクションとして挿入します。元の入力データが正しい限り、これはうまく機能します。ユーザー入力エラーが発生すると、トランザクション全体に対して 1 つの一般的な例外が発生します (もちろん、その後ロールバックされます)。ユーザー エラーは、未定義の外部キー参照として現れることがよくありますが、これだけではありません。

ユーザー入力エラーを追跡するのに役立つ、例外を引き起こしたトランザクション内の個々の挿入ステートメント、または欠落していた特定の外部キーなど、より多くの情報を取得する方法を誰かが提案できますか?

ユーザー入力データには順序がなく、そのデータはその構造が複雑であるため、コミット前に検証することが非常に複雑になるため、可能であればその側面を手動でコーディングすることは避けたいと考えています。

4

2 に答える 2

0

この回答は、準備済みステートメントを使用しているという前提に基づいています

そうでない場合は、必要な調整を行う必要があります。

A. 配列内のパラメーターを収集する

$params = array(':name' => 'foo', ':cat' => 'bar', ':val' => 'baz', [...]);

B. を呼び出す前にexecute($params)、次のようにして、使用しているパラメーターをファイルに登録します。

file_put_contents('file.log', implode(';', $params) . "\r\n"); //or "\n" on linux, "\r" on mac

C.コールexecute($params)

D. クエリが成功した場合、GOTO A、そうでない場合は終了します。

この単純なアルゴリズムを使用するfile.logと、正常に挿入されたすべてのパラメーターと間違ったパラメーター (最後の行) を含むログファイル ( という名前) が作成されます。

考えられる改善:

ファイルを何度も開いたり閉じたりするため、このアルゴリズムは効率的ではありません。効率を重視する場合は、代わりに次の手順に従ってください。

X. 定義する$log = array();

A. 配列内のパラメーターを収集する

$params = array(':name' => 'foo', ':cat' => 'bar', ':val' => 'baz', [...]);

B. を呼び出す前にexecute($params)、次のようにして、使用しているパラメーターを保存します。

$log[] = implode(';', $params) . "\r\n"; //or "\n" on linux, "\r" on mac

C.コールexecute($params)

D. クエリが成功した場合は GOTO A、それ以外の場合はfile_put_contents('file.log', implode("\r\n", $log));.

最終的な考慮事項

上記の提案を、エラーによって発生した PDO 例外と組み合わせます。そのスタックは、デバッグ目的で常に非常に役立ちます。

pdo で例外を有効にするには、接続後に次のコマンドを使用します。

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
于 2013-05-14T14:33:33.360 に答える