Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreurs fréquentes en PHP / SQL

Liste des erreurs les plus courantes

15 septembre 2007 à 23:26:21

Salut à tous,

Ce sujet sert principalement à lister les erreurs les plus courantes en PHP / SQL. En fait, ce topic est né suite à de profondes réflexions, plusieurs sujets dans le forum PHP étaient similaires et les erreurs pouvaient être facilement évitées, d'où l'intérêt de ce sujet. ;)

Ci-dessous, vous trouverez les erreurs ainsi que leurs solutions, mais cette liste n'est pas exhaustive. Si vous souhaitez contribuer au sujet, ou réagir à ce sujet, postez sur ce sujet.
Cependant, je vous demande de ne pas répondre à ce sujet, pour le garder propre.

Erreurs les plus courantes



Sur ce, je vous souhaite un bon développement. :)
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:27:05

or die(mysql_error())



M@teo21 a pourtant dédié une partie aux Annexes, il évoque certains erreurs courantes, telle que qu'une erreur dans une requête. En effet, pour afficher les erreurs de vos requêtes SQL (si rien n'est affiché, c'est que vous n'avez d'erreur ;) ), il suffit de rajouter or die(mysql_error()) après votre requête, ce qui donne :

mysql_query( $votre_requete ) or die(mysql_error());

Voici quelques erreurs type :
  • You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
    La syntaxe de votre requête n'est pas correcte (vous pouvez, par exemple, avoir oublié "FROM")
  • Table 'mysql.ma_table' doesn't exist
    La table ma_table n'existe pas (la base de donnée choisie est mysql)
  • ... Et bien d'autres, mon but n'est pas toutes les lister mais de vous en montrer un bref aperçu ;)
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:27:35

headers already sent by



Encore une fois, M@teo21 évoque cette erreur dans son cours mais je vais approfondir cette erreur, et vous proposer des solutions efficaces. Si vous avez cette erreur : cannot modify header information - headers already sent by ..., pas de panique ! :p

En fait, les headers doivent être envoyés au navigateur en premier, et si vous avez mis du texte avant ces fameux headers, vous aurez cette erreur.

Mais que sont ces headers ? Vous pouvez les envoyer notamment avec session_start(), qui permet de démarrer les sessions, si le serveur utilise les cookies pour stocker l'identifiant de session. Dans ce cas, c'est l'enregistrement du cookie qui pose problème.

Même si le serveur n'utilise pas les cookies pour stocker l'identifiant de session on peut avoir cette erreur en appelant header(), setcookie() ou toute autre fonction nécessitant un envoi d'en-tête.

Cette erreur peut aussi survenir sur si votre page est encodée en UTF8 avec <acronym title="Byte Order Mark">BOM</acronym>. Ce caractère force l'envoi des headers ce qui empêche PHP de fonctionner correctement. Pour corriger ce problème, suffit de mettre votre page en UTF8 sans BOM. ;)


Et finalement, comment éviter cette erreur ? Vous pouvez utiliser une fonction de bufferisation (ce principe n'envoie aucune donnée, sauf les headers (appelés aussi en-têtes), mais ces données sont mises en buffer) : ob_start() en début de page et ob_end_flush() en fin de page, vous verrez, ça marche. ^^

Merci à anonymousguest et à Dentuk pour avoir signalé un petit détail (qui a son importance).
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:27:57

Parse error



Les "Parse error" sont des erreurs d'inattentions, vous pouvez normalement les corriger facilement. Ces erreurs sont notamment la cause d'un point-virgule oublié, ou même d'un point de concaténation oublié (ce sont souvent des oublis..). Premièrement, si vous obtenez une erreur de ce genre :

Parse error: syntax error, unexpected T_VARIABLE

En général, cela signifie que vous avez oublié un point virgule ou quelques choses du genre. Voici un exemple simple :
  1. <?php
  2. $une_variable = 'ma var' // L'erreur vient de là, un point-virgule a été oublié !
  3. $var_test = '';


Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

Quand vous avez cette erreur, vous pouvez avoir oublié un point servant à la concaténation. Voici un exemple :
  1. <?php
  2. $une_variable = 'ma var';
  3. $var_test = $une_variable ' texte'; // Un point de concaténation a été oublié après $une_variable !

Si vous obtenez cette erreur : Parse Error - Unexpected $end in [...], c'est que vous soit oublié une parenthèse fermante ou un point-virgule.

Avec le temps, vous rencontrerez sans doute d'autres erreurs de ce genre mais elles devraient normalement être corrigées rapidement, juste le temps de les trouver. ^^
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:28:24

fonction mail() en local



Vous n'arrivez pas à envoyer des emails avec la fonction mail() en local ? Si ça peut vous rassurer, c'est tout à fait normal, il faut modifier php.ini. ;)

Tout d'abord, il faut trouver le fichier de configuration php.ini, se trouvant normalement dans : C:\Program Files\Wamp\Apache2\bin pour Wamp (le repertoire est normalement similaire pour EasyPHP, si vous ne trouvez pas le fichier, faites une recherche avec le mot "php.ini").

Une fois ce fameux fichier trouvé, on passe à l'édition ! :)

