Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LES RÈGLES DE LA BONNE PROGRAMMATION EN PHP


Information sur la source

Catégorie :Tutoriaux Niveau : Débutant Date de création : 25/07/2004 Date de mise à jour : 23/08/2004 22:07:53 Vu : 15 896

Note :
7,8 / 10 - par 41 personnes
7,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (100)
Ajouter un commentaire et/ou une note

Description

Voici un tutorial sur les règles du PHP5 et aussi du PHP4 pour les configurations !
Il est conseillé de les suivre et de ne pas dire "Mais ça marche quand même de la manière que je fais !"
Pourquoi est-ce conseillé de suivre ses règles ? Tout simplement, votre site sera plus portable, et fonctoinnera avec les meilleurs fonctionnalitées.

Voici les règles pour PHP 4 ou 5 avec les variables à respecter.
Vous allez dans votre php.ini et vous modifier ces variables. Si votre site professionel (ou hébergement profesionnel) ne vous permet pas de changer ces variables, je vous conseille de tester le tout chez vous avec les bonnes variables. Ainsi, si vous changez d'hébergeur, et que celui-ci n'a pas les mêmes configurations, vous n'aurez aucun problème à faire fonctionner votre site.

short_open_tag = Off
Cette variable vous oblige à débuter vos scripts avec <?php et non plus <?. La variable short_open_tag va de plus en plus disparaître au cours du temps. Donc c'est à vous de bien programmer et de penser à utiliser <?php au lieu de <?
Attention, vous ne pouvez plus non plus utiliser <?=, il faut utiliser <?php echo
Auparavant, vous pouviez aussi coder immédiatement apres la balise comme <?if, mais maintenant, il faut y mettre un espace : <?php if...

register_globals = Off
Cette variable permet d'améliorer la sécurité de vos sites web. Elle vous oblige à utiliser les variables superglobales au lieu d'utiliser des variables simples.
Lors d'un envoi d'un formulaire, vous spécifiez la méthode et vous devez donc utiliser cette variable comme $_POST['variable'] ou $_GET, au lieu de $variable directement.
Même chose pour les variable $_SERVER, $_COOKIE, $_ENV...

error_reporting = E_ALL
Cette variable vous oblige à bien coder car elle va afficher toutes les erreurs possibles que le site peut générer. Vous avez surement un error_reporting qui empêche les erreurs NOTICE d'apparaître.
Si vous avez un NOTICE qui dit "Unidentified Variable", c'est parce que vous n'avez pas défini cette variable auparavant.
Vous ne pouvez pas faire un echo $_POST['variable'], si $_POST['variable'] n'existe pas auparavant...
C'est pour ca qu'il faut utiliser la fonction isset()
if(isset($_POST['variable']))
$variable = $_POST['variable'];
else
$variable = "";

display_errors = On
Bien que sur certains sites cette variable est à Off car il est dit que pour les sites professionels, il ne doit pas y avoir d'erreur qui apparait.
Si vous codez bien, même si cette variable est à On, il n'y aura pas d'erreur qui apparaîtra ;)

