Les erreurs fréquentes en SQL / PHP
#1
Bonsoir 2

L'intéret de ce sujet est de `référencer` les erreurs courrament rencontrées. Des erreurs qui de plus pourraient souvent être facilement évitées.
De plus, JeuPHP.net n'est pas une communauté pour l'apprentissage de PHP, alors avec l'espoir qu'on ne forcera plus les membres actifs à griller leur temps pour de telles erreurs, nous prendrons le temps qu'il faut pour compléter ce sujet.
Pour conserver ce topic propre & facile à consulter, je vous demanderais de réagir dans un topic créé spécialement pour l'occasion.
> http://www.jeuphp.net/board/showthread.php?tid=2878 <

Index des erreurs les plus courantes
#2
Mots réservés ou mots clés MySQL

Parfois, lors de l'exécution de vos requêtes vous aller avoir à faire à une erreur du type :
Citation :Erreur de syntaxe près de [ .. ] à la ligne 1.

Vérifiez dès lors que les noms de vos champs ne sont pas réservés par MySQL. Vous trouverez la liste de ces mots en suivant le lien suivant : [ Cas des mots réservés MySQL ]
#3
Undefined Index

On aborde cette fois-ci la situation où le message d'erreur Notice: Undefined index est renvoyé.
Le mot clé Notice indique qu'il ne s'agit pas d'une grosse erreur & donc facilement corrigeable.

Le problème est de vérifier que la clé citée dans le message d'erreur a bien une valeur dans ledit tableau ( $_POST, $_GET )

Pour cela, un simple isSet( $_ARRAY[ 'tableKey' ] ) suffit.
#4
Parse Error

Ce type d'erreur correspond souvent à un oubli. Un oubli de virgule, de point, de point-virgule. Ces erreurs sont simples à corriger. Cependant il arrive qu'il faille regarder - généralement - la ligne au dessus pour trouver l'erreur, non pas la ligne citée dans le message d'erreur.

Différents types standards d'erreurs :
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
Dans ce cas, l'erreur se trouve - généralement - dans la ligne courante 2

Parse error: syntax error, unexpected T_VARIABLE
Généralement, regardez la ligne précédente. Vous avez sûrement omis un point virgule 2
#5
Headers already sent by

Le message type dans les cas d'utilisation des sessions et / ou des cookies.
cannot modify header information - headers already sent by

Il ne faut pas oublier que les headers doivent être envoyé avant TOUT code HTML qu'il soit directement dans le script, ou bien renvoyé par PHP.

Pour pallier à cette erreur, vous pouvez utiliser les fonctions de manipulation du buffer. Pour cela, consulter la référence [ Fonctions ob_ ] ; [ Bufferisation de sortie ]
#6
Manipulation du temps avec PHP & SQL

Une erreur de conception classique, utiliser des champs VARCHAR pour stocker des timestamp PHP dans une table SQL.

Les champ de type TIMESTAMP sont fait pour ça, ils stockent la date au format AAAA-MM-JJ HH:MM:SS, le TIMESTAMP qu'il est alors que j'écris ces lignes est 2007-11-27 07:26:54 !

Ces valeurs sont bien plus lisibles et surtout, bien plus pratique à utiliser ! On peut facilement les mettre en valeur par défaut d'un champ, et le TIMESTAMP est alors généré automatiquement par SQL lors de l'enregistrement d'une entrée dans la table : rien à gérer côté PHP !

On peut s'en servir pour formater une date directement avec SQL, à l'aide de la fonction SQL DATE_FORMAT(date, format), qui s'utilise de cette manière :

Cette requête renvoie le nom (champ : nom) et la date d'inscription (nom du champ : date_inscription) de chaque joueur, on ne renvoie ici que le jour, le mois et l'année d'inscription, car le reste n'est pas nécessaire :
Code PHP :
mysql_query("SELECT nom, DATE_FORMAT(date_inscription, '%d/%m/%Y') AS date_inscription FROM comptes;");
// Renverra les dates au format JJ/MM/AAAA 

Si j'avais voulu renvoyer le moment de l'inscription à la minute près et dans une jolie chaîne de caractères, j'aurais fais :
Code PHP :
mysql_query("SELECT nom, DATE_FORMAT(date_inscription, 'le membre s\'est inscrit le %d %m %Y à %Hh%i.') AS inscription_date FROM comptes;"

On trouvera les correspondances sur PHPFrance - Formater une date par exemple.

Les TIMESTAMP sont plus pratique à utiliser pour les fonctions de dates.

Par exemple, si je veux effacer les messages d'une table et qui ont été crées il y à 5 jours ou plus :
Code PHP :
mysql_query("DELETE FROM messages WHERE creation_date < DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY)"); 

À voir :
Manipulation des temps, parce qu'il y a des confusion à éclaircir :

- mktime() sert à créer un timestamp à partir de paramètres, si tu ne veux lui passer aucun paramètre autant appeler time().

- MySQL travaille à la précision donnée par le type du champ, un type TIMESTAMP est à la seconde près, donc "DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 DAY)" c'est 5 jours avant, à la seconde près.

- Quand on fait des requêtes, l'idée générale est de déléguer le maximum de traitements au serveur SQL, donc c'est une bonne chose de lui faire gérer les traitements de date directement.

- Il y a strtotime() qui existe et qui est diablement pratique, plutôt que de faire "time()-432000" on peut faire "strtotime('-5 DAYS')" 16

Remerciements à Sephi-Chan & naholyr


Sujets apparemment similaires...
Sujet Auteur Réponses Affichages Dernier message
  [ Réactions ] Les erreurs fréquentes en SQL / PHP Plume 17 5 838 11-27-2007, 08:17 PM
Dernier message: Zamentur



Utilisateur(s) parcourant ce sujet : 1 visiteur(s)