Programmation PHP/Problèmes connus
Le processus de débogage est relativement le même d'un bug à l'autre :
La liste suivante doit permettre de gagner du temps pour solutionner les erreurs que l'on peut trouver dans les logs.
Erreurs sans message PHP.
IIS tourne dans le vide après la mise à jour de PHP.
Vérifier que les dépendances sont bien installées (ex : Visual C++).
Les modifications du php.ini ne sont pas prises en compte dans phpinfo.
Sur Wamp, redémarrer PHP et Apache ne suffit pas car Apache contient une copie du php.ini dans C:\wamp64\bin\apache\apache2.4.54.2\bin, créée lors de la sélection de la version de PHP (au clic sur PHP/Version).
La connexion a été réinitialisée.
Erreur sous Firefox provenant d'un codice_1 ou d'une directive Apache.
La page n'est pas redirigée correctement.
Un codice_2 revient en boucle après une suite de conditions. S'il est local, le remplacer par codice_3.
Le code PHP n'est pas interprété (et est affiché).
Si codice_4 indique que le module est déjà installé, c'est peut-être lié à codice_5. Cela peut se régler avec :
vim /etc/apache2/mods-enabled/php7.4.conf
Commenter les lignes :
<IfModule mod_userdir.c>
</IfModule>
Et relancer Apache.
Sinon c'est peut-être le vhost utilisé qui n'est pas le bon (voir /var/log/apache2) ou qu'il ne contient pas :
 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
 <Directory "/usr/lib/cgi-bin">
 Require all granted
 AllowOverride None
 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
 Allow from all
 </Directory>
Les dernières lignes d'un INSERT sont ignorées.
Il faut fragmenter en plusieurs insertions, par exemple tous les 300 enregistrements.
Un regex marche sur https://regex101.com/ mais pas en local.
Si la machine est Windows, tenir compte de la différence de retour chariot : codice_6 au lieu de codice_7.
Un type checking d'argument considère NULL comme une valeur à ne pas écraser par celle par défaut.
En PHP7.4.
 composer update