allow_call_time_pass_reference = Off
Avant, cette variable était réglé sur On... Elle permetait de passer à la volé des variables par référance à l'APPEL des fonctions.
Maintenant, si vous voulez passer une variable par référence, vous devez le définir dans la création de la fonction.
Mais au fait ? c'est quoi ca référence ?
Une variable par référence permet de passer un "pointeur" (pour les pro, c'est pas géré comme un pointeur à la base) vers une adresse mémoire.
Mais c'est quoi un pointeur ?
Lorsque vous passez une variable à une fonction (sauf les ressources) vous en faites une copie... Si vous la passez par référence, vous donner l'adresse mémoire de cette dernière. Ce qui a pour influence que vous pourrez modifier le contenu de cette dernière.
Exemple
function test(&$a){
$a = 5;
}
$bou = 3;
test($bou);
// $bou vaut maintenant 5;


Autres conseils :
Ne pas utiliser $_REQUEST... Ceci accepte les $_POST et $_GET. Vous savez d'ou vient votre variable, alors utiliser $_POST ou $_GET !

############################# AJOUT 2 AOUT 2004
Suite aux commentaires reçu dans ce post et dans d'autres, je post ce petit ajout sur les règles de la bonne programmation.

Recherche/Remplacement
Pour faire de la/du recherche/remplacement dans un texte, il est plus rapide d'utiliser les fonctions str_. Si vous devez trouver des choses plus compliqués vous pouvez utiliser ereg_. Par contre, il encore mieux d'utiliser les fonctions preg_ car celles-ci sont plus rapides.

echo/print
Si vous voulez gagner en rapidité, il est préférable d'utiliser echo car print retourne une valeur. Vous pouvez aller voir sur http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40.
Par contre, si vous souhaitez formater du texte, il est préférable d'utiliser printf ou sprintf.

SQL
Lors de requète SQL, il est préférable d'utiliser le nom des champs exacts plutot que d'utiliser la clé *. (SELECT * FROM...)
Pourquoi ? Parce que dans votre script, vous n'utiliserez certainement pas TOUS les champs que vous allez obtenir. De plus, si l'ordre des champs change il pourrait y avoir des problèmes avec votre code. (voir plus bas). MÊME si votre sql fais 10 mètres de long parce que vous placez des champs, je pense qu'il est préférable de faire ainsi !
Il est mieux d'utiliser la constantes MYSQL_ASSOC plutot que MYSQL_NUM (ou MYSQLI_...). Pourquoi ? parce que de cette manière, vous allez obtenir $var['champ'] plutot qu'un d'un numéro qui pourrait changer : $var[5].

La concaténation
Il est préférable de concaténer vos variables plutot que de les afficher directement dans vos strings.
Exemple : $var = "Something " . $other;
Plutot que $var = "Something $other";
Ici les 2 vont fonctionner mais il est préférable de faire le premier exemple parce que si vous devez afficher un tableau multidimensionnel par exemple, vous DEVREZ le concaténer. Donc, il suffit de lire "L'art de la Régularité" plus bas.
Je pense qu'il est préférable d'utiliser une concaténation avec des points (.) plutot qu'avec des virgules (,) parce que le standart est quand même le point et que sur php.net vous verrez rarement une concaténation à virgule.

Apostrophe/Guillemet
Lors d'un affichage d'un simple texte, il est dit que c'est plus rapide d'utiliser les apostrophe car PHP ne remplace pas les variables dans le texte entre apostrophes. Par contre ici, il suffit de suivre "L'art de la Régularité" cité plus bas.

include_once
Lorsque vous insérer plusieurs fichiers (include) car vous êtes maintenant rendu au stade ou vous programmer modulairement (oui ca prend du temps). Plusieurs fichiers ont besoin de d'autres pour fonctionner. Donc logiquement, vous les appeler avant. Mais pour être encore plus logique, il serait préférable de faire un include_once au début de ces fichiers qui ont besoin des fichiers précédemment appeler.
Pourquoi ? Parce que comme en C, vous faites des #include afin de montrer que certaines fonctions sont dans d'autres fichiers et vous en aurez besoin. include_once signifie que vous n'appelerai le fichier qu'une seule fois. PHP va savoir si le fichier est déjà chargé. De plus comme avantage, si jamais vous vouler utiliser que le fichier x.php, vous verrez IMMÉDIATEMENT de quels autres fichiers il a besoin.
Question rapidité ? Il est peut-etre vrai que vous perdez quelque milisecondes avec beaucoup d'include_once mais je ne pense pas que ca soit ca qui compte. D'autres vont préferer de faire "// Ajouter le fichier y.php" en commentaire en haut du fichier. Mais il est préférable de faire ces include_once car vous n'aurez pas à modifier le code si vous prenez par exemple les fichiers requis et que vous les déplacez dans un autre dossier !

include/require ?
La différence entre les 2 est que require va emettre une Fatal Error alors que include va emettre un Warning si le fichier à inclure n'est pas trouvé

L'art de la Régularité
Essais d'être régulier dans vos codes. Si vos tableaux vous les appeler avec des apostrophes ($var['test']) et parfois avec des guillemets ($var["test"]), vous ne garderez pas une régularité. Employez une des deux notations et gardez la ! (Ici il est préférable d'utiliser les aportrophe question de rapidité).
Ceci ne vaut pas seulement pour les apostrophes et appel de tableau, mais aussi par exemple les appels de fonctions (FOpen, et fopen font la même chose, mais gardez dont l'habitude de faire que fopen). Même chose avec print et echo.

L'affichage des erreurs (@)
Il est vrai que sur un site web professionel on ne doit pas voir les erreurs. L'utilisation de @ est à proscrire ! Il vaut mieux essayer de trouver le problème plus haut dans votre code plutot que d'executer des lignes et des lignes inutiles...
Par exemple, lors de la connexion à une base de données. Vérifiez si vous êtes connecté avant de faire un query. Même chose pour un fetch_array, vérifier que votre Query est bon ! Ainsi, vous éviterez d'utiliser les @.
La seule utilisation que vous pouvez faire car vous n'avez pas le choix, c'est par exemple à la connexion de la base de données... Ici vous pouvez quand même faire un if, mais il vous sortira un Warning ou une Notice. Vous pouvez cacher ces erreurs, mais gérer les !

Fonctions Modulaires
Une fonction modulaire est une fonction qui peut fonctionner partout ! sans avoir besoin de 3000 autres lignes de code. À l'utilisation de ces fonctions, un utilisateur n'aurait pas besoin de comprendre ce qu'il y a dedans, mais seulement ce que l'on doit mettre et ce qu'il y a en sortie.
Si une fonction doit absolument recevoir du texte, mettez une vérification "si int... transforme le en string". Toutes ces genres de vérification doivent être faites DANS la fonction et pas par l'utilisateur dans son script.
Vous allez dire "Oui mais, c'est moi qui code, je ne suis pas con à mettre un int alors que je sais qu'il faut un string". Ok, mais si d'autres ne font pas expres et placent un int... ?

Fontions Modulaires : La gestion d'erreurs
Une bonne gestion d'erreur sur les fonctions modulaires est très utile. Si vous devez retourner un string par exemple, et qu'il y a une erreur, alors retournez FALSE. En PHP, même chose pour les int... retournez FALSE (pourquoi je dis en PHP ? parce que en C++, si on doit retourner un int, alors on a l'habitude de retourner -1 en cas d'echec par exemple...)
Si votre fonction existe plusieurs points de sorties en tant qu'erreur (des return FALSE) et un return TRUE en tant que réussite, vous pouvez retourner des codes d'erreur. (return 1, return 2...) Ainsi, vous faites un commentaire en haut de votre fonction et vous expliquez ... Si 1 alors ... si 2...
Si cette fonction a bien fonctionné, au lieu de retourner TRUE, vous retournez 0. Zéro signifie que la fonction s'est terminé correctement.

############################# AJOUT 13 AOUT 2004
Fin du Script
À la fin de votre script, assurez vous de fermer toutes les choses que vous avez ouverte lors de son exécution même si la documentation vous affirme que cela se fait tout seul, il est préférable de le faire par vous même.
Par exemple pour les connexions SQL, les fichiers, les classes (créées dynamiquement), ...

PHP5 et les Classes
* Les mots-clés private, public, et protected
Ces mots-clés servent à définir la portées des variables et des fonctions. Sachez que vous ne pouvez pas les utiliser sur les fonctions définies par PHP (ex: __construct()).
private : Les variables ou fonctions private seront accessibles par la classe seulement qui possède la variable ou la fonction.
public : Les variables ou fonctions public seront accessibles dans tout le script ! Ceci est la valeur par défaut des variables et fonctions. Il est déconseillé de l'utiliser partout !
protected : Les variables ou fonctions protected seront accessibles par la classe même ou les classes parentes à celles-ci.

* Les Constructeurs et Destructeurs
Auparavant les constructeurs en PHP5 étaient écrit de la sorte :
function nom_de_la_classe()
et il n'y avait aucun destructeur. Maintenant le constructeur est __construct() et destructeur __destruct(). Sachez que vous ne pouvez les appeler directement.
Aprenez à bien utiliser __destruct() ! Si votre classe ouvre un fichier dans __construct(), eh bien fermez le dans __destruct() !

Classe pour mySQL et mySQLi et autres
Les technologies changeant rapidement ainsi que vos pages, je souhaite pour vous que vous n'ayez pas à retaper tout un code si vous devez changer d'hébergeur !
C'est pour quoi je vous propose la classe suivante :
http://www.phpcs.com/code.aspx?id=24813
Allez y jeter un coup d'oeil
 

Conclusion

Si vous avez d'autres questions ou des commentaires, n'hésitez pas à les poser ici.
Maintenant, vous n'avez plus de raison de dire "Mais ca marche quand même" ou de ne pas bien programmer ;)
Si vous postez initié ou expert, essayez dont de suivre ces standards !
 

Historique

02 août 2004 17:21:28 :
Quelques Ajouts
03 août 2004 01:54:56 :
Ajout de include/require et Affichage des Erreurs
03 août 2004 02:06:04 :
Ajout de "Fonctions Modulaires", "Fonctions Modulaires : La gestion d'erreurs"
13 août 2004 16:50:07 :
Ajout de - Fin du Script - Les mots-clés private, public, et protected - Les Constructeurs et Destructeurs - Classe pour mySQL et mySQLi et autres
13 août 2004 16:52:01 :
Le lien http://www.phpcs.com/code.aspx?id=24813 ne s'était pas envoyé.
23 août 2004 22:07:54 :
Correction Faute de Frappe

Commentaires et avis

signaler à un administrateur
Commentaire de Antidote le 25/07/2004 20:37:21

Merci d'avoir fait l'effort de posté ceci avec les expliquations en prime.

Je pense pour les débutants qui aurait du mal avec le principe des poiteurs on peut utilisé l'attribut "global" qui à le même rendu sur ton exemple.

---------
<?php
function test(){
     global $bou;
     $bou = 5;
}

$bou = 3;

test();

echo $bou;
// affiche 5
?>

signaler à un administrateur
Commentaire de GRenard le 25/07/2004 20:49:08

Il est quand même mieux en principe d'utiliser les passages par références des variables si celles-ci font partie intégrante de la fonction et doivent être modifiées...
Si vous ne passez que des variables de langage par exemple, vous pouvez utiliser global.
Dans l'exemple plus haut, comme la fonction ne fait que jouer avec la variable, il est préférable de le passer en référence, bien que le mot clé global fait la même chose dans ce cas.

signaler à un administrateur
Commentaire de Antidote le 25/07/2004 21:13:24

exact j'en profitait simplement pour rappeler l'utilisation de global la référance restant l'outil optimum

signaler à un administrateur
Commentaire de Inekman le 26/07/2004 02:23:43

Excellent initiative, et très bien expliqué. Si y'a d'autres règles importantes, n'hésite pas à mettre à jour. :-P

Inekman.10/10

signaler à un administrateur
Commentaire de manuc le 26/07/2004 09:52:55

Merci GRenard pour cet excellent rappel sur les variables

signaler à un administrateur
Commentaire de LocalStone le 26/07/2004 12:44:25

Hééé, dis-donc GRenard, j'ai une question.
J'ai vu sur la doc PHP que y a un autre tableau superglobal : $_GLOBAL. Et à quoi sert-il ? Parce que évidement, je ne m'en souviens plus et comme ça, ça fera profiter tout le monde ...
++ & merci !

signaler à un administrateur
Commentaire de WhiteDwarf le 26/07/2004 14:17:52

Inekman a dit : "Excellent initiative, et très bien expliqué. Si y'a d'autres règles importantes, n'hésite pas à mettre à jour. :-P"

J'suis d'accord... bravo ! très bon post, 10/10

signaler à un administrateur
Commentaire de GRenard le 26/07/2004 15:48:19

$GLOBALS et non $_GLOBAL peut-etre utilisé dans les fonctions pour accèder à des variables définies globalement (hors de la fonction).
Il est déconseillé d'utiliser cette variable (à mon avis) car vous n'avez qu'à vous même spécifiez que les variables dont vous avez vraiment besoin sans accèder à toutes avec $GLOBALS. Utilisez le mot-clé global.

signaler à un administrateur
Commentaire de windu le 26/07/2004 18:51:06

Merci GRenard pour ce tuto sur les variabl & les réglage a fair.. depui le tps kon te voi mettr partou les meme remark sur les réglage (tel que rgister_global...), on aurai dui s'attendr a un tel tuto! loool
Mai g kan meme 1 kestion: kel es la différence entr <? et <?php??? g conai l'utilité de register_global & des otr varaibl ke tu cite mai g tjs cru ke <? et <?php n'etai kune kestion d'abitude, cela change-t-il kelke chose a la sécurité ou a la vitesse d'exécution du script???

signaler à un administrateur
Commentaire de Anthomicro le 26/07/2004 21:50:41

Salut ;-)

