FONCTION D'AFFICHAGE DE DONNÉES MYSQL

cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009 - 3 avril 2008 à 23:35
Eregon Messages postés 17 Date d'inscription lundi 3 septembre 2007 Statut Membre Dernière intervention 26 octobre 2009 - 7 avril 2008 à 17:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/46275-fonction-d-affichage-de-donnees-mysql

Eregon Messages postés 17 Date d'inscription lundi 3 septembre 2007 Statut Membre Dernière intervention 26 octobre 2009
7 avril 2008 à 17:49
Pour ceux qui sont trop fainéants pour tester ça , ça donne:
0111

Donc, la variable $a n'est incrémentée qu'après son affichage.

En simple(juste pour retenir), lisez de gauche à droite^^.
echo $a++; = echo $a; $a++;
tandis que
echo ++$b; = $b++; echo $b;
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 avril 2008 à 22:10
@yoman => attention...quand j'ai parlé d'incidence, c'était contextuel. Dans ce cas là (celui d'une boucle for), ça n'a pas d'incidence. Et à vrai dire dans mon message, je ne parlais que d'incidence sur l'écriture du code (pas plus long, pas plus court), pas même sur ce que ces différntes notations font.
Parce que une incidence, il peut y en avoir une!! Et pas une petite...exactement comme en C si mes souvenirs sont bons, d'ailleurs, et très exactement comme en assembleur (parce que oui, j'en ai fait, j'ai même commencé par ça...enfin non, j'ai commencé par le basic de mon C64...puis j'ai enchaîne sur l'assembleur). Un exemple valant 1000 discours :
<?php
$a = 0;
$b = 0;
echo $a++;
echo ++$b;
echo $a;
echo $b;
?>
Le différence est énorme...donc les 2 écritures se justifient : tout dépend du contexte.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 avril 2008 à 22:04
@Depression => les frameworks...voilà encore un sujet qui aurait sa place dans un débat public, quelque part sur le site :-)
Pourquoi pas le bar!
Parce que j'ai mon avis dessus ;-) et j'aimerais beaucoup entendre celui d'autres développeurs.
cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009
4 avril 2008 à 21:57
@malalam:

Oui pour le strpos, pour une fois, j'ai oublié de le rappeler ;-)

Quand à Zend Framework, je le cite car je travaille dessus en ce moment, et son modèle d'abstraction de bases de données est vraiment bien fait (Ca et le reste). Et bien sur, il utilise PDO (faut être logique, vu l'équipe des développeurs).
Bon, il demande d'assimiler pas mal de choses (bien plus que Jelix), mais on y gagne.
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
4 avril 2008 à 21:42
Salut malalam,

Ne t'en fais pas je comprends tout à fait, il est vrai que l'impact est nul, et que on ne devrait certainement pas reprocher à quelqu'un d'utiliser $var++, au contraire puisque justement l'impact est nul. Comme tu as dû t'en douter, j'ai sortie ça parce qu'il demandait une optimisation et je voulais sortir quelques choses de peu connu, tout en restant simple :). Note bien que je ne me prends pas pour un pro (enfin,je travail tout de même dans le domaine..), et je n'ai certainement pas la prétention d'être ne serait-ce qu'à moitier aussi bon que toi ;-) Ceci dit il est vrai qu'il est très courant (sur ce site et ailleurs) que certain reprennent une remarque vu quelque part en la reprochant à tout le monde ensuite, je suppose qu'ils sont fier de ce qu'ils ont appris et veulent montrer qu'ils sont meilleurs... Si ma remarque à une tel incidence, alors je serai le premier à le regretter.

