Programmation PHP/Erreurs connues

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


La liste suivante doit permettre de gagner du temps pour solutionner des bugs de développement.

Sections

Erreurs sans message PHP[modifier | modifier le wikicode]

IIS tourne dans le vide après la mise à jour de PHP[modifier | modifier le wikicode]

Vérifier que les dépendances sont bien installées (ex : Visual C++)[1].

La connexion a été réinitialisée[modifier | modifier le wikicode]

Erreur sous Firefox provenant d'un mysql_close() ou d'une directive Apache.

La page n'est pas redirigée correctement[modifier | modifier le wikicode]

Un header revient en boucle après une suite de conditions. S'il est local, le remplacer par chdir().

Les dernières lignes d'un INSERT sont ignorées[modifier | modifier le wikicode]

Il faut fragmenter en plusieurs insertions, par exemple tous les 300 enregistrements.


PHP natif[modifier | modifier le wikicode]

Connect Error, 2002: Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée.[modifier | modifier le wikicode]

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.[modifier | modifier le wikicode]

Ouvrir les pare-feux.

This extension requires the Microsoft ODBC Driver 11 for SQL Server[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

Un iterator_to_array($generator) le ferme en le convertissant en tableau.

Invalid resource type: unknown type[modifier | modifier le wikicode]

Le paramètre n°2 de fopen() ne permet pas la lecture[2].

Each stream must be readable[modifier | modifier le wikicode]

On essaie de lire un fichier fermé : déplacer le fclose() après s'il y en a un avant.

fclose(): supplied resource is not a valid stream resource[modifier | modifier le wikicode]

On essaie de fermer un fichier fermé : utiliser if (is_resource($f)) avant.

Fatal error[modifier | modifier le wikicode]

[] operator not supported for strings[modifier | modifier le wikicode]

// 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';

Allowed memory size of x bytes exhausted[modifier | modifier le wikicode]

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");

Call to a member function ... on a non-object[modifier | modifier le wikicode]

La méthode est invoquée sur une variable qui n'est pas une classe.


Call to undefined function[modifier | modifier le wikicode]

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.


Call to undefined function sqlsrv_connect()[modifier | modifier le wikicode]

Installer le pilote correspondant à la version de PHP du serveur Web :

  1. Télécharger sur https://www.microsoft.com/en-us/download/details.aspx?id=20098.
  2. Copier dans le dossier PHP (ex : C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\ext).
  3. Ajouter à PHP.ini.
  4. Redémarrer le serveur Web.

Call to undefined method[modifier | modifier le wikicode]

La méthode est invoquée sur une classe qui ne l'a pas.


Cannot access empty property[modifier | modifier le wikicode]

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 global).


Error connecting to the ODBC database: [Microsoft][SQL Server Native Client 10.0][SQL Server]échec de l'ouverture de session de l'utilisateur[modifier | modifier le wikicode]

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


Out of memory[modifier | modifier le wikicode]

Éditer le PHP.ini pour augmenter la ligne :

memory_limit = 256M

pdo_sqlsrv_db_handle_factory: Unknown exception caught[modifier | modifier le wikicode]

Installer et configurer le paquet suivant :

apt-get install -y locales
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen

Uncaught exception 'com_exception' with message 'Failed to create COM object `xxx.application': Accès refusé.[modifier | modifier le wikicode]

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".


Uncaught exception 'com_exception' with message 'Source: Microsoft Office Excel Description: Mémoire insuffisante.[modifier | modifier le wikicode]

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


Uncaught exception 'PDOException' with message[modifier | modifier le wikicode]

could not find driver[modifier | modifier le wikicode]

Se référer à la liste des pilotes connus dans Programmation PHP/PDO#Installation.

SQLSTATE[HY000]: General error[modifier | modifier le wikicode]

PDO ne gère pas le code SQL "set @ma_variable" ou "if". Donc il faut plutôt faire ces calculs en PHP.

SQLSTATE[28000] [1045] Access denied for user[modifier | modifier le wikicode]

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".

