2013-04-24 108 views
2

我有一個定製的Drupal 7模塊,帶有'編輯'頁面。Drupal 7 db_update - 檢查錯誤

表單字段引用了一對數據庫表,因此爲了處理表單,我們嘗試更新第一個表,並且在嘗試之前嘗試將'$ 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表示它不是真的,因爲該字段與數據庫中的字段相同(不變)。真的,如果有數據庫/代碼錯誤,我只想停止它。

Drupal 7 db_update API是否具有某種錯誤報告功能,如mysql_error()?其他建議?

+0

僅供參考,您可能會從http://drupal.stackexchange.com獲得更具體的答案。 – EmmyS 2013-04-24 21:43:55

回答

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) 
} 

我應該提到交易僅必要的,如果你不想從第一查詢變化如果第二個查詢失敗,則堅持。這是一個相當常見的要求,但可能不適合您的使用案例。

+0

我試過了,這正是我所需要的 - try/catch異常。但是我希望能像db_transaction() - > rollback一樣向前邁進一步。這是否適用於Drupal的db_update?也許我沒有正確實施它。 – nitsuj 2013-04-24 21:10:13

+0

@nitsuj我剛剛更新了答案,最後一點幫助嗎? – Clive 2013-04-24 21:11:04

+0

這是絕對有必要的:我不想讓第二個查詢在第一個查詢失敗的情況下持續存在,因此我將$ error變量設置爲true,並且效果很好。但理想情況下,讓每個查詢都失敗。 – nitsuj 2013-04-24 21:12:29