Je me permet de répondre à la place de GRenard

<? et <?php n'influe en  rien à la vitesse d'exécution, seulement certains serveurs ont leur directive short_open_tags à off, et donc le premier cas ne fonctionne pas. Mettre <?php assure une portabilité maximale du code.

a ++

signaler à un administrateur
Commentaire de loupdesombres le 27/07/2004 14:31:52

Bonjour a tous.

LOL Bien joué GRenard... j'en connais qui arrêtera de répéter la même chose dans ses commentaires "initiés" pour faire un simple pointage sur ce tuto.

Just kippin' trying

signaler à un administrateur
Commentaire de lumesh le 28/07/2004 10:16:03

autre conseil:

Lors de la récupération de formaulaire prevoir un test de contenu.

Exemple:   $maval = isset($_POST"maval"]) ? $_POST["maval"] : "";

C'est toujours plus sympa et on ne sait jamais.
On pense toujours aux bugs que peut nous sortir nos script mais tres rarement a ce qu'un internaute malveillant peut faire.
Si votre site arrive a parrer les conneries d'un internanute, cest genial et ca lui donne une bonne image.

Et lol pour le $GLOBALS, un truc sympa pour etre sur que tout serra en global:

global($GLOBALS);

la au moins c sur, tout le monde y a acces ! ;)