SQLSTATE[28000] SQLConnect: 18456 [Microsoft][ODBC SQL Server Driver][SQL Server] Échec de l'ouverture de session de l'utilisateur[modifier | modifier le wikicode]

Se référer à Programmation PHP/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.

SQLSTATE[IM002] SQLConnect: 0 [Microsoft][Gestionnaire de pilotes ODBC] Source de données introuvable et nom de pilote non spécifié[modifier | modifier le wikicode]

Se référer à Programmation PHP/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.

SQLSTATE[IMSSP]: An invalid keyword 'host' was specified in the DSN string[modifier | modifier le wikicode]

Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : le paramètre 'host' est valide pour MySQL mais pas pour MS-SQL.

SQLSTATE[IMSSP]: The DSN string ended unexpectedly[modifier | modifier le wikicode]

Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : les virgules et points-virgules changent d'un pilote à l'autre.

SQLSTATE[IMSSP]: This extension requires the Microsoft SQL Server 2012 Native Client ODBC Driver to communicate with SQL Server[modifier | modifier le wikicode]

Se référer à Programmation PHP/PDO#Accès à la base de données avec PDO : utiliser la syntaxe ODBC.

Notice[modifier | modifier le wikicode]

Undefined property[modifier | modifier le wikicode]

La propriété de la variable n'est pas déclarée.


Undefined index: SERVER_NAME in ...php[modifier | modifier le wikicode]

Certaines versions de PHP utilisent $_SERVER['HTTP_HOST'] au lieu de $_SERVER['SERVER_NAME'].

Undefined variable[modifier | modifier le wikicode]

La variable n'est pas déclarée.

Use of undefined constant[modifier | modifier le wikicode]

La constante n'est pas déclarée.

Parse error[modifier | modifier le wikicode]

syntax error, unexpected '(', expecting variable (T_VARIABLE) or '$' in...[modifier | modifier le wikicode]