PHP natif.
Connect Error, 2002: Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée..
Relancer le serveur de base de données.
Connect Error, 2002: Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hôte de connexion n'a pas répondu..
Ouvrir les pare-feux.
Invalid body indentation level (expecting an indentation level of at least 8).
En PHP7.3, la syntaxe heredoc impose de supprimer l'indentation de la balise fermante : elle soit suivre "\n".
json_decode renvoie NULL (aléatoirement).
Ajouter le paramètre 4 : JSON_THROW_ON_ERROR.
json_decode throw "Control character error, possibly incorrectly encoded".
La string à décoder est trop longue.
MySQL server has gone away.
La limite des 61 jointures a peut-être été atteinte dans une requête. Sinon vérifier les limites des ressources (du .ini) : par défaut default_socket_timeout égal 60 s.
This extension requires the Microsoft ODBC Driver 11 for SQL Server.
Installer le pilote depuis https://www.microsoft.com/en-us/download/details.aspx?id=36434.
Unable to initialize module. Module compiled with module API=x. PHP compiled with module API=y. These options need to match.
Se procurer une autre DLL à renseigner dans PHP.ini.
You can only iterate a generator by-reference if it declared that it yields by-reference.
Se produit quand on itère sur la référence d'un générateur PHP :
foreach ($generator as &$item) {
Il faut donc retirer l'opérateur de référence (&) de l'itération...
Cannot traverse an already closed generator.
Un codice_8 le ferme en le convertissant en tableau.
child exited on signal 7 (SIGBUS).
Modifier le php.ini :
pm.max_children = 80
pm.max_spare_servers = 20
pm.max_requests = 200
apc.stat = 0
max_children est calculé en divisant la RAM par la taille des processus.
Invalid resource type: unknown type.
Le paramètre n°2 de fopen() ne permet pas la lecture.
Each stream must be readable.
On essaie de lire un fichier fermé : déplacer le codice_9 après s'il y en a un avant.
fclose(): supplied resource is not a valid stream resource.
On essaie de fermer un fichier fermé : utiliser codice_10 avant.
SSL peer certificate or SSH remote key was not OK.
Lors d'un codice_11, ajouter :
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
ou :
 $options['verify_host'] = false;
 $options['verify_peer'] = false;
Fatal error.
// On récupère une variable dont on ne connait pas le type pour en faire un tableau
if (!isset($tableau1)) {
 $tableau1 = array();
} elseif (is_string($tableau1)) {
 $tableau1 = array($tableau1);
$tableau1[] = 'paramètre suivant';

Modifier le PHP.ini ou bien ajouter une autre limite dans le programme :
 ini_set('memory_limit', '100M');
Pour faire sauter la limitation :
 ini_set('memory_limit', '-1');
Si c'est dans une commande :
 php -d memory_limit=-1 ma_commande
Si c'est Composer :
COMPOSER_MEMORY_LIMIT=-1 ./composer.phar update
Sinon, utiliser Xdebug en mode pas à pas pour visualiser les variables à supprimer (avec codice_12).
La méthode est invoquée sur une variable qui n'est pas une classe.

Si une fonction est définie mais qu'on ne peut pas l'invoquer dans une méthode de classe, il faut préalablement l'importer en tenant compte du polymorphisme.

Installer le pilote correspondant à la version de PHP du serveur Web :
La méthode est invoquée sur une classe qui ne l'a pas.
Si elle est censée l'avoir c'est qu'elle n'est pas récupérée, ce qui peut arriver avec les jointures entre entités d'ORM.
Une variable non définie ne peut pas fournir de propriété. Si elle était définie ailleurs c'est qu'elle est inaccessible, et donc qu'il faut la récupérer (ex : avec codice_13).

La précédente connexion n'a pas dû être fermée proprement avant une tentative de reconnexion. Essayer au choix :
mysql_close($conn); // MySQL
sqlsrv_close($conn); // MS-SQL
odbc_close($conn); // ODBC
Éditer le PHP.ini pour augmenter la ligne :
 memory_limit = 256M
Installer et configurer le paquet suivant :
apt-get install -y locales
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen

Sur le serveur Web Windows, dans "démarrer", exécuter "dcomcnfg" (sinon y aller dans "Outils d'administration", "Service de composants"), puis "Ordinateurs", "Poste de travail", "Configuration DCOM", aller dans les propriétés de l'application mentionnée, puis dans l'onglet "Sécurité", définir la première permission (Autorisations d'exécution et d'activation" à "Personnaliser" et ajouter le compte du serveur ou site qui exécute le script (ex pour ISS : IIS_IUSRS ou IUSR).
Par exemple pour Word l'application se prénomme "Document Microsoft Office Word", et Excel "Microsoft Excel Application".

Il faut certainement rerégler la Configuration DCOM voire le serveur Web.

Se référer à la liste des pilotes connus dans ../PDO#Installation.
PDO ne gère pas le code SQL "set @ma_variable" ou "if". Donc il faut plutôt faire ces calculs en PHP.
Si l'utilisateur existe avec les privilèges nécessaires, y compris depuis toute localisation (@%), il faut quand-même créer un deuxième compte homonyme pour l'emplacement distant (ex : 'username'@'example.com'). Par exemple dans phpMyAdmin, remplir la provenance mentionnée en erreur ('example.com') dans le champ "Client".
Se référer à ../PDO#Accès à la base de données avec PDO : la source de données ODBC doit être suivie du compte pour y accéder.
Se référer à ../PDO#Accès à la base de données avec PDO : la source de données ODBC doit être créée dans C:\Windows\SysWOW64\odbcad32.exe.
Se référer à ../PDO#Accès à la base de données avec PDO : le paramètre 'host' est valide pour MySQL mais pas pour MS-SQL.
Se référer à ../PDO#Accès à la base de données avec PDO : les virgules et points-virgules changent d'un pilote à l'autre.
Se référer à ../PDO#Accès à la base de données avec PDO : utiliser la syntaxe ODBC.
Notice.
La propriété de la variable n'est pas déclarée.