GRenard, 10/10 :)

signaler à un administrateur
Commentaire de f bnkcm le 28/07/2004 22:43:07

Merci GRenard pour ce tuto, j'ai l'impression que tu l'a fait pour ceux qui codent comme moi, ça m'aidera beaucoup à améliorer ma façon alors merci encore.

signaler à un administrateur
Commentaire de Cyberboy2054 le 31/07/2004 15:29:47

Pourquoi est ce que maintenant doit-on utiliser
<?php ?> au lieu de <? ?> ?
c'est dû à un probleme de sécurité ?
Sinon je n'en vois pas l'intérêt, ca rallonge le code pour rien.

signaler à un administrateur
Commentaire de windu le 31/07/2004 15:38:43

cyberboy2054>>g déjà posé la meme kestion ici.... faut lire les messages des autres avant de poster!!!!

signaler à un administrateur
Commentaire de Cyberboy2054 le 01/08/2004 00:00:09

J'ai vu, mais quel intérêt pour les serveurs de t'obliger à taper <?php au lieu de <? ? Ils y gagnent quoi eux, de leur côté ? Et nous, on y gagne quoi ?

signaler à un administrateur
Commentaire de loupdesombres le 01/08/2004 00:28:38

Bon, on reprend.   <?    ?>  est un balisage générique indiquant du code a interpréter.
N'importe quel code.  (les déclaration de type de fichier les reprennent aussi par exemple).
Préciser <?php ?> et short_open_tag = Off evite de faire interpréter par php toute les balise <? ?> dans le document (ce qui pourrait entrainer erreur ou perte de temps).
Ce n'est vraiment que pour te montrer un cas ou çà peu bloquer que je dis çà.
Car qui code en php l'indique! Un point c'est tout.
Quel est le plus clair et précis selon toi, entre "Je parle" et "je parle français"...

signaler à un administrateur
Commentaire de Cyberboy2054 le 01/08/2004 02:37:06

Ok, je ne savais pas qu'on pouvait mettre autre chose que du php dans <? ?> (débutant inside)
Maintenant je le saurais pour les prochaines fois ...

signaler à un administrateur
Commentaire de GRenard le 02/08/2004 04:42:35

Qu'est-ce que tu dis la ?
Relis ce qu'à dit loupdesombres... C'est que c'est plus logique à la base de mettre <?php car on voit bien le mot "php" avec <? on ne le voit pas...
Tu peux avoir <?xml ce qui signifie que c'est du xml et non du php.
Si tu codes avec <?php, tu es sur que ton codes va marcher partout (et les autres règles !). Si tu codes avec <?, ton site va marcher que sur les serveurs ou short_open_tag = Off. Les serveurs ont rien à y gagner... Seulement toi, et nous !

signaler à un administrateur
Commentaire de Hellway le 02/08/2004 05:18:08

Pour les <?php, un simple exemple, la déclaration d'un document xml :
<?xml version="1.0" encoding="iso-8859-1"?>

Dans ce cas, on peut être confronté à une erreur et ce type de déclaration va être très fréquente avec les nouveaux standards comme xhtml par exemple.

signaler à un administrateur
Commentaire de babid le 02/08/2004 11:14:58

Salut,

D'abord merci à GRenard pour son tuto, et je tiens à te remercier plus particulièrement pour ta class SQL qui m'a fait gagner un temps monstre.
(cf.  http://www.phpcs.com/code.aspx?ID=24813)

Je tenais juste à rajouter des petites questions que je me poses (dont j'ai la solution pour certaine) mais pour compléter ton tuto :

* Question de rapidité d'exécution et d'utilisation :
    - Est-il vrai qu'il vaut mieux écrire ses balises en minuscules plutôt qu'en majuscules ?
    - En php, il vaut mieux utiliser l'apostrophe plutôt que le guillements pour les echo, et l'inverse en JavaScript ?
    - Est-il préférable d'utiliser la fonction echo ou print ?
    - La fonction ereg est plus rapide que la fonction str, mais la fonction preg est plus rapide que ereg ?
    - Quel sont les comparatifs de fonction a utiliser plus que d'autre (dans le même sens que ereg/str/preg) ?

Voila, je pense que ces petites questions complétera ton tuto, car bien codé c'est aussi avec un script qui s'exécute correctement mais aussi rapidement.

Merci pour ta réponse GRenard et bonne continuation.

Babid

signaler à un administrateur
Commentaire de babid le 02/08/2004 11:17:52

Désolé, j'avais oublié [10/10] pour ton tuto, en espèrant que les posteurs de codes s'en serviront ;)

signaler à un administrateur
Commentaire de Anthomicro le 02/08/2004 12:05:44

Salut ;-)

* Question de rapidité d'exécution et d'utilisation :
>Est-il vrai qu'il vaut mieux écrire ses balises en >minuscules plutôt qu'en majuscules ?