Séparer le $ dans la chaine (ex : {$ -> { $).


syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)[modifier | modifier le wikicode]

Remplacer les variables incluses dans des chaines. Ex :

$query="select $contact['member']"; // pas bien
$query="select ".$contact['member']; // bien

syntax error, unexpected '$Variable' (T_VARIABLE), expecting function (T_FUNCTION)[modifier | modifier le wikicode]

Dans une classe en dehors des méthodes, il faut déclarer les variables avec leur portée :

private $Variable;

Strict Standards[modifier | modifier le wikicode]

Declaration of extFunctions::logs() should be compatible with functions::logs($chaine)[modifier | modifier le wikicode]

La fonction (logs() dans l'exemple) existe déjà, peut-être avec des majuscules (peu importe les arguments).

Only variables should be passed by reference[modifier | modifier le wikicode]

Il faut appliquer la fonction end() sur une variable au lieu du résultat d'une opération[3]. Ex :

// $extension = end(explode('.', $fichier));
$ext = explode('.', $fichier);
$extension = end($ext);

Warning[modifier | modifier le wikicode]

Cannot use a scalar value as an array[modifier | modifier le wikicode]

Un tableau de valeurs ne peut pas être redéfini en tableau de tableaux si elles existent. Remplacer les cas ainsi :

$tab['1'] = 1;
//$tab['1']['un'] = 'un';
$tab['un']['un'] = 'un';


date_diff() expects parameter 1 to be DateTimeInterface[modifier | modifier le wikicode]

La classe native DateTime() est plus pratique que la fonction date_diff() :

$Avant = new DateTime('20140101');
$Apres = new DateTime();
print $Avant->diff($Apres)->format("%d");


Illegal string offset[modifier | modifier le wikicode]

On invoque une entrée inexistante dans un tableau associatif. Lever l'exception avec Try ou if (!isset(.

Erreurs SMTP[modifier | modifier le wikicode]

La connexion a échoué[modifier | modifier le wikicode]

Vérifier le serveur HTTP qui interprète le .php.

SMTP Error: Could not connect to SMTP host[modifier | modifier le wikicode]

Changer de SMTP, ex : http://www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai

SMTP server error: ERR Email ID not found[modifier | modifier le wikicode]

Si les mails partent sans arriver[modifier | modifier le wikicode]

  • Vérifier que l'IP de l'expéditeur n'est pas blacklistée : http://whatismyipaddress.com/blacklist-check
  • Définir un reverse DNS si absent
  • Veiller à ce que le mail ne soit pas présumé spam, en évitant les sujets vides par exemple, ou les pièces jointes exécutables non compressées (.exe, .cmd, .vbs...).


Composer[modifier | modifier le wikicode]

No driver found to handle VCS repository[modifier | modifier le wikicode]

VCS fonctionne en protocole git, vérifier que l'URL est bien au format "git@repo:bundle.git".

Sinon il y a deux alternatives :

  • Pour HTTPS, remplacer la dépendance de type "vcs" par une de type "package"[4].
  • Pour décompresser un .zip, utiliser le type "artifact".

You must be using the interactive console to authenticate[modifier | modifier le wikicode]

Pour installer cette bibliothèque, il faut que Composer puisse se loguer. Pour ce faire, il utilise auth.json qui peut se trouver dans[5] :

  1. $HOME/.composer/auth.json
  2. ou à côté du composer.json

Exemple de auth.json[6] :

{
    "github-oauth": {
        "github.com": "<snip>"
    },
    "http-basic": {
        "repo.magento.com": {
            "username": "<snip>",
            "password": "<snip>"
        }
    }
}

PHPUnit[modifier | modifier le wikicode]

Trying to configure method "get" which cannot be configured because it does not exist, has not been specified, is final, or is static[modifier | modifier le wikicode]

Un mock ne récupère aucune méthode de sa classe car elle n'a pas pu être instanciée. La casse du nom de la classe ou du namespace de son use n'est probablement pas exacte. Sinon c'est la portée de la méthode mockée qui n'a pas publique. Si un dump du mock montre les attributs mais pas les méthodes, remplacer ->getMockForAbstractClass() par ->getMock().

Trying to @cover or @use not existing method[modifier | modifier le wikicode]

Si la méthode existe bien, c'est que la classe testée n'a pas été définie en annotation (avec son namespace) :

/**
 * @coversDefaultClass App\Service\MyService
 */
class MyServiceTest extends TestCase
{
    ...
}

Symfony[modifier | modifier le wikicode]

Profiler sous Symfony 2.8.

En cas d'erreur, un composant de débogage appelé "Profiler", est accessible en bas à gauche de la page d'erreur, avec des logs et mesures de performances. Installation :

composer require --dev symfony/profiler-pack

On peut par exemple accéder au phpinfo() via l'URL .../_profiler/phpinfo.

Attention !

Logo Le profiler fonctionne pour les contrôleurs mais pas pour les commandes.


Attribute "autowire" on service "xxx" cannot be inherited from "_defaults" when a "parent" is set. Move your child definitions to a separate file or define this attribute explicitly.[modifier | modifier le wikicode]

Lors d'utilisation de service abstrait, on ne peut pas utiliser l'autowiring. On peut alors transformer ce service abstrait en dépendance à injecter plutôt qu'à hériter.

Cannot autowire service... alors qu'il existe[modifier | modifier le wikicode]

Peut se produire quand on importe des déclarations de service dans services.yaml avec autowiring. Il faut donc soit le désactiver, soit exclure les namespaces concernés, soit mettre ces déclarations dans services.yaml.

Circular reference detected[modifier | modifier le wikicode]

L'autoloader se heurte à un argument du constructeur d'une classe : il faut le sortir de la méthode __construct() pour le définir dans une méthode portant son nom. Exemple de déclaration en YAML :

    app.ma_classe:
        class: App\MaClasse
        arguments:
            - '@service.sans.probleme'
        calls:
            -   method: setServiceAvecProbleme
            arguments:
                - '@service.avec.probleme'
        tags:
            - { name: doctrine.event_subscriber }

Error 400 Bad Request Your browser sent a request that this server could not understand.[modifier | modifier le wikicode]

Les règles de réécriture d'URL Apache sont erronées (voir ci-dessous).

Error 404 Not Found The requested URL /xxx was not found on this server.[modifier | modifier le wikicode]

Si la page d'accueil fonctionne mais pas les sous-pages (alors qu'un nom de domaine est déjà dédié au site dans le vhost), les règles de réécriture d'URL de la configuration Apache sont manquantes ou erronées. Il faut donc créer public/.htaccess :

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

Dans l'API avec Swagger UI : NetworkError when attempting to fetch resource (Firefox) / Failed to fetch (Chrome)[modifier | modifier le wikicode]

Violation du CQRS empêchant l'affichage du résultat de l'API dans /api/doc, à causes des domaines. Sur un domaine local, cela peut être résolu en changeant l'URL avant /api/doc pour qu'elle soit valide (ex : passer de wikibooks/api/doc à wikibooks.org/api/doc).

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known[modifier | modifier le wikicode]

Un service inexistant ou avec des paramètres en erreur est appelé. Cela peut-être provoqué par une variable d'environnement d'URL manquante ou erronée (ex : retirer le protocole, ou ajouter la version du SGBD).

SSL certificate problem: unable to get local issuer certificate[modifier | modifier le wikicode]

Utiliser l'installation avec "Composer.phar" plutôt que "Symfony.phar".

InvalidArgumentException Invalid env(bool:xxx) name: only "word" characters are allowed[modifier | modifier le wikicode]

Soit retirer la résolution "bool:" sur la variable d'environnement concernée, soit la renommer si elle contient des symboles autres que des lettres, des nombres ou underscore (ex : "=", "%", ":", etc.).

Doctrine[modifier | modifier le wikicode]

Le champ sauvegardé en base est toujours 0[modifier | modifier le wikicode]

Se produit quand on utilise l'annotation @ORM\GeneratedValue(strategy="IDENTITY") sur un champ qui n'est pas AUTOINCREMENT en base de données.

Class "App\Entity\X" seems not to be a managed Doctrine entity. Did you forget to map it?[modifier | modifier le wikicode]

On fait appel à une classe PHP comme si c'était une entité Doctrine : il faut simplement ajouter les annotations Doctrine à la classe, ou bien recréer la table à partir du code PHP.

Entity has to be managed or scheduled for removal for single computation[modifier | modifier le wikicode]

  • Si remove : retirer le ON CASCADE DELETE de l’entité supprimée.
  • Si update : faire le add avant.

Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 'X' that was not configured to cascade persist operations for entity: X. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"})[modifier | modifier le wikicode]

Un service a un tag et un argument constructeur incompatible. Ce service en argument fait un $em->clear() au lieu de clear(object), ou persist(object) au lieu de merge(object).

Multiple non-persisted new entities were found through the given association graph:\n\n * A new entity was found through the relationship 'X' that was not configured to cascade persist operations for entity: Y. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={\"persist\"}). / Notice: Undefined index: 00000000...[modifier | modifier le wikicode]

  • Ajouter un persist dans l'entité ou avant le flush.
  • Sinon, on tente de flusher une entité récupérée, ou dont une de ses entités liées à été récupérée, par l’entityManager de la BDD slave. Utiliser le master à la place.
  • Sinon c'est que le même flush est réalisé plusieurs fois : ajouter du cache de session pour ne pas réexécuter ce code.

The EntityManager is closed[modifier | modifier le wikicode]

Cela survient quand l'EntityManager rencontre une exception. On peut le reconnecter[7], ou la lever avec :

if ($this->em->isOpen()) {
    $this->em->persist($entity);
    $this->em->flush($entity);
}

Twig[modifier | modifier le wikicode]

double quoted property[modifier | modifier le wikicode]

Une virgule de trop après une clé.

key \"id\" for array with keys \"0\" does not exist.[modifier | modifier le wikicode]

Appel d'une clé absente d'un tableau.

unexpected token "punctuation" of value "{"[modifier | modifier le wikicode]

Au choix :

  • Ajouter les apostrophes aux clés du tableau concerné.
  • Ajouter des parenthèses à ses expressions.
  • Remplacer les accolades par des crochets pour le premier niveau.

PhpStorm[modifier | modifier le wikicode]

Les logs sont accessibles par :

tail -f ~/.PhpStorm2019.2/system/log/idea.log

incoming connection from xdebug[modifier | modifier le wikicode]

Lors d'une erreur au remplissage de cette pop-up, on peut la corriger dans .idea/workspace.xml.

No differences files that files have differences only in line separators[modifier | modifier le wikicode]

Les scripts lancés depuis PhpStorm sous Windows modifient les retours à la ligne (CLRF to LF).

Changer l'option dans Settings/Preferences | Editor | Code Style | Line separator[8] vers "System dependent".

Sinon, configurer git :

git config --global core.autocrlf true

Xdebug[modifier | modifier le wikicode]

En CLI, la console s'ouvre sur default_prepend.php et on ne voit pas l'exécution de la commande[modifier | modifier le wikicode]

Cela se produit quand plusieurs projets sont ouverts dans PhpStorm et que la commande n'appartient pas au principal.

Remote file path 'default_prepend.php' is not mapped to any file path in project[modifier | modifier le wikicode]

Sous PhpStorm il faut décocher dans les settings, debug, les deux cases Force break..., puis de redémarrer l'IDE[9].

Could not connect to client[modifier | modifier le wikicode]

Changer xdebug.remote_host car le serveur est introuvable.

Gateway Timeout[modifier | modifier le wikicode]

Cette erreur du navigateur généralement due au serveur Web.

  • Sur Apache, dans httpd.conf augmenter le nombre de secondes par défaut dans Timeout 60[10].
  • Sur Nginx, augmenter fastcgi_read_timeout 60s;[11].
  • Sur IIS, étendre la valeur du paramètre Activity Timeout des FastCGI Settings[12].

De plus, on peut aussi revoir les variables du php.ini. Ex :

max_execution_time=30  # 30 s par défaut
max_input_time=-1      # Utilisera "max_execution_time" si -1, sinon la valeur indiquée

Failed to read FastCGI header[modifier | modifier le wikicode]

Si le log Apache affiche cela lors d'un Gateway Timeout, il faut ajouter à httpd.conf[13] :

    ProxyTimeout 6000
    <IfModule mod_fcgi.c>
        FcgidProcessLifeTime 6000
        FcgidBusyTimeout 6000
        FcgidConnectTimeout 6000
        FcgidIdleTimeout 6000
        FcgidInitialEnv 6000
        FcgidIOTimeout 6000
        IdleTimeout 6000
        IPCConnectTimeout 6000
        IPCCommTimeout 6000
        IdleScanInterval 6000
    </IfModule>

Parfois il convient aussi de modifier le php.ini[14] :

opcache.optimization_level=0xFFFFFBFF
xdebug.remote_cookie_expire_time=6000

Enfin, sur PhpStorm on rencontre cela dans le cas de sous-requêtes qui dépassent la valeur du paramètre "Max. simultaneous connections".

Time-out connecting to client[modifier | modifier le wikicode]

Changer xdebug.remote_host ou xdebug.remote_port car le serveur existe mais n'écoute pas le port spécifié.

Si le navigateur ne déclenche plus le débogage sur l'IDE, alors que ce dernier écoute et que la clé du navigateur est bien définie, c'est peut-être le pare-feu qui bloque. Exemple de reset sur Linux avec iptables[15] :

   iptables --policy INPUT   ACCEPT;
   iptables --policy OUTPUT  ACCEPT;
   iptables --policy FORWARD ACCEPT;
   iptables -Z; # zero counters
   iptables -F; # flush rules
   iptables -X; # delete all extra chains

Remote file path 'default_prepend.php' is not mapped to any file path in project[modifier | modifier le wikicode]

Si l'erreur survient lors du débogage, sous PhpStorm il faut décocher dans les settings, debug, les deux cases Force break..., puis de redémarrer l'IDE.

Références[modifier | modifier le wikicode]