| Auteur |
Message |
Carte Mère
Messages: 902
Tutoriaux : 0
|
Posté le:
Lun 22 Aoû 2005 21:54 Sujet : [FAQ] Le salon du PHP |
  |
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.
- Vous avez oublié un point virgule à la fin d'une instruction, c'est la première étape à
vérifier.
- Vous n'avez pas refermé les parenthèses lors de l'utilisation d'une fonction.
- Vous n'avez pas fermé php par la balise ?> à la fin de la page.
- Vous n'êtes pas connecté à la base de donnée.
Quelques conseils pour mieux développer et se
simplifier la vie:
- Prendre l'habitude, pour un maximum de compatibilité avec les serveurs d'ouvrir PHP avec la
balise <?php au lieu de <? simplement.
- 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.
- 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.
- 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.
- 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.
|
_________________ Tout savoir sur les images numériques
Mon site: Conseils néophytes, toutes mes créations, plein de trucs
Boostez votre site!
Dernière édition par ben.popeye le Lun 22 Aoû 2005 22:01; édité 1 fois |
|
     |
 |
Carte Mère
Messages: 902
Tutoriaux : 0
|
Posté le:
Lun 22 Aoû 2005 21:55 Sujet : [FAQ] Le salon du PHP |
  |
Réservé pour une éventuelle prochaine mise à jour. |
|
|
     |
 |
Carte Mère
Messages: 902
Tutoriaux : 0
|
Posté le:
Lun 22 Aoû 2005 21:55 Sujet : [FAQ] Le salon du PHP |
  |
Réservé pour une éventuelle prochaine mise à jour. |
|
|
     |
 |
Carte Mère
Messages: 902
Tutoriaux : 0
|
Posté le:
Lun 22 Aoû 2005 22:01 Sujet : [FAQ] Le salon du PHP |
  |
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. |
|
|
     |
 |
Carte Mère
Messages: 921
Tutoriaux : 10
|
Posté le:
Lun 22 Aoû 2005 22:53 Sujet : [FAQ] Le salon du PHP |
  |
Tres bonne initiative !! Mis en post-it  |
_________________
Pouzy se cache derrière ce compte lorsqu'il n'est pas chez lui, question de sécurité
Statut : Kubuntu |
|
      |
 |
Carte Mère
Messages: 959
Tutoriaux : 0
|
Posté le:
Mar 23 Aoû 2005 09:13 Sujet : [FAQ] Le salon du PHP |
  |
Bon bein... à chaque erreur PHP que j'aurais dasn mes scripts je posterai
Et sinon les erreurs SQL on peut ? |
|
|
    |
 |
Carte Mère
Messages: 902
Tutoriaux : 0
|
Posté le:
Mar 23 Aoû 2005 12:45 Sujet : [FAQ] Le salon du PHP |
  |
Bien évidemment, je compte répertorier toutes les erreurs du moins les plus courrantes |
|
|
     |
 |
Carte Mère
Messages: 893
Tutoriaux : 0
|
Posté le:
Jeu 01 Sep 2005 14:42 Sujet : [FAQ] Le salon du PHP |
  |
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
Types d'erreurs, comment savoir ce qui cloche dans son code
?
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 ! |
_________________ Président de l'association PC-Shows
Smiliesworld : base de smileys en tout genre ! |
|
     |
 |
Neurone isolé
Messages: 6
Tutoriaux : 0
|
Posté le:
Jeu 06 Avr 2006 16:48 Sujet : [FAQ] Le salon du PHP |
  |
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 |
|
|
   |
 |
Carte Graphique 3D
Messages: 207
Tutoriaux : 1
|
Posté le:
Lun 01 Jan 2007 18:20 Sujet : [FAQ] Le salon du PHP |
  |
|
    |
 |
Carte Graphique 3D
Messages: 207
Tutoriaux : 1
|
Posté le:
Lun 01 Jan 2007 19:24 Sujet : [FAQ] Le salon du PHP |
  |
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ée
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.
- Ils peuvent être désactivés chez certains hébergeurs si la ligne short_open_tags du php.ini est positionnée à Off
- Il peut y avoir des conflits d'interprêtation avec la balise XML <?xml
Plus d'informations ici : http://www.expreg.com/fred_article.php?art=balise_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 ?
- Assurer la portabilité du code sur les différents hébergeurs
- Sécuriser les entrées pouvant être modifiées par l'utilisateur
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 :
- Le serveur SQL travaille plus vite car il sait déjà ce qu'il doit récupérer comme information.
- En cas de maintenance de vos scripts dans plusieurs mois, vous saurez tout de suite mieux vous
repérez dedans.
Plus d'informations ici : http://www.expreg.com/fred_article.php?art=guerre_des_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 :
- mysql_fetch_assoc() si l'on veut un tableau à clés associatives
- mysql_fetch_row() si l'on veut un tableau à clés numériques
Plus d'informations ici : http://www.expreg.com/fred_article.php?art=mysql_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?art=apostrophemagique
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?art=require_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. |
|
|
    |
 |
Neurone isolé
Messages: 6
Tutoriaux : 0
|
Posté le:
Lun 01 Jan 2007 19:42 Sujet : [FAQ] Le salon du PHP |
  |
Je vais vraiment finir par croire que t'as une dent contre le siteDuZéro
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']);
?>
|
|
|
|
    |
 |
Carte Graphique 3D
Messages: 207
Tutoriaux : 1
|
Posté le:
Lun 01 Jan 2007 19:49 Sujet : [FAQ] Le salon du PHP |
  |
Sans pitié contre le SiteDuZero ! |
|
|
    |
 |
Neurone isolé
Messages: 2
Tutoriaux : 0
|
Posté le:
Ven 26 Jan 2007 10:10 Sujet : [FAQ] Le salon du PHP |
  |
|
    |
 |
Carte Graphique 3D
Messages: 207
Tutoriaux : 1
|
Posté le:
Ven 26 Jan 2007 12:19 Sujet : [FAQ] Le salon du PHP |
  |
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... |
|
|
    |
 |
|
|
|
|
|