en minuscules

>En php, il vaut mieux utiliser l'apostrophe plutôt que le >guillements pour les echo, et l'inverse en JavaScript ?

tout à fait, et au lieu d'utiliser le point (dans les echos) pour la concaténation il faut utiliser la virgule

>Est-il préférable d'utiliser la fonction echo ou print ?

Echo puisque print retourne 1 (ce qui est plus lent)

>La fonction ereg est plus rapide que la fonction str, mais la fonction preg est plus rapide que ereg ?

Faux, str est plus rapide que ereg.
preg est plus rapide que ereg (car il utilise une syntaxe différente)

>Quel sont les comparatifs de fonction a utiliser plus que d'autre (dans le même sens que ereg/str/preg) ?

par exemple echo au lieu de print, str_replace (pour les règles simples) au lieu de ereg_replace, file_get_contents() au lieu de fopen +fgets+fclose.

a ++

signaler à un administrateur
Commentaire de Antidote le 02/08/2004 14:03:28

On pourrai préciser aussi la différence entre ' et " en php. entre " c'est plus lent parce que  la ligne est analyser ex :

<?php

$ma_var = 'tout le monde';

echo 'Bonjour $ma_var';
// affiche Bonjour $ma_var.

echo "Bonjour $ma_var";
// affiche Bonjour tout le monde.
?>



signaler à un administrateur
Commentaire de babid le 02/08/2004 14:22:20

Salut,

Tout d'abord merci pour ces précisions claires et rapides.

Je souligne tout de même un point :

Je cite GRenard dans les commentaires de :
http://www.phpcs.com/code.aspx?ID=24899#commentaires

"Je pense que ereg est plus rapide que str, et preg est plus rapide que ereg"

Or Anthomicro, tu dis :
"Faux, str est plus rapide que ereg.
preg est plus rapide que ereg (car il utilise une syntaxe différente)"

Sans aucune méchanceté, faut accorder vos violons !!!

Ensuite Anthomicro, tu écris :
"tout à fait, et au lieu d'utiliser le point (dans les echos) pour la concaténation il faut utiliser la virgule"
Peux-tu me donner un exemple car je ne connais que la concaténation avec le point, et qu'en pense GRenard sur ce point ?

Cela me rappele aussi une question que j'ai oublié de noter :
Faut-il concaténer ou non ? (Je ne parle pas des variables de tableaux car là on est obligé de concaténer)
Exemple :
<?php

$ma_var = 'tout le monde';

//1er méthode
echo 'Bonjour $ma_var';

//2ème méthode
echo 'Bonjour '.$ma_var;
?>

Est-ce que l'une des méthodes à une éxécution plus rapide que l'autre ?

Merci pour vos réponses.
Bye et bonne continuation

signaler à un administrateur
Commentaire de Antidote le 02/08/2004 14:45:32

C'était pas plutôt

//1er méthode
echo "Bonjour $ma_var";

?

signaler à un administrateur
Commentaire de babid le 02/08/2004 15:16:18

Salut,

Non Antidote, justement, quel est la meilleur méthode entre la concaténation et sans concaténation :
Exemple :
<?php

$ma_var = 'tout le monde';

//1er méthode sans concaténation
echo 'Bonjour $ma_var';

//2ème méthode avec concaténation
echo 'Bonjour '.$ma_var;
?>