PS: Revenons à l'incrémentation, J'ai découvert cette subtilité du langage dans mon (bref) passé de codeur c++, alors corrige moi si je me trompe (ceci est une question, par curiosité), mais est-ce que les incrémentations en php sont faites directement par du code en c++ ? Puisqu'en c++ ++i et i++ n'est pas executé de la même façon d'un point de vu assembleur (Je n'entrerai pas dans les détails que tu dois sans doute déja connaitre :-)), alors je suppose que php c'est pareil puisqu'il repose sur ça ?. Et d'après toi, pourquoi php comporte t'il les deux méthodes et les executes de manière différentes, si de toute façon ça n'a pas d'incidence direct sur le code ? (Enfin, après cette question fauderait pas partir un grand débat, parce qu'on s'éloigne un peu du sujet haha)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 avril 2008 à 20:47
@yoman => je n'avais pas vu Zend Framework, je m'étais arrêté à PDO ;-) Egalité! Donc je suis d'accord avec toi sur le framework.
Bref, je suis d'accord sur le zend Framework (excellent, hein...là n'est pas la question...on n'utilise pas un framework pour 3 fonctions génériques).
Une optimisation reste une optimisation : oui. C'est vrai. Si ça ne fait pas forcément du bien...ça ne peut pas faire du mal (en tous cas, pas dans ce cas: l'impact sur le code est nul). MAIS...je devais le préciser,parce que je ne voudrais pas que les futurs débutants se voient fustigés parce qu'il ont utilisé la post-incrémentation au lieu de la pré-incrémentation...si je sais que ce n'est pas ton but et que tu ne feras jamais de ce genre de remarques ton cheval de bataille, je me méfie de certains huluberlus se prenant pour des pros, et qui pourraient prendre ta remarque pour argent comptant, l'utilisant à chaque code pour descendre son auteur.
J'avais prévenu : je serai désormais plus intransigeant...donc, ne vois là aucun reproche : tu as raison :-) Et tu pourras le re-préciser au prochain code ! Je veux juste être sûr que ce ne soit pas utilisé à mauvais escient par d'autres plus tard.
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
4 avril 2008 à 20:24
@malalam : Sur un applicatif web non en effet aucune différence , il faut une boucle de plusieurs dizaines de millions d'itérations pour voir une différences de quelques dixièmes de seconde :P.

Mais une optimisation ça reste une optimisation non? :-)

PS: Pour PDO je suis d'accord avec toi, mais pour Zend Framework je maintiens mon point de vu (pour mon commentaire j'avou que je n'avais pas vu PDO, je m'étais arreté à Zend :))
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 avril 2008 à 19:59
Hello,

@yoman => pour ta dernière remarque, tu es allé chercher en effet très, très loin...la différence est tellement infime qu'aucun applicatif web n'en profiterait vraiment. Fais le test, tu verras :-)

Concernant la source :
- une fonction qui utilise directement les GET a un problème : elle ne peut s'utiliser quand dans un contexte bien précis. A ta place, je passerais les GET en paramètre.

- ça :
# if ($tri === $nvtri)
# {
# if($sens==='ASC')
# $sens = 'DESC';
# else
# $sens = 'ASC';
# }
# else
# {
# $sens = 'DESC';
# }
peut se condenser ainsi :if ($tri $nvtri && $sens 'ASC') {
$sens = 'DESC';
} else {
$sens = 'ASC';
}
- ça :
# $req.=" WHERE ";
# for($cpt=0;$cpt<$L;++$cpt)
# {
# if($cpt>0)
# $req.=" AND ";
# $temp = explode('%',$Links[$cpt]);
# $req.="`".$Tables[$temp[0]-1]."`.`".$temp[2]."`=`".$Tables[$temp[1]-1]."`.`".$temp[2]."`";
# }
peut se résumer largement avec un implode(). Ca évite une boucle. Je ne suis pas sûr que ce soit plus rapide néanmoins.
- on t'a dit d'utilier preg_* plutôt qu'ereg_*, certes. Néanmoins, on ne t'a pas dit d'utiliser strpos()quand tu n'avais pas besoin d'expression régulière. Ce qui est le cas.
- mysql_fetch_array() renvoie un tableau doublement indexé. Si tu n'utilises que les index numériques, autant passer la constante MYSQL_NUM à cette fonction.

Dernière chose (je n'ai pas exploré le code à fond) : je ne suis pas d'accord avec Yoman sur le "framework". Utiliser PDO par exemple permettrait sans aucune modification d'utiliser ton code pour n'importe quelle bdd, ce qui n'est pas le cas actuellement (c'est mysql ou rien). D'autant plus que la connexion à la base se fait en dehors de ton code (seul moment ou le type de bdd utilisée est important avec PDO).
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
4 avril 2008 à 12:54
Hum avec des simples quotes on peut tout faire ce que les doubles font, mais en plus rapide (hormis les chars spéciaux)
echo 'Salut '.$nom.' et bienvenue'; est plus rapide que "Salut $nom et bienvenue" de toute façon.

Le problème est que tu utilises les doubles quotes à tout va, par exemple dans tes explodes "," c'est inutile, ',' serait beaucoup plus beau. Quand tu veux inclure des variables, ou des \n, alors vas y , mais sinon c'est inutile...

Ensuite tes données proviennent bien d'un formulaire, $_GET[tri].... $_GET les données viennent de où tu crois ? Donc les échapper est essentiel...

Les opérateur de comparaisons qui prennent le type de variables n'ont RIEN a voir avec la sécurité , au contraire puisque les données venant d'un formulaire sont toujours de type string de toute façon.

En fait c'est simplement une bonne habitude à prendre, parce que sinon php va faire des conversions d'un type à l'autre inutiles. Le problème est le manque de typage et de rigueur de php à la base qui pousse à coder comme un cochon, mais il est toujours bien d'utiliser les bons types de variables pour ce qu'on veut faire.

