Programmation PHP/Exceptions

Un livre de Wikilivres.
Aller à : navigation, rechercher


Sections

Tester l'existence[modifier | modifier le wikicode]

Pour éviter les warnings de variables inexistantes il vaut mieux les initialiser au début. Si toutefois cela s'avère impossible, on recourt à des tests sur les fonctions suivantes pour le faire :

if (!isset($maVariable)) { $maVariable = ''; }
if (!defined('MA_CONSTANTE')) { define('MA_CONSTANTE', ''); }
if (!function_exists('maFonction')) { function maFonction() {} }

empty()[modifier | modifier le wikicode]

Permet de savoir si une variable est définie et si contient une valeur. Cela équivaut à :

  • isset($v) and $v == "".

ou

  • isset($v) and $v == false.

try ... catch[modifier | modifier le wikicode]

Tout comme en Java, la levée d'exception est assurée un bloc try ... catch. Cela permet à un script de poursuivre son exécution malgré les erreurs (ex : panne réseau), et ainsi de ne pas bloquer l'utilisateur sur une page blanche ou en anglais destinée au développeur.

Exemple :

try {
  echo '1 / 2 = ' 1/2;
  echo '3 / 0 = ' 3/0; // instruction qui déclenchera l'exception
  echo '2 / 1 = ' 2/1; // cette instruction ne sera pas exécutée à cause de la précédente
}
catch (Exception $e) {
  echo $e->getMessage(); // afficher le message lié à l'exception
}

Il n'est donc pas nécessaire de prévoir ce qui peut interrompre le programme pour s'en prémunir et poursuivre l'exécution en fonction.

La classe de gestion des erreurs nommée Exception est gracieusement mise à votre disposition par l’interpréteur dans les versions ultérieures à PHP 5.0.

Autre exemple d’utilisation :

class Humain
{
  var $age;

  function __construct($combien)
  {
    $this->age = $combien;
   
    try
    {
      if ($this->age<0)
      throw new Exception('Un peu jeune');
      if ($this->age>200)
      throw new Exception('Un peu vieux');
    }
    catch (Exception $e)
    {
      echo $e->getMessage();
      exit();
    }
  }

}

//Retournera un message d'erreur
$humain = new Humain(700);
$humain = new Humain(-3);

//Sans erreur
$humain = new Humain(16);

Par ailleurs, il est possible de modifier les exceptions PHP avec set_exception_handler()[1].

Affichage d'une trace lisible[modifier | modifier le wikicode]

Afin de clarifier la trace de l'exécution des scripts, il peut être utile de formater celle-ci avec la balise <pre> :

if ($debogage) {
  print '<pre>';
  var_dump(scandir('.'));
  print '</pre>';
}

NB : on rappelle que les commandes ini_set('display_errors', 1); et error_reporting(E_ALL); permet d'afficher à l'écran toutes les erreurs et avertissements.

debug_print_backtrace[modifier | modifier le wikicode]

Cette fonction affiche automatiquement la trace de l'exécution menant à elle.

Erreurs connues[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.


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


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[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[2]. 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...).

Autres[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++)[3].

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.

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