PHP - gestion des erreurs , debogage et écriture du code

jordane45 Messages postés 38140 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 - 2 mai 2022 à 19:28

PHP - gestion des erreurs , debogage et écriture du code

Afficher les erreurs PHP

Avant toute chose.... il est conseillé lorsque vous êtes en train de developper, d'activer
l'affichage des erreurs PHP
.
Vous pouvez faire cette configuration dans le fichier php.ini de votre serveur et/ou directement
dans le code de vos pages (en tout premier....) en y ajoutant ces quelques lignes
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


Dans le fichier php.ini, les instructions se trouvent dans un bloc tel que celui-ci
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; error_reporting is a bit-field.  Or each number up to get desired error
; reporting level
; E_ALL             - All errors and warnings (doesn't include E_STRICT)
; E_ERROR           - fatal run-time errors
; E_WARNING         - run-time warnings (non-fatal errors)
; E_PARSE           - compile-time parse errors
; E_NOTICE          - run-time notices (these are warnings which often result
;                     from a bug in your code, but it's possible that it was
;                     intentional (e.g., using an uninitialized variable and
;                     relying on the fact it's automatically initialized to an
;                     empty string)
; E_STRICT     - run-time notices, enable to have PHP suggest changes
;                     to your code which will ensure the best interoperability
;                     and forward compatibility of your code
; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
;                     initial startup
; E_COMPILE_ERROR   - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR      - user-generated error message
; E_USER_WARNING    - user-generated warning message
; E_USER_NOTICE     - user-generated notice message
;
; Examples:
;
;   - Show all errors, except for notices and coding standards warnings
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices and coding standards warnings
;
error_reporting  =  E_ALL & ~E_NOTICE

Mettre du debug

Bien souvent, un script ne fonctionne pas comme nous le souhaitons mais nous ne savons pas où se situe le problème.
Pour le trouver... le plus simple et d'ajouter, dans son code, un peu de debug.
Le moyen le plus simple est d'afficher le contenu des différentes variables.
Pour un "string" un simple
echo $montexte;
suffit.
Lorsqu'il s'agit d'un objet ou d'un array, l'instruction
print_r($mavariable);
fera l'affaire.

Bien sûr il existe d'autres instructions telle que le var_dump mais je vous laisse regarder par vous même..

Ecrire correctement ses instructions PHP

Il n'existe aucune réelle obligation pour écrire votre code.
Il existe, par contre, une norme dont vous pouvez vous inspirer.
il s'agit de la norme PSR:
https://www.php-fig.org/psr/psr-2/

Récupérer PROPREMENT les variables AVANT de les utiliser

Lorsque l'on utilise des variables (que ça soit des variables provenant de POST, GET, SESSION, COOKIE ....) il est préférable de les "récupérer" proprement avant de les utiliser
dans le reste de son code.
Pour se faire, nous allons nous assurer qu'elles existent.. et si oui.. en récupérer leur valeur.

Pour ça, je vous propose d'utiliser les fonctions ISSET ou !EMPTY (pronnoncez "not empty") avec l'écriture ternaire (l'écriture ternaire étant une "sorte" de if/else)
Par exemple :
//Si la variable $_POST['nom'] existe et n'est pas vide, j'en récupère la valeur, sinon je mets la variable $nom à NULL
$nom = !empty($_POST['nom']) ? $_POST['nom'] : NULL;

NB: isset sert à vérifier qu'une variable existe ( IS SET )
!empty vérifie que la variable n'est pas vide ET qu'elle est isset. Il n'est donc pas nécessaire d'utiliser isset lorsqu'on utilise !empty !

Nommer ses variables

Bien entendu.. on donne des noms qui correspondent à quelque-chose...
Si vous nommez une variable
$prenomUser
.. c'est bien le PRENOM d'un user qu'on s'attend à y trouver... et non pas sa date de naissance.
Sinon, lors de la relecture du code (vous dans 6 mois ou un de vos collègue demain (ou moi si vous venez me poser une question...) il sera compliqué de comprendre le code !

Attention également à ne pas utiliser de caractères spéciaux, de caractères accentués ni d'espace dans le nom de vos variables.
Typiquement :
prénom user <= Erreur !!
$prenom_user // ok
$prenomUser // ok
$prenom-user // a la limite... mais pas valable en Javascript donc à éviter !

Découper son code

smaller is better
Autrement dit.. plus c'est petit( plus c'est mignon?? ... ) mieux c'est !
Il vaut mieux faire 10 fonctions de 10 lignes de code plutôt qu'un pavé de 100 lignes d'un coup.
Niveau maintenabilité et lecture du code c'est quand même mieux.....
Cela évite également de dupliquer du code bêtement...
Combien de fois j'ai pu voir que dans un même code .. un "développeur" avait écrit la même requête à plusieurs endroits de son code ....?!!! (Si un jour il doit y changer un truc.. il devra repasser sur TOUS ses codes pour effectuer la modification... alors qu'avec une fonction.. il ne devra le faire qu'une seule fois ! )

Donc :
- On créer des FONCTIONS
- Si une fonction fait plus de 20 lignes de code... on se pose la question : Ne pourrais-je pas la redécouper en d'autres plus petites fonctions
- Si on n'a pas besoin de "fonction", on peut tout de même placer (centraliser...) les codes redondants dans des fichiers qu'il suffira d'inclure (via des INCLUDE / REQUIRE )

Où placer son code php

Pour faciliter la lecture du code et donc sa maintenance et son deubug... on place, en général, le maximum de code php AVANT son code html.
On évite également d'ouvrir/fermer les balises de code php dans tous les sens..

Connecter son code à une base de données mysql

Je ne vais pas refaire un cours sur la connexion à une bdd.
Notez simplement que les anciennes instructions mysql_* sont OBSOLETES !
Il vous faut désormais passer par les extensions mysqli ou pdo.

Pour PDO, je vous invite à consulter également ce lien :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

NB: Pour faciliter la maintenance de votre code et éviter de devoir réécrire dans chacune de vos pages les instructions de connexion à la bdd, vous devez placer votre code de connexion à la bdd dans un fichier à part (nommé par exemple cnxbdd.php) et l'inclure dans vos pages via un require
require_once "cnxbdd.php";

Souci avec ma reqête SQL

En cas de soucis avec une de vos requêtes SQL, il faut commencer par la tester DIRECTEMENT dans votre BDD.
Soit en utilisant (si il est installé) PHPMYADMIN, soit en utilisant (si vous le pouvez..) un client lourd tel que HeidiSQl ou MysqlWorkbench...
Par exemple : https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql

Poster votre code sur le forum

Lorsque vous posez une question concernant un souci de programmation ou de requête SQL, il faut nous montrer votre code.
Pour cela vous devez le coller directement sur le forum en utilisant les balises de code.
Et surtout... ne nous mettez pas une capture écran (image) .... ça ne nous sert à rien (vu qu'on ne peut pas le copier/coller et que parfois c'est illisible ) !!

N'oubliez pas de nous indiquer le message d'erreur EXACT et COMPLET et de nous préciser la/les ligne(s) de code concernée(s).