Plus d'infos: http://fr3.php.net/operators.comparison

Un exemple de non respect des standards:

print"<th>[.crealink($Fields[$cpt]). $Names[$cpt]]</th>";

l'url devrait être entouré de doubles quotes,

print"<th>['.crealink($Fields[$cpt]).' '.$Names[$cpt].']</th>';

Une petite optimisation pour la route (celle la j'lai cherché loin :P) :

for($cpt=0;$cpt<$F;$cpt++)

++$cpt est plus rapide que $cpt++

donc
for($cpt=0;$cpt<$F;++$cpt)

Bref tu ferais mieu de rendre ta source fonctionnelle directement, sinon j'ai bien peur qu'un admin la supprime éventuellement...

Bonne chance :)
Snakegun Messages postés 2 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 4 avril 2008
4 avril 2008 à 12:34
En fait, sans vouloir abuser de votre temps et de votre générosité, j'aurais besoin de quelques éclaircissements avant de poster une nouvelle version...

Pourquoi utiliser les opérateurs de comparaison qui prennent en compte le type des variables? Je comprendrais si les données provenaient d'un formulaire mais là je vois pas bien... Idem pour mysql_real_escape_string.

Et pourquoi préférer les simples quotes, sachant que je suis de toute façon obligé d'utiliser des doubles lorsque je concatène du code HTML nécessitant des quotes avec des variables?

Et puis évidemment, nonobstant le fait que ca ne soit plus Noël, je ne déconsidérerais pas un petit exemple de simplification possible et un petit exemple de non respect des standards.

Enfin, je rougis, puis blanchis et re-rougis encore en comprenant que ce n'était pas ici qu'il me fallait poster cette source mais dans le forum... J'implore votre clémence!
Snakegun Messages postés 2 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 4 avril 2008
4 avril 2008 à 12:01
Pourquoi méchant? C'est pas de la méchanceté c'est des bonnes critiques, objectives et qui me sont directement utiles. Si j'avais la certitude de coder parfaitement je ne perdrais pas de temps sur un site communautaire ! :)

Je vais m'atteler à améliorer cela, merci pour vos conseils.

Après quand à l'utilité de la fonction elle est discutable, effectivement, mais j'en avais besoin pour un cas précis et j'apprécie d'avoir un retour...
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
4 avril 2008 à 06:30
Ah ouais et fait gaffe au injections SQL, informe toi sur mysql_real_escape_string.
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
4 avril 2008 à 06:29
Et moi j'vais prendre le role du boulet qui complête le grand méchant xD.

Pas besoin de se tapper un framework pour faire ça, c'est trop simple pour s'encombrer d'un framework.
Mais je suis d'accord avec tout le reste.

J'ajouterais que: $_GET[tri] ... berk tu sais que il doit y avoir des quotes la dedans ? si ça fonctionne c'est que quand php trouve aucune correspondance pour une constante ben il lui donne la valeur de son nom.
C'est pour ça que echo blablabla va afficher blablabla mais faut pas faire pour autant $_GET[tri], plutot $_GET['tri']

Ensuite préfère les opérateur de comparaison de type genre === !== plutot que == et != .

Tu ne vérifie même pas que la requête abouti bien, si c'est pas le cas ton code va planter sans avertir,ce qui est mal. Tu ne respecte pas du tout les standards (x)html , ce qui est mal aussi.

Ton code peut être beaucoup, mais vraiment BEAUCOUP raccourcit et optimisé.

Bonne chance :)
cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009
3 avril 2008 à 23:35
Allez, je vais devoir endosser le rôle du grand méchant.

L'intention est louable, peut être qu'elle est pratique pour toi, mais cela fait une nouvelle "syntaxe" spécifique à apprendre.

En plus, je ne vois pas trop l'intérêt. Ca paraît trop fastidieux pour ce que tu fais. Tu devrais plutôt regarder du côté de PDO, ou t'essayer au Zend Framework.

Ensuite, je vais te repprocher ce que l'on repproche souvent ici (ou sur d'autres sites) :
On n'écrit plus <? mais <?php
Mets des simples quotes à la place des doubles
Faire de l'affichage dans une fonction, je ne suis pas pour du tout.
Les expressions régulières en ereg() sont obsolètes, renseigne toi plutôt autour de preg_match()

Enfin voila quoi.

J'espère ne pas t'avoir vèxé (ben si c'est le cas tant pis), mais bon, je pense que tu devrais repenser tout ça, et surtout simplifier, ou regarder d'autres solutions (Comme Zend Framework que j'ai déja cité).
Rejoignez-nous