PHP try / catch et erreur fatale
J'utilise le script suivant pour utiliser une base de données à l'aide de PHP:
try{
$db = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$db, $user, $pass, $options);
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
Maintenant, je veux utiliser cette base de données manche pour faire une demande à l'aide de ce code:
try{
$query = $db->prepare("INSERT INTO users (...) VALUES (...);");
$query->execute(array(
'...' => $...,
'...' => $...
));
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
Voici le problème:
- Lors de la connexion à la DB est OK, tout fonctionne,
- Lorsque la connexion échoue, mais je n'utilise pas la DB, j'ai l'
$GLOBALS['errors'][]
tableau et le script est encore en cours d'exécution par la suite, - Lors de la connexion à la DB a échoué, j'obtient l'erreur fatale:
Notice: Undefined variable: db en C:\xampp\htdocs[...]\test.php sur la ligne 32
Erreur fatale: Appel à un membre de la fonction prepare() sur un non-objet dans C:\xampp\htdocs[...]\test.php sur la ligne 32
Remarque: la Ligne 32 est le $query = $db->prepare(...)
instruction.
C'est-à-dire, le script se bloque, et le try/catch semble être inutile. Savez-vous pourquoi cette deuxième try/catch ne fonctionne pas et comment le résoudre?
Merci pour l'aide!
EDIT: Il y a vraiment de bonnes réponses. J'ai validé un qui n'est pas exactement ce que je voulais faire, mais qui est probablement la meilleure approche.
source d'informationauteur Ploppe
Vous devez vous connecter pour publier un commentaire.
try
/catch
blocs de travail pour les exceptions lancées (throw Exception
ou une sous-classe deException
doit être appelée). Vous ne peut pas attraper les erreurs fatales à l'aide detry
/catch
.Si votre DB connexion ne peut être établie, je pense qu'il serait fatale puisque vous avez probablement besoin de votre DB à faire quelque chose de valable sur la page.
PDO
va lever une exception si la connexion ne peut être établie. Votre problème, c'est que$db
n'est pas définie lorsque vous essayez d'appeler une méthode avec elle, de sorte que vous obtenez un pointeur null (en quelque sorte) qui est fatal. Plutôt que de sauter à traversif ($db == null)
cerceaux d'autres sont ce qui suggère, vous devriez corriger votre code pour vous assurer que$db
est toujours défini lorsque vous en avez besoin ou ont une moins fragile moyen de s'assurer une connexion DB est disponible dans le code qui l'utilise.Si vous voulez vraiment "attraper" erreurs fatales, utilisez
set_error_handler
mais cela s'arrête l'exécution du script sur les erreurs fatales.Si la base de données de la connexion échoue,
$db
à partir de votre premièretry .. catch
bloc sera null. C'est pourquoi, plus tard, vous ne pouvez pas utiliser un membre de la non-objet, dans votre cas$db->prepare(...)
. Avant d'utiliser ce complémentCela permettra d'assurer que vous avez db d'instance de travailler avec elle.
Pourquoi utilisez-vous
try ... catch
consolidés pour le déclarer. Remplacer ceci:Avec:
Ou dans votre chemin:
Essayez d'ajouter le suivant si la déclaration :
Je ne vais pas faire un rapport de ce qui a déjà été écrit à propos de tester si
$db
est vide. Juste ajouter qu'un "nettoyage" de la solution est de créer artificiellement une exception si la connexion à la base de données a échoué:Insérer la ligne précédente dans le
try - catch
comme suit:Espère que cela va aider les autres!
Dans PHP7, nous pouvons maintenant utiliser try catch erreur fatale avec de simples travail
Mais en général, nous devrions éviter d'utiliser des captures d'Erreur, parce que cela implique de manquer de code qui est appartiennent à la responsabilité du programmeur 🙂