Par contre je ne vois pas aussi comment on concaténe avec des virgules ( cf commentaire d'Anthomicro)

Merci

signaler à un administrateur
Commentaire de Antidote le 02/08/2004 15:41:25

Je ne connait pas pas de concaténation par virgule en php.

Que te répondre bahid puisque que tes deux méthode n'afficheront pas le même résultat. Elles n'ont rien à voir entre elles ?

signaler à un administrateur
Commentaire de babid le 02/08/2004 16:12:45

Merci Antidote pour ta réponse,
Moi non plus je ne connait pas de concaténation par virgule ???!!!!! C'est Anthomicro qui en parle dans son commentaire, je verrai bien quand il répondra.

Ensuite c'est vrai que mon exemple ne donne pas le même résultat, par contre si on a l'exemple suivant :
Exemple :
<?php

$ma_var = 'tout le monde';

//1er méthode sans concaténation
echo "Bonjour $ma_var";

//2ème méthode avec concaténation avec guillemet
echo "Bonjour ".$ma_var;

//3ème méthode avec concaténation avec apostrophe
echo 'Bonjour '.$ma_var;
?>
Quel est la méthode la plus rapide ??
Cette question n'est pas primordiale mais c'est dans l'esprit de bien codé.

Merci pour vos réponses.

signaler à un administrateur
Commentaire de Anthomicro le 02/08/2004 16:20:30

C'est mieux de concaténer. Tout dépend aussi du résultat que tu attends.

Pour str qui est plus rapide que ereg il suffit de regarder le site officiel (php.net).

Exemple de concaténation à virgule (marche seulement pour les echos)

echo 'Salut',$visiteur,' !';

par contre $var='Salut',$visiteur,' !'; ne fonctionnera pas, il faut concaténer avec le point dans ce cas là :

$var='Salut'.$visiteur.' !';

D'une manière générale les simples quotes (apostrophes si tu préfères) sont plus rapides que les doubles quotes (guillemets) car tout ce qui se trouve entre les guillemets est interprété, pas ce qui se trouve entre simples quotes.

Bye

signaler à un administrateur
Commentaire de babid le 02/08/2004 16:35:21

Merci Anthomicro pour tes réponses,

Franchement je ne connaissais pas cette concaténation avec la virgule. On en apprend tous les jours (heureusement sinon on se ferai chi...). Bon merci pour tous ces conseils, je connaissais certaines réponses mais je n'en étais pas sûr. Ce tuto s'adressant à des débutants, je ne voulez pas les enduire en erreurs donc merci à Anthomicro et Antidote pour vos réponses.

Bonne continuation tout le monde.

Bye

signaler à un administrateur
Commentaire de GRenard le 02/08/2004 16:38:20

Désolé de ne pas répondre vite aux questions qui me sont posées, mais j'habite au Québec alors il y a un petit décalage horaire ;)

Pour ereg et str que j'avais mentionné dans une autre source, j'avais écris "Je pense" et bien je ne faisais que penser parce que c'était faux.
Pour l'affichage des variables, pour ma part j'ai toujours utilisé echo, ou sinon printf si j'ai du formatage à faire.
De plus, j'ai toujours utilisé des guillemets pour faire des echo et toujours des . pour mes concaténation... je pense qu'on s'y retrouve mieux avec des points et des virgules. (Surtout que c'est un standard). Pour ce qui est des variables, je les concatène (woua c'est un verbe ?) tout le temps. C'est plus lisible et on garde le "pattern" car lorsqu'on veut afficher un tableau à multiple dimension, on a pas le choix de concatener.

Pour ce qui est des array dans un tableau, j'ai toujours utilisé des apostrophes...
À mon avis, question rapidité, comme le mentionne php.net, la différence entre print et echo est tellement minime.
Vous pouvez faire un tour sur http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40 (anglais).
Donc rendu à ce point, je pense que c'est rendu une question d'habitude et de manière de coder. La seule chose que je dis la dessus, c'est de garder toujours le même pattern. Si vous utilisez print, echo, " ou ' dépendamment de votre humeur, la je pourrais dire que c'est "mal" codé. (Même chose pour les balises par exemple en minuscule et majuscule).

Juste pour une petite précision, les balises en minuscule en HTML c'est mieux pour les prochaines compatibilitées en XHTML.

signaler à un administrateur
Commentaire de babid le 02/08/2004 16:52:54

Merci GRenard pour ton point de vue sur les questions, par contre excuse moi mais qu'appeles-tu "pattern" ??

signaler à un administrateur
Commentaire de GRenard le 02/08/2004 16:58:21

J'entends cela par ... mmm comment dire en francais...
De garder un style de codage pareil sur tes pages.
Si une fois tu fais <? et l'autre tu fais <?php
Si une fois tu fais fopen() et l'autre fois tu fais FOpen()
Si une fois tu fais echo et l'autre print
Si une fois tu fais $var["test"] et l'autre $var['test']

Ca ne sera pas très joli... Si tu garde une manière de coder, garde la partout.

On dirait babid que tu aimes mes sources ;) merci de me soutenir ;) Si tu adores vraiment ma source Class Langage SQL (http://www.phpcs.com/code.aspx?ID=24813) va poster un petit commentaire ;) parce que beaucoup de monde se demande à quoi ca sert !

Merci à toit babid ;)

signaler à un administrateur
Commentaire de GRenard le 02/08/2004 17:22:42

J'ai fais un ajout de quelques petites choses... Pourquoi je l'écris ici ? Parce que vous recevez tous normalement un mail (dans les configs par défaut) lorsqu'un commentaire est ajouté, mais vous ne recevez pas de mail lorsqu'on modifie un code ;)

Vous pouvez continuer à ajouter de beaux commentaires ;)

signaler à un administrateur
Commentaire de babid le 02/08/2004 17:27:14

En effet, j'aime bien tes sources, c'est vrai que certains peuvent trouver "chiant" que tu rabaches toujours les mêmes commentaires mais bien codé est aussi un atout pour la portabilité, etc...
Parfois tu t'acharne un peu sur des débutants qui essaient de faire de leur mieux alors vas-y doucement, il y a un début à tout. Toi ainsi que beaucoup d'autre et moi même, ont été débutant. Il faut le temps d'apprendre, soif plus diplomate dans tes commentaires, ils sont instructifs mais ils peuvent en décourager certains.
Ceci dit, je vais aller mettre un commentaire sur ta source de la Class SQL.

Bon courage à tous et bonne continuation

PS:
- c'est vrai que je code beaucoup et que je n'ai guère le temps de poster des sources, mais dès que j'ai l'occasion, j'en mettrai quelques unes.
- pour GRenard particulièrement, continue comme ça (avec plus de tacte sur les commentaiers), tes sources sont vraiement excellentes

Bye

signaler à un administrateur
Commentaire de babid le 02/08/2004 17:33:00

Encore une question pour compléter ce tuto. Je pense qu'il faut préciser la différence entre les fonctions include et require. Personnelement, j'utilise require car cela équivaut à include_once. Je ne connais pas la différence de rapidité, de ce coté là je laisse GRenard, Antidote ou Anthimicro, répondre à ça.

Bye

signaler à un administrateur
Commentaire de GRenard le 03/08/2004 01:58:33

Tu te trompes... require n'équivaut pas include_once... require_once existe...
J'ai rajouté quelques petites choses dans le tutoriel encore !

signaler à un administrateur
Commentaire de thibob le 03/08/2004 12:23:41

suis suppris pour els doubles quotes...
un truc dont vouis avez pas parlé et qui est pourtant très pratique:

echo "blablabla ${mavar}";


sinon sur le tuto, pour les variables à initialiser, mon hébergeur a vite changer la config de son serveur dès qu'il a vu les notice de partout .... sérieusement, vous pensez savoir initialiser toutes vos variables vous ?? ou laors j'aimerais bien avoir une fonction parce que ça complique bien les choses....

signaler à un administrateur
Commentaire de oga le 03/08/2004 14:58:32

Bonjour a tous,
je suis tout nouveau ici et j'apprecie a sa juste valeur le travail effectue par GRenard pour assembler ces quelques regles de "bonne programmation", c'est tres utile de ne pas etre oblige de chercher a droite et a gauche ;-)
Deux remarques tout de meme :

