2

「編集」ページを備えたカスタム Drupal 7 モジュールがあります。

フォーム フィールドはいくつかのデータベース テーブルを参照するため、フォームを処理するために最初のテーブルを更新しようとし、次のテーブルを更新する前に「$error」を「true」に設定して $error をチェックします。テーブル。例えば:

HTML:

<input name="field1" />
<input name="field2" />

PHP:

$error = false;

$update_table_1 = db_update('table1')
    ->fields(array(
        'field1' => $_POST['field1'],
    ))
    ->condition('id', $id)
    ->execute();

if(!update_table_1) {
    $error = true;
}

if(!$error) {
    $update_table_2 = db_update('table2')
        ->fields(array(
            'field2' => $_POST['field2'],
        ))
        ->condition('id', $id)
        ->execute();

    if(!$update_table_2) {
        $error = true;
    }
}

問題:テーブル 2 の何かを更新するだけの場合、イベントがテーブル 2 を更新する前にエラーがスローされます。これは、フィールドがデータベース内のものと同じ (変更なし) であるため、db_query が true ではないことを示しているためです。本当に、データベース/コードエラーがあった場合にのみ停止したい.

Drupal 7 db_update API には、mysql_error() のような何らかのエラー報告機能がありますか? 他の提案?

4

1 に答える 1

4

最も安全な方法は、トランザクションと適切な PHP エラー チェックを使用することです。

$transaction = db_transaction();

try {
  // Query 1
  db_update(...);

  // Query 2
  db_update(...);
}
catch (Exception $e) {
  // Rollback the transaction
  $transaction->rollback();

  // Do something with the exception (inform user, etc)
}

トランザクションは、 2 番目のクエリが失敗した場合に最初のクエリからの変更を保持したくない場合にのみ必要です。これは非常に一般的な要件ですが、ユースケースに合わない場合があります。

于 2013-04-24T20:57:47.650 に答える