Le salon du PHP

<<<12>>>

[Page 1 sur 2 - 19 messages]
Informations Messages

ben.popeye

Avatar de ben.popeye
902 messages
Carte Mère
Carte Mère

Lien direct Le 22 Août 2005 à 22h54

Ce topic a pour but d'aider les développeurs PHP qui sont confrontés à des erreurs.
Il n'est absolument pas définitif, il sera mis à jour au fur et à mesure de son avancement. Aussi j'autorise toute l'équipe de développeurs d'Aidoforum qui possèdent les commandes de modération
à mettre le contenu de ce topic à jour ainsi qu'à corriger d'éventuelles erreurs ou rajouter quelque chose.


Erreurs fréquentes: En cours de rédaction. Les erreurs seront certainement associées à leur message retourné par PHP au cours des mises à jour.

D'abord sachez qu'à chaque fois que PHP vous retourne une erreur, elle provient de vous et pas de PHP, et oui l'erreur est humaine...
Je me suis de nombreuses fois posé des questions sur des erreurs à des lignes dont j'étais certain, mieux vaut s'arrêter quelques instants et y revenir à froid.


Bien qu'on comprenne la plupart du temps avec l'erreur retournée d'où vient le problème, on doit avouer que le message est parfois incompréhensible, l'erreur se trouve parfois bien avant la ligne indiquée.


    [*:18saqmej]Vous avez oublié un point virgule à la fin d'une instruction, c'est la première étape à vérifier.
    [/*:m:18saqmej]
    [*:18saqmej]Vous n'avez pas refermé les parenthèses lors de l'utilisation d'une fonction.
    [/*:m:18saqmej]
    [*:18saqmej]Vous n'avez pas fermé php par la balise ?> à la fin de la page.
    [/*:m:18saqmej]
    [*:18saqmej]Vous n'êtes pas connecté à la base de donnée.[/*:m:18saqmej]



Quelques conseils pour mieux développer et se simplifier la vie:


    [*:18saqmej]Prendre l'habitude, pour un maximum de compatibilité avec les serveurs d'ouvrir PHP avec la balise <?php au lieu de <? simplement.
    [/*:m:18saqmej]
    [*:18saqmej]Il faut savoir trouver un juste milieu entre les commentaires et l'identation.
    En effet un script bien identé ne nécessite pas beaucoup de commentaires, il faut simplement marquer les grandes lignes.
    Pour l'identation, chacun a sa technique, personnellement j'aligne toutes mes lignes verticalement, je vais à la ligne après chaque instruction, et je décale d'un cran horizontalement vers la droite à l'intérieur d'une condition ou d'une boucle.
    Cette méthode permet de savoir où l'on se trouve lorsqu'on a le raisonnement en tête.
    [/*:m:18saqmej]
    [*:18saqmej]Essayer d'utiliser le plus de fonctions possible. En effet chaque tache répétée peut-être assimilée à une fonction avec des arguments différents.
    Cette façon de coder est d'ailleurs un peu dans l'esprit de la programmation orienté objet.
    Par exemple on peut créer une fonction pour se connecter à une base de données.

    Code

    <?php
    function connexion_bdd()
    {
    mysql_connect('localhost', 'pseudo', 'password');
    mysql_select_db('base');
    }

    //On se connecte à la base de données
    connexion_bdd();
    ?>


    Je vous garantis qu'en y réfléchissant on peut s'amuser à faire des fonctions pour tout et n'importe quoi.
    Par exemple lorsque j'utilise la pagination avec les boucles, j'ai établi une fonction et selon les arguments elle me renvoit la ligne contenant les différents liens vers les pages.
    [/*:m:18saqmej]
    [*:18saqmej]Quelques notions utiles pour se servir efficacement des fonctions.

    Vous voulez utiliser dans une fonction une variable non contenue dans les arguments de votre fonction mais définie précédemment?
    C'est simple, il suffit d'utiliser global qui signifie que la variable est celle de toute la page.

    Code


    <?php
    $nombre = 10;
    //On crée une fonction qui va additionner le nombre entré à une vaiable précédemment définie (dans l'exemple ell vaut 10), elle va ensuite écrire le résultat.
    function addition($plus)
    {
    //On précise qu'on veut la variable globale
    global $nombre;
    $resultat = $nombre + $plus;
    echo $resultat;
    }

    //On applique la fonction avec 5
    addition(5);
    ?>


    Ce code va retourner 15.
    Si on n'avait pas mis le global, il aurait retourné 5 ou une erreur selon la version de PHP, car la variable $nombre n'est pas définie dans la fonction.
    Vous avez compris l'utilité du global? C'est vrai elle est utilisée rarement mais elle est très pratique!

    Vous voulez associer une variable au résultat d'une fonction?
    Reprenons l'exemple de la fonction addition crée plus haut, mais cette fois-ci on ne veut pas écrire le résultat mais l'utiliser par la suite, on lui associe donc une variable. Mais si on laisse le echo, la fonction écrira le résultat.
    On va donc remplacer le echo par un return. Dans ce cas là on va associer une variable au résultat de la fonction.

    Code


    <?php
    $nombre = 10;
    //On crée une fonction qui va additionner le nombre entré à une vaiable précédemment définie (dans l'exemple ell vaut 10), elle va ensuite écrire le résultat.
    function addition($plus)
    {
    //On précise qu'on veut la variable globale
    global $nombre;
    $resultat = $nombre + $plus;
    return $resultat;
    }

    //On applique la fonction avec 5
    $retour = addition(5);
    echo '10 + 5 = ' . $retour;
    $double_retour = $retour * 2;
    echo 'et le double de ' . $retour . ' est ' . $double_retour;
    ?>


    Ce code va retourner: 10 + 5 = 15 et le double de 15 est 30.
    Le return s'avère beaucoup plus utilisé que le global, mais dans l'exemple proposé on les utilise tous les deux.
    [/*:m:18saqmej]
    [*:18saqmej]Utiliser la concaténation avec si possible les apostrophes. Personnellement j'utilise les apostrophes pour PHP et les guillemets dans le HTML.
    La concaténation est simple à utiliser mais elle rend énormément service. Comme ceci n'est pas un cours et que la concaténation est assez complexe, je ne vais pas l'expliquer mais vous trouverez de nombreuses explications en utilisant les moteurs de recherche.
    Pour ceux qui ne savent pas à quoi correspond ce mot barbare, il s'agit d'une syntaxe permettant de méler du texte avec des variables.[/*:m:18saqmej]

 

Publicité

ben.popeye

Avatar de ben.popeye
902 messages
Carte Mère
Carte Mère

Lien direct Le 22 Août 2005 à 22h55

Réservé pour une éventuelle prochaine mise à jour.

 

ben.popeye

Avatar de ben.popeye
902 messages
Carte Mère
Carte Mère

Lien direct Le 22 Août 2005 à 22h55

Réservé pour une éventuelle prochaine mise à jour.

 

ben.popeye

Avatar de ben.popeye
902 messages
Carte Mère
Carte Mère

Lien direct Le 22 Août 2005 à 23h01

J'ai créé ce concept car je trouve qu'il peut servir à tous les développeurs PHP, débuttants ou non, il ne s'agit pas d'un cours mais plutôt je fais part de mon expérience pour aider les autres.
En effet je compte (avec l'aide de Pouzy et autres) compléter les erreurs que retourne PHP, continuer à aiguiller les néophytes vers les bonnes méthodes. J'ai aussi envisagé d'expliquer comment réfléchier à la façon dont va se passer certains scripts.

Comme il s'agit authentiquement de mon travail, je me permettrai de le mettre sur mon site Web qui sera aussi dans cet esprit (pas de concurrence contre Aido je vous rassure, mais certainement un récapitulatif de tout ce que je fais).

Ainsi j'aimerais si ce n'est trop demander que ce topic soit mis en Post It afin qu'il serve, et je laisse Pouzy choisir si il doit le verrouiller, personnellement je ne sais pas.

 

Skwizer

Avatar de Skwizer
1079 messages
PC de Compèt'
PC de Compèt'

Lien direct Le 22 Août 2005 à 23h53

Tres bonne initiative !! Mis en post-it

Vouons un culte à l'admin dont le nom commence par P et finit par ouzy !
 

j0n3s

Avatar de j0n3s
959 messages
Carte Mère
Carte Mère

Lien direct Le 23 Août 2005 à 10h13

Bon bein... à chaque erreur PHP que j'aurais dasn mes scripts je posteraiClin d'oeil

Et sinon les erreurs SQL on peut ?

 

ben.popeye

Avatar de ben.popeye
902 messages
Carte Mère
Carte Mère

Lien direct Le 23 Août 2005 à 13h45

Bien évidemment, je compte répertorier toutes les erreursClin d'oeil du moins les plus courrantes

 

K20

Avatar de K20
895 messages
Carte Mère
Carte Mère
Ancien Combattant
Ancien Combattant

Lien direct Le 01 Septembre 2005 à 15h42

Erreurs du type : mysql_fetch_array ou mysql_result, etc

- Vérifiez que vous vous êtes bien connectez à votre base de donnée.
- Vérifiez la syntaxe de requêtes.
- Affichez votre requête pour décelez des quelquonques problèmes.
- Vérifiez que vous avez bien écrit vos fonctions MySQL !

Plus d'infos sur les fonctions MySQL

[u]
Types d'erreurs, comment savoir ce qui cloche dans son code ?[/u]

Vous pouvez trouver sur la documentation officiel tous les types d'erreurs PHP que vous pourrez trouver dans vos codes. A chaque erreur correspond une partie du code.
Retrouvez les différents types d'erreurs


Connaître le nombre d'enregistrements dans une table

Il existe 2 moyens : utiliser la requête ou utiliser une fonction MySQL
Tout d'abord, n'oubliez pas de vous connecter à votre base de donnée !

1) Utiliser une requête
Rentrez ce code :

Code

<?php

$requete = mysql_query("SELECT COUNT(*) FROM `ma_table`",$connexion_sql); // Je fais ma requête
$nb = mysql_result($requete, 0); // Je transmes le nombre
echo $nb; // J'affiche le nombre

?>



2) Fonction mysql_num_rows
Rentrez ce code :

Code

<?php

$requete = mysql_query("SELECT * FROM `ma_table`",$connexion_sql); // Je fais ma requête
$nb = mysql_num_rows($requete); // Je transmes le nombre
echo $nb; // J'affiche le nombre

?>



La méthode 1 est moins gourmande et donc a préféré par rapport à la 1 !

 

lovedreamaster

Avatar de lovedreamaster
6 messages
Neurone isolé
Neurone isolé

Lien direct Le 06 Avril 2006 à 17h48

vous pouvez trouver pas mal d aide sur le php sur www.siteduzero.com il est pas mal et explique tout de facon assez simple sinon il y a http://phpdebutant.org/ ki est un peu plus compliké comme site je trouve enfin cela reste personel

 

Webdeb73

Avatar de Webdeb73
207 messages
Carte Graphique 3D
Carte Graphique 3D

Lien direct Le 01 Janvier 2007 à 18h20

Encore le site du zéro, c'est quoi ce culte à ce site ? Apprenez à programmer comme des gorêts en PHP, allez sur le siteduzero, je vous y encourage !

Il n'y a rien de mieux que les documentations officielles des langages pour apprendre.

 

Webdeb73

Avatar de Webdeb73
207 messages
Carte Graphique 3D
Carte Graphique 3D

Lien direct Le 01 Janvier 2007 à 19h24

Bonsoir à tous et bonne année,

Je vais apporter ma contribution en vous proposant quelques points d'optimisation de code. Je vois trop souvent du code archicrade sur les forums de PHPScripts-fr issu de "webmasters" en provenance du...... siteduzero bien sûr.

Accrochez-vous, j'y vais en apnéeSourire

Les balises PHP :

C'est de là que commence un script PHP. Ah bon ? Oui oui je vous assure ! Pour bien commencer un script PHP, on utilise les tags PHP qui sont :

Code

<?php

// ici mon code PHP

?>



Et les autres tags comme <? on les oublie. Bon nombre de fainéants débutent leurs scripts par <?, ce qui en est en soi une très mauvaise pratique pour deux raisons.


    [*:r8e341g9]Ils peuvent être désactivés chez certains hébergeurs si la ligne short_open_tags du php.ini est positionnée à Off[/*:m:r8e341g9]
    [*:r8e341g9]Il peut y avoir des conflits d'interprêtation avec la balise XML <?xml[/*:m:r8e341g9]



Plus d'informations ici : http://www.expreg.com/fred_article.php? ... ise_courte

Les chaînes de caractères :

Restons cohérents dans l'écriture d'une chaîne de caractères. Tout d'abord on utilise les apostrophes pour les chaînes dites statiques (qui ne contiennent ni variables, ni marqueurs dynamiques comme les retours chariot). Quant aux chaînes dynamiques, on utilise les guillemets. Voici des exemples illustrés.

Code


<?php
$chaine = 'Ceci est une chaîne complètement statique';

$chaine = "Celle-ci est dynamique car elle contient un \n retour à la ligne";
?>



Quant aux variables, préférez la concaténation pour éviter d'avoir une variable entre guillemets. C'est plus lisible et plus propre. Exemples :

Code


<?php
$chaine = "J'ai $age ans";

$chaine = 'J\'ai '. $age .' ans';
?>



Plus d'informations ici : http://www.expreg.com/fred_article.php?art=coherence

L'instruction echo :

Pour éviter les antislashes à tout va et un code fouilli, utilisez l'instruction echo en pensant à séparer les chaînes statiques et les parties dynamiques. Cette séparation se fait au moyen de la virgule. Ce n'est pas une concaténation mais cela produit le même résultat, et ce plus rapidement. En effet le point est l'opérateur de concaténation. C'est à dire qu'il met des chaînes bout à bout pour reconstruire une chaîne entière. La virgule dans un echo sert de séparateur de paramètre. En fait, echo est particulière. Elle peut prendre une infinité de paramères. Donc on utilise la virgule. Grâce à elle, echo ne place plus les chaînes bout à bout dans une variable mais les affiche directement les unes à les suite des autres. Ce qui est nettement plus rapide qu'une concaténation.

Je vous illustre tout ça ci-dessous :

Code


<?php
echo '<span style="color:red">Bonjour ', $nom ,'</span>',"\n";
?>



Attention : Ce n'est valable qu'avec echo

Plus d'informations ici : http://www.expreg.com/fred_article.php?art=echo_lapin

Les conditions :

Pour tester si une variable contient un nombre, on ne met pas d'apostrophes ou de guillemets autour du nombre. Ils sont réservés aux chaînes de caractères. On fait donc :

Code

<?php
$nombre = 2;

if($nombre == 2) {

echo 'La variable $nombre contient la valeur 2';
}
?>



Pour optimiser la chose, on préfère vérifier l'égalité avec un triple égal. Ainsi l'interprêteur PHP va vérifier le type au passage. C'est nettement plus plus rapide que le double égal (qui fait abstraction du type) et bien plus propre.

Code

<?php
$nombre = 2;

if($nombre === 2) {

echo 'La variable $nombre contient la valeur 2 et est du même type que 2 (integer)';
}
?>



Utilisation des tableaux $_GET / $_POST / $_COOKIE / $_REQUEST :

Il faut toujours les utiliser pour récupérer des valeurs de variables transmises par l'url, par les formulaires et par les cookies quelle que soit la valeur de la directive register_globals du php.ini. Pour quelles raisons ?


    [*:r8e341g9]Assurer la portabilité du code sur les différents hébergeurs[/*:m:r8e341g9]
    [*:r8e341g9]Sécuriser les entrées pouvant être modifiées par l'utilisateur[/*:m:r8e341g9]



Les duplications de variables :

Autre mauvaise pratique dont les adeptes du SiteDuZero sont friands est la duplication de variables. La chose la plus inutile qui soit dans la majorité des cas. Je retrouve trop souvent cela :

Code

<?php
$maVariable = $_POST['maVariable'];

$maVariable = $_GET['maVariable'];
?>



Pourquoi mettre le contenu d'une variable dans une autre ? Pourquoi ne pas utiliser $_POST['maVariable'] directement ?

Gestion des erreurs en PHP :

Toutes les erreurs doivent être traitées et en aucun cas mises de côté. Ainsi, que l'on soit en développement ou en production, on met le error_reporting à E_ALL.

Code

<?php
error_reporting(E_ALL);
?>



De même, on ne masque pas les erreurs avec un stupide @ devant une fonction mais on traite l'erreur qui est retournée.

Rapport d'erreur SQL avec mysql_error() :

En cas d'erreur SQL on utilise mysql_error() pour débugguer.

Code

<?php
$connexion = mysql_connect('localhost','root','pass') or die(mysql_error());
mysql_select_db('base',$connexion) or die(mysql_error());

mysql_query($req) or die(mysql_error());
?>



Utilisation du SELECT * :

Le SELECT * est le joujou préféré des feignants. Il faut toujours lister les champs dont on a besoin (même si on les sélectionne tous) pour les raisons suivantes :


    [*:r8e341g9]Le serveur SQL travaille plus vite car il sait déjà ce qu'il doit récupérer comme information.[/*:m:r8e341g9]
    [*:r8e341g9]En cas de maintenance de vos scripts dans plusieurs mois, vous saurez tout de suite mieux vous repérez dedans.[/*:m:r8e341g9]



Plus d'informations ici : http://www.expreg.com/fred_article.php? ... es_etoiles

Utilisation de mysql_fetch_array :

Il est déprécié d'utiliser mysql_fetch_array() car il construit deux tableaux identiques. L'un indexé numériquement et l'autre indexé avec des clés associatives (alphanumériques). Grosso modo, mysql_fetch_array() = mysql_fetch_assoc() + mysql_fetch_row()

Donc pour éviter cette duplication de tableaux inutile (et donc un ralentissement côté serveur), on préfèrera utiliser :


    [*:r8e341g9]mysql_fetch_assoc() si l'on veut un tableau à clés associatives[/*:m:r8e341g9]
    [*:r8e341g9]mysql_fetch_row() si l'on veut un tableau à clés numériques[/*:m:r8e341g9]



Plus d'informations ici : http://www.expreg.com/fred_article.php? ... l_avec_php

Les risques d'injection SQL :

On n'injecte pas une variable directement dans une requête SQL sans la traiter au préalable. Surtout si c'est une variable pouvant être modifiée par un utilisateur (via un formulaire ou l'url par exemple) car on s'expose à des risques de piraterie par injection SQL (envoi de code SQL dans la variable).

On voit trop souvent ces choses là :

Code

<?php

$req = 'SELECT login, password FROM membre WHERE login = "'. $_POST['password'] .'"';

mysql_query($req) or die(mysql_error());
?>



Avec ça, vous êtes sûr d'être piraté par le moindre apprenti hacker du coin. Ce dernier va mettre du code SQL dans le champ "password" qui va ensuite se retrouver dans la requête SQL. Cette dernière aura comme valeur logique VRAIE à tout instant et va retourner les logins et mot de passe de votre base de données. Effrayant nan ?

Pour éviter cela, on protége les variables avec mysql_real_escape_string(). Cette fonction échappe tous les mots clés et caractères SQL dangereux (apostrophes, guillemets, NULL...). Ce qui donne maintenant :

Code

<?php

$req = 'SELECT login, password FROM membre WHERE login = "'. mysql_real_escape_string($_POST['password']) .'"';

mysql_query($req) or die(mysql_error());
?>



Plus d'informations ici : http://www.expreg.com/fred_article.php? ... phemagique

La faille include :

Faille très classique et souvent exploitée par les hackers. On ne fait jamais :

Code

<?php
include($_GET['page']);
?>



Il faut toujours vérifier ce qui provient de l'url et notamment la valeur de la variable $_GET['page']

Plus d'informations ici : http://www.expreg.com/fred_article.php? ... re_include

Boucle foreach :

On ne fait jamais de boucles imbriquées pour parcourir un tableau mais on utilise la boucle foreach()

Code


<?php
$tableau = array('rouge','vert','bleu','jaune','cyan','blanc','noir');

foreach($tableau as $valeur) {

echo $valeur ,'<br/>';
}
?>



Utilisation de htmlentities() :

Je vois trop souvent aussi de personnes qui font un htmlentities() avant d'insérer les informations en BDD. C'est une très mauvaise pratique pour les raisons suivantes :

-> Comment retrouver la chaîne originale ?
-> Mise à jour du contenu ?

Donc on n'utilise pas htmlentities() avant l'entrée en BDD mais en sortie. A l'entrée, on enregistre les données brutes sans les formater. Par contre on veille bien à les protéger avec la fonction mysql_real_escape_string() vue plus haut.

Personnellement je conseille de ne pas utiliser htmlentities(), qui est trop bourrin et trop lourd mais plutôt htmlspecialchars() qui ne transforme que les éléments html importants (< > & " et ' ). Si vous avez correctement encodé vos pages web, nul besoin de transformer les caractères spéciaux et accentués en entités HTML.

Voilà pour le moment, je m'en arrête là. Cette liste évoluera certainement quand je me rappelerai des autres bonnes pratiques que j'ai oubliées.

++

Hugo.

 

Palleas

Avatar de Palleas
6 messages
Neurone isolé
Neurone isolé

Lien direct Le 01 Janvier 2007 à 19h42

Je vais vraiment finir par croire que t'as une dent contre le siteDuZéroClin d'oeil

Sinon j'ai pris l'habitude d'utiliser sprintf() pour la construction de requetes notament...

Code


<?php
$req = sprintf('SELECT champ,champ2 FROM table WHERE id = %d',$_GET['id']);
?>

 

Webdeb73

Avatar de Webdeb73
207 messages
Carte Graphique 3D
Carte Graphique 3D

Lien direct Le 01 Janvier 2007 à 19h49

Sans pitié contre le SiteDuZero !

 

solidaritok

Avatar de solidaritok
2 messages
Neurone isolé
Neurone isolé

Lien direct Le 26 Janvier 2007 à 10h10

bonjour, j'aimerai une aide pour optimiser un programme avec les boucles que je ne sais pas faire correctement.

J'aimerai ensuite que si une valeur est nulle, elle s'affiche en gris.

voici le résultat :
http://www.solidaritok.com/index.php?pa ... he-moyenne

et voici le code source :

http://www.solidaritok.com/txt/affiche-moyenne.txt

En vous remerciant, amicalement, Solidaritok.

 

Webdeb73

Avatar de Webdeb73
207 messages
Carte Graphique 3D
Carte Graphique 3D

Lien direct Le 26 Janvier 2007 à 12h19

Pour que l'on t'aide, crée une nouvelle discussion. Ici tu te trouves dans un post particulier qui sert à ajouter des trucs et astuces, cours PHP...

 

<<<12>>>

[Page 1 sur 2 - 19 messages]