1) Une premiere dans le sens de l'intervention de  thibob :
vous pouvez parfaitement integrer un tableau entre des guillemets, grace aux accolades({}), comme ceci :

echo "Valeur : {$monTableau['dim1']['dim2']['dim3']}";
(voir chapitre "Les chaines de caracteres" du manuel PHP, a partir de la version 4)

2) Une seconde sur le chapitre "include_once" du tutoriel : un peu brumeux pour moi ;-) Je n'ai pas tout saisi meme si je comprends la philiosophie de include_once !

Voila,
Encore merci !

signaler à un administrateur
Commentaire de Antidote le 03/08/2004 15:10:00

Thibob => d'après ce que je sais "blablabla ${mavar}" équivaut "blablabla $mavar" j'en suis pas sur mais je crois bien.

Bien qu'on (que je ?) pense à initialiser toutes mes variables. Ça doit faire partie de la logique de la programmation.
Avant de faire un gateau tu vas acheter de la farine ?
Avant d'utiliser une variable tu l'initialises.

Je viens du Delphi à l'origine et quand tes sources ne peuvent pas êtres compilées parce que tu n'as pas initialisé une variables je t'assure qu'après tu prend très vite l'habitude de toutes les initialisées.

Comme quoi GRenard mon idée de faire ce "tuto" n'était pas si mauvaise ;)

signaler à un administrateur
Commentaire de GRenard le 03/08/2004 18:27:13

Très bonne idée hein de faire un tuto de la sorte :) il devrait rester dans les sources au top du site sur la page d'accueil :P
Pour ce qui est de l'initialisation des variables, oui il faut le faire, ce n'est pas plus long si tu le fais dès le début ! J'ai demandé à mon hébergeur professionel de mettre register_globals à Off. Il l'a fait, mais j'espère juste que ca ne dérangera personne d'autre (peu-etre est-ce effectif que pour moi car c'est des dossier virtuel).
Ensuite pour ce qui est de include_once voici un exemple. (C'est plus logique en C++ mais voici quand même en PHP)

header.php : ce fichier include pleins de fichiers
include("config.php");
... ("db.php");
sessions.php
page.php
stats.php
member.php
...

Et maintenant, si on va voir dans sessions.php
Mes sessions, fonctionnent avec une base de données, je vais donc faire tout en haut du fichier
include_once("db.php");
Ici le fichier ne sera pas "réinclu" parce qu'il l'a déjà été avec le fichier header.php. C'est seulement pour "avertir" que si jamais je prend le fichier sessions.php et que je l'apporte ailleurs, je vais avoir besoin de db.php (et la je pourrais peut-etre voir dans db.php un include_once("config.php");)

Vous comprenez mieux l'histoire des include_once :) ?

J'espère pour vous ;) Mais peu de sites le font parce que c'est déjà une "perte" de temps, et leur script fonctionne que pour LEUR site... et aucun autre. Mais moi par exemple, j'ai une base de site web qui fait environ 1000 lignes, 70ko, 21 fichiers. J'en avais juste marre lorsque je copie cette base vers un autre site de tous rechercher qu'est-ce qui faut que je fasse...

signaler à un administrateur
Commentaire de windu le 04/08/2004 00:28:40

GRenard>>bonne explication de incude_once... par contre, il me semblait qu'il existait une autre différence entre require et include (tu dis que c'est seulement le type d'erreur Warning ou Alert): require incluera obligatoirement le fichier alors que include ne le fera que si la ligne ou il se trouve s'exécute (si un include est dans un if qui n'est pas validée alor il ne sera pas inclus mais le require si...)! C'est ce qu'il me semblait avoir vu ici: http://www.nexen.net/docs/php/annotee/function.require.php?lien=require
si cela peut apporter une pierre à l'édifice de ce tuto....

signaler à un administrateur
Commentaire de GRenard le 04/08/2004 19:16:00

Arretez de pointer des liens vers nexen... le vrai et l'unique est PHP.net !
Un require ause une Fatal Error, et un include un Warning... à ce point, je n'ai pas expliqué mais une Fatal Error fait arreter un script alors qu'un Warning continue d'executer le script... vous pouvez faire un if avec un @ si vous voulez vous même gérer l'erreur.

signaler à un administrateur
Commentaire de Bahanix le 05/08/2004 16:51:53

Grenard c'est pas mal mais ta façon d'écrire fait un peu prétentieuse.
J'ai pas lus les derniers messages, mais désolé, le "Arretez de pointer des liens vers nexen... le vrai et l'unique est PHP.net" je le prend plutot mal : chacun choisi les sites qu'il veut voir, d'autand plus que php.net est anglais !! Alors stp ca ne te concerne pas les sites que les gens vont voir, si qqn veut faire un lien sur nexen ou php.net, il le fait s'il le souhaite.
Au pire si ca te derange tant que ca donne l'équivalent de la page sur php.net...

Idem pour le niveau "débutant", pour le début, ok, mais la fin je te dit que qqn qui débute en php comprendra pas grand chose, moi je prend ca comme "Je connais tellement de choses que cette minuscule fraction de mes connaissances ne méritent que le terme de débutant"...

signaler à un administrateur
Commentaire de GRenard le 05/08/2004 18:14:53

First of all, la moitié des sites que le monde pointe sont des sites completement copié de A à Z de php.net
Deuxièmement, tu ne dois pas y aller souvent sur php.net parce qu'il y a plus que l'anglais comme langue, il y en a plus que 20 (dont le francais).
J'ai écris ici les règles de la programmation que je crois qu'il faut suivre. Si tu ne comprends rien, ne les suis pas tout simplement, tu vas les apprendre plus tard.
Ou sinon, si tu es un peu plus intelligent, tu post un commentaire demandant d'expliquer un peu plus une règle comme certain ont déjà fait.

Prétentieux moi ? oui à la réception de ton genre de commentaire... Qui dit que des conneries à mon avis ! (et celui-ci est le mien !!)

signaler à un administrateur
Commentaire de thibob le 06/08/2004 19:37:48

Merci Bahanix lol.

GRenard, ce que Bahanix veut dire c que php.net, le vrai est en anglais, les autres ce sont des traductions... donc probablement aussi équivalentes aux autres comme nexen. d'ailleurs nexen héberge php.net...

Antidote: tu peut pas faire ce que tu veut avec un echo "blabla $mavar blabla": comme echo "blabla $mavar[1]";, alorqs que tu voulais jste mettre $mavar et pas la première valeur dans le tableau mavar qui existe pas... du coup tu dois faire echo"blablabla $mavar []"; et c vrai avec plein d'autres choses ... c'éatit un avantage de faire echo'blablabla '.$mavar.'[]'; plus avec les { et } :)

signaler à un administrateur
Commentaire de Antidote le 07/08/2004 15:30:58

c'est vrai j'avais pas penser à ça. Merci ^^

signaler à un administrateur
Commentaire de rob85 le 09/08/2004 15:19:54

Tout d'abord, barcvo pour ce tutorial qui va en aider plus d'un !!
Je me demandai sune petite chose, il y a un livre intitulé "extreme programming"..., est-ce qu'il y a un rapport avec ce tutorial? est-ce que quelqu'un l'a lu??

signaler à un administrateur
Commentaire de GRenard le 09/08/2004 17:42:40

Je n'ai pas lu ce livre, je ne lis plus de livre PHP depuis un bon bout :P
Donc s'il y a une ressemblance, c'est bien malgré moi, ou sinon c'est eux qui m'ont copiés !

signaler à un administrateur
Commentaire de windu le 09/08/2004 23:33:17

toujours aussi modeste GRenard... loool!
rob85->On m'a déjà conseillé ce livre mais je ne l'ai pas encore acheté...
Bahanix-> je suis d'accord avec toi, je défends mon droit à pas trop savoir parler anglais, et même à préférer lire un site en français (n'y voyez pas un franchouillard franco-français mais juste un type qui en a marre d'être parfois envahi par l'anglais!). De plus, si nexen ne fait que recopier php.net mais enf rnçaius je ne vois pas où est le problème GRenard, sauf si tu as des actions chez eux... lol

signaler à un administrateur
Commentaire de GRenard le 12/08/2004 07:21:18

PHP.net reste à jour avec l'envoie de bugs dans les databases...
Je post parfois des erreurs de traduction.

Lorsque vous voyez dans mes messages le smiley :P, il faut prendre ce message avec un brin d'humour :) Je ne veux pas me penser prétentieux, j'ai seulement fait une blague... j'aurais du mettre pleins de smiley pour que ca soit plus compréhensible :P

Par contre, si vous voyez un :@ (qui n'est pas suivi d'un :P), alors la, c'est que je suis vraiment faché (ca m'arrive rarement !)

