2012-01-05 1 views
1

У меня есть приложение CakePHP 2.0 с базой данных MySQL. Две таблицы базы данных связаны с отношением 1: n и ограничением внешнего ключа. Так что, если я хочу, чтобы удалить запись, которая связана в другой таблице базы данных, я получаю ошибку:CakePHP 2.0 - настроить сообщение об ошибке базы данных

Error: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a forein key constraint fails (...) 
SQL Query: DELETE 'Test' FROM 'tests' AS 'Test' WHERE 'Test'.'id' = 10 

Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp 

Но то, что я хочу сделать, это обработать сообщение об ошибке! Я читал кое-что о «OnError», но положить его в «AppModel», похоже, не будет называться (возможно, он работает только с CakePHP 1.3?):

class Test extends AppModel { 
    function onError() { 
     echo "TESTTESTTEST"; 
     $db = ConnectionManager::getDataSource('default'); 
     $err = $db->lastError(); 
     $this->log($err); 
     $this->log($this->data); 
    } 
} 

Так что я могу сделать? Я хочу остаться на этой странице, и я хочу показать только сообщение об ошибке (а не трассировку стека и подобные вещи).

Любая идея?

ответ

1

Как насчет использования .ctp?

Если вы хотите настроить это сообщение об ошибке, создать приложение/View/Ошибки/pdo_error.ctp

Тот, который используется в директории Cake, вы можете просто скопировать, что ваше приложение/View/Ошибки и удалите трассировку стека, если хотите.

Существует также функция обратного вызова функции beforeDelete(), которую вы могли бы использовать для установки flashMessage.

+0

Я хочу, чтобы справиться с этим в контроллере, а не в представлении. – Tim

0

база данных ошибок обычно дают ошибку 500 так CakePHP обрабатывать 500 исключение с помощью View/Ошибки/error500.ctp или приложение/View/ошибки/только pdo_error.ctp и настроить эту страницу

и добавить эту функцию, приведенную ниже в AppController.php

function beforeRender() { 
    if($this->name == 'CakeError') { 
     $this->set('title','Internal error occurs'); 
     $this->layout = 'frontend'; 
    } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^