我有一个带有“编辑”页面的自定义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说它不是真的,因为该字段与在数据库中(没有变化)。真的,如果有数据库/代码错误,我只想停止它。
Drupal 7 db_update API是否有某种错误报告功能,如mysql_error()?其他建议?
答案 0 :(得分: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)
}
我应该提到只有在第二个查询失败时,如果您不希望 first 查询中的更改持续存在,则才需要进行事务处理。这是一个非常常见的要求,但可能不适合您的使用案例。