signaler à un administrateur
Commentaire de psyjc le 13/08/2004 15:11:53

et les variables declaré en static ? :D


( voila comme ca je recevrai pleins de mails :D )

signaler à un administrateur
Commentaire de GBHova le 13/08/2004 15:36:09

Ceci est un  tres bon debut...
Dans la section MYSQL, j'aurai personnellement ajouté quelques informations supplementaires :

1 - Fermer proprement ses connexions MYSQL
mysql_close($db);
  
2 - Libérer la mémoire qu'on a utilisé dans nos requêtes d'extraction MYSQL
$ResultatRequete = mysql_query($sql);
//le traitement
...
//libération de la mémoire
mysql_free_result($ResultatRequete);
mysql_close($db);


3 - Créer des requêtes très précises
Lors de requête SQL, il est préférable d'utiliser le nom des champs exactes plutôt que d'utiliser la clé *. (SELECT * FROM...)
Pourquoi ? Parce que dans votre script, vous n'utiliserez certainement pas TOUS les champs que vous allez obtenir. De plus, si l'ordre des champs changent il pourrait y avoir des problèmes avec votre code. (voir plus bas). MÊME si votre SQL fais 10 mètres de long parce que vous placez des champs, je pense qu'il est préférable de faire ainsi !

Exemple :
MAUVAIS :
$sql = "SELECT * FROM table WHERE id = 1";
$resultat = mysql_query($sql);

BON :
$sql = "SELECT nom, telephone, fax, email FROM table WHERE id = 1";
$resultat = mysql_query($sql);



4 - mysql_fetch_array, ajoutez le paramètre MYSQL_ASSOC !
MYSQL_ASSOC = associatif
MYSQL_NUM = numérique
MYSQL_BOTH = associatif ET numérique (par défaut, si on ne précise rien)

Exemple :
while ($ligne = mysql_fetch_array($resultat, MYSQL_ASSOC))


PS : Il est mieux d'utiliser la constantes MYSQL_ASSOC plutôt que MYSQL_NUM (ou MYSQLI_...). Pourquoi ? parce que de cette manière, vous allez obtenir $var['champ'] plutôt qu'un d'un numéro qui pourrait changer : $var[5].



signaler à un administrateur
Commentaire de GRenard le 13/08/2004 16:34:16

Pour ce que tu as écri GBHova, c'est des exemples parce que je parle déjà assez de ca dans le tutorial.
Si les personnes ne comprenent pas, elles n'auront qu'à regarder ton post qui est de grandeur disproportionnées comparées aux autres :P
Pour ce qui est du free_result, la je ne pense pas que c'est une question de bien programmer. Il est écrit sur php.net que de l'utiliser si on croit que ca va utiliser trop de mémoire. Alors c'est inutile de l'appeler juste avant de fermer (sql_close);
Par contre, ce qui est de fermer proprement ses connexions, tu as raisons...
Comme pour toutes les fonctions ou les choses cr