En fait tu peux deriver le driver de la database que tu as, c'est que
j'ai fait pour recuperer les erreurs en mode debug = 0;
Dans la directory model, j'ai la directory dbo, qui contient un
fichier que j'ai appelle dbo_mysql_log:
require_once(LIBS . 'model' . DS . 'datasources' . DS . 'dbo' . DS .
'dbo_mysql.php');
class DboMysqlLog extends DboMysql
{
function _execute($sql)
{
// force to log the query even in No debug mode
if(Configure::read() < 2)
$this->logQuery($sql);
return parent::_execute($sql);
}
}
Dans database.php j'utilise ce driver au lieu du dbo_mysql :
var $default = array(
'driver' => 'mysql_log',
'persistent' => false,
'host' => DB_HOST,
....
Ensuite pour recuperer les erreur, il suffit dans app_model d'un truc
du genre :
function getTransactionLog($transact = true)
{
$db =& ConnectionManager::getDataSource($this->useDbConfig);
$lstep = $db->_queriesLog;
end($lstep);
if(Configure::read() < 2)
{
if(isset($db->error))
$lstep[key($lstep)]['error'] = $db->error;
}
if($transact)
{
$i = 1;
// step back until start transaction
do
{
$v = current($lstep);
if($v['query'] == 'START TRANSACTION')
break;
$i++;
}while(prev($lstep) !== FALSE);
return array_slice($lstep, ($i * -1));
}
return current($lstep);
}
Cette derniere function peut etre plus simple, mais comme j'utilise le
mode transactionnel je recupere toute la transaction, du start au
commit (ou rollback)..
J'espere que ca peut aider.
On Jun 16, 6:12 pm, Marc MENDEZ <[EMAIL PROTECTED]> wrote:
> Bonjour avairet ,
>
> Merci pour ta réponse. Je n'ai pas encore tous les réflexes "Cake"ent
> concernant la méthodologie de travail. Ta suggestion est très intéressante.
> Avant de te répondre, j'ai fait quelques recherches à partir de la voie
> que tu m'as montré :
>
> Je ne suis pas arrivé à utiliser onError().
> J'ai créé un app/app_model.php (class AppModel extends Model) ou même un
> app/app_controller.php (class AppController extends Controller), ça ne
> fait rien.
>
> En ce qui concerne la récupération du n° d'erreur, j'ai fouillé dans les
> classes, et je suis arrivé à la solution suivante , au niveau de mon
> modèle :
>
> if (!($ret = $this->query($sql)))
> {
> $db =& ConnectionManager::getDataSource($this->useDbConfig);
> $err = mysql_errno ($db->connection);
> // traitement de l'erreur par un switch
> }
>
> Le hic, c'est que si debug != 0, j'ai forcément le texte par défaut de
> Cake qui apparait. Or, que je sois en développement ou en production, si
> je fais un traitement de l'erreur 1062 (unicité), je ne veux plus que
> cake m'affiche son immonde message d'erreur. Mais c'est peut-être au
> niveau de onError() que je peux l'éviter (... et comme je suis pas
> arrivé à l'implémenter, ben, je peux pas vérifier..., peut-être
> pourras-tu me dire où ça coince ?).
>
> Autre remarque : comme il n'y a pas de méthode dans la dbo_* pour
> récupérer le code erreur, mon code est "générique" jusqu'au
> mysql_errno... car là, je suis "ficellé" avec mysql...
> Mais après tout, rien ne m'empêche de créer une méthode dans MON
> app_model qui récupère l'erreur sql.
>
> Quant à créer des contraintes dans la base, tu prêches un convaincu ! Je
> suis effaré de voir combien de personnes proposent comme solution au
> problème que j'ai levé dans ce post, d'utiliser simplement "IsUnique()"
> ou d'autres méthodes à lancer avant la sauvegarde ! A croire qu'ils
> n'ont jamais développé des applications multi utilisateurs, ou qu'ils
> n'ont qu'un utilisateur connecté à la fois !
> Pire, certains même engueule celui qui pose la question en lui
> rétorquant que s'il en est à tester les erreurs sql, c'est que son appli
> est mal foutue !!!
>
> Bref, merci de ton aide et j'espère t'avoir aidé aussi ;)
--~--~---------~--~----~------------~-------~--~----~
Groupe "Cakephp-fr".
Adresse : [email protected]
Pour résilier : [EMAIL PROTECTED]
Pour les options : http://groups.google.com/group/cakephp-fr?hl=fr
-~----------~----~----~----~------~----~------~--~---