2013-04-24 114 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