[mail function];
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
;For Win32 only.
SMTP = smtp.fai.fr
;For Win32 only.
sendmail_from = votre_adresse@fai.fr


En premier, cherchez un texte similaire à celui-ci dans votre fichier (si vous ne trouvez pas, recherchez "mail function" dans le fichier). Ensuite, il suffit de modifier le serveur SMTP destiné à l'envoi des mails, c'est généralement celui de votre <acronym title="Fournisseur d'Accès à Internet">FAI</acronym>. Et sendmail_from, c'est l'adresse email pour l'envoi du mail, celle fournie par votre FAI par exemple.

Une fois que vous avez terminé, enregistrez le fichier et relancez le serveur votre serveur de développement (Wamp, EasyPHP..). Vous pourrez désormais envoyer des mails en local ! ;)
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:28:55

Invalid argument supplied foreach



Si vous n'avez jamais utilisé la fonction foreach, elle permet d'exploiter les arrays (cf. cours de M@teo). Si vous obtenez une erreur de ce genre : Invalid argument supplied for foreach()

Voici un code très simple, je vais vous expliquer au fur et à mesure :
  1. <?php
  2. $var_test = 'mon texte';
  3. // On exploite le array (qui ici, n'est pas un array!)
  4. foreach( $var_test AS $test_foreach )
  5. {
  6.       echo $test_foreach . '<br />';
  7.       // Cela retournera : Warning: Invalid argument supplied for foreach()
  8. }

Le code ci-dessus n'est pas correct ! En fait, comme la fonction foreach() sert à exploiter les tableaux (ou arrays) et qu'ici, ce n'est pas un tableau, une erreur s'est produite. Il faut absolument que $var_test soit un tableau, sinon ça ne marchera jamais. ;)
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:29:23

Undefined index



Ici je vais m'adresser aux personnes qui ont déjà aperçues ce genre d'erreur : Notice: Undefined index: test. Une chose est sûre, c'est une petite erreur, une notice. Ces erreurs notices ne sont que des erreurs mineures et sont facilement corrigeables. Voici un exemple :

  1. <?php
  2. // Toutes les erreurs sont désormais visibles (y compris les notices)
  3. error_reporting( E_ALL );
  4. echo $_GET['test'];
  5. // Si $_GET['test'] n'existe pas, le script va renvoyer une notice : Notice: Undefined index: test

La solution est simple, il suffit de vérifier si $_GET['test'] existe avant de l'afficher. Vous pouvez faire comme ceci : echo ( isset( $_GET['test'] ) ) ? $_GET['test'] : '' au lieu de cela : echo $_GET['test']
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:29:51

Activer le mod_rewrite



mod_rewrite, kesako ? C'est un module d'Apache permettant de créer des liens type url rewriting. En fait, avec l'url rewriting, vous pourrez faire des urls similaires au Site du Zéro, par exemple forum.html reverra (de manière transparente) vers index.php?p=forum, par exemple.

Je vais vous expliquer comment activer ce module sous Wamp, serveur de développement similaire à EasyPHP, l'opération est la même pour ces 2 logiciels. ;)

Tout d'abord, ouvrez le fichier httpd.conf qui se trouve dans le repertoire C:\Program Files\Wamp\Apache2\conf. Ensuite, recherchez cette ligne (aux environs de la ligne 106) :
#LoadModule rewrite_module modules/mod_rewrite.so


Pour activer le mod_rewrite, il suffit de décommenter (donc enlever le # devant la ligne) cette ligne. Ce qu'il vous reste à faire, c'est de redémarrer Apache ! ;)
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2007 à 23:30:12

Division by zero



Division by zero ? Ca vous dit quelque chose ? La traduction en français est similaire : division par zéro. En fait, je vais vous expliquer la raison pour laquelle vous avez, peut-être, obtenu une telle erreur : Warning: Division by zero. Voici un bout de code commenté :

  1. <?php
  2. $nbr_topics = 20;
  3. $topic_page = 1;
  4. echo ceil( $nbr_topics / $topic_page ); // Tout se passe bien ici
  5. echo ceil( $nbr_topics / 0 ); // Il est évident qu'ici, vous aurez une jolie erreur ! :o
  6. echo ceil( $nbr_topics / $var_nbr_page ); // Comme la variable $var_nbr_page n'existe pas, vous aurez la même erreur qu'avec le code ci-dessus
  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2007 à 1:29:41

Cette question/réponse a été fournie par strucky

Use of undefined constant



Cette erreur peut se produire lorsque vous avez oublié le $ au début d'une variable.

  1. <?php
  2. $maVariable = 12;
  3. echo maVariable;
  4. ?>

Avertissement retourné :
Notice: Use of undefined constant maVariable - assumed 'maVariable' in /var/www/blog/index.php on line 9

Egalement lorsque l'on omet les cotes sur l'index (string) d'un tableau (erreurs très fréquentes chez les débutants).
  1. <?php
  2. $monArray = array('toto'=>10, 'titi'=>12, 'tutu'=>8, 'tata'=>15);
  3. echo $monArray[titi];
  4. ?>

Avertissement retourné :
Notice: Use of undefined constant titi - assumed 'titi' in /var/www/blog/index.php on line 7
  • Partager sur Facebook
  • Partager sur Twitter