Optimisation: or et and

ViPHP
ViPHP | 5462 Messages

25 mars 2010, 11:11

du coup ca serais bien qu'on se lance un topic type "divers php" parce que c'est ni "hors sujet" ni "Autres sujets informatiques" quitte a lance un topic en head dans "Méthodologie, modélisation, sécurité", y'a des débat intéressant sur PHP au niveau des pratique, c'est un peu comme le GPS : un trajet plus court n'est pas forcement le trajet le plus économique, et inversement :wink:
je propose "hors sujets php" ou "topics qui servent à rien mais qu'on aime bien y faire un tour quand même"
j'aime bien le 2ème :mrgreen:

Mammouth du PHP | 985 Messages

25 mars 2010, 11:42

Je comprends que cela ne serve a rien pour vous, mais moi cela me permet de comprendre et apprendre certains éléments.
Maintenant si cela vous amuse, tant mieux, cela sert donc au moins à cela :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

25 mars 2010, 11:58

c'était pas du tout ironique, au contraire ca me plais de parler de PHP et partager des trucs :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

25 mars 2010, 12:09

Il n'y a tout de même pas besoin de faire une thèse dessus pour comprendre que si une fonction renvoie un tableau ou false, et bien la fonction adaptée pour la tester est is_array(), c'est logique et on en gère bien assez de tableaux pour le savoir.
Je n'interviens pas très souvent en ce moment, mais là, je ne suis pas du tout d'accord.
Quand tu as un retour qui est soit un tableau (entier, chaîne, etc.) soit false, ma façon de faire est de tester s'il y a une erreur, auquel cas on arrête le programme, on sort, on fait quelque chose. Si tout va bien on continue fluidement.
La plupart des fonctions PHP renvoient un résultat (int, string, array, object) ou false ; il est donc plus simple de mémoriser un test avec le cas d'erreur.
Du coup, je propose :

$bundle = mysql_query($sql);
while($row = mysql_fetch_array($bundle) !== FALSE)
{
//le while s'arrête dès que la condition passe à FALSE
}

et sinon :
if(false === mysql_fetch_array($bundle)
{
// on arrête tout, erreur
}
else
{
//ah ben je vais fetcher tous les résultats, j'utiliserais bien une boucle :-)
}
Petites remarques moins importantes :
  • Par ailleurs, j'ai vu $query contenir une requête SQL puis des résultats. Economie de variable mais débug moins aisé.
  • Enfin, l'extension MySQL il faut arrêter, hein. C'est MySQLi (et je ne vous parle même pas de PDO) qu'il faut utiliser pour bénéficier des améliorations de MySQL 4.1 et suivants : requêtes préparées, transactions, ...
[/color]
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 3300 Messages

25 mars 2010, 12:29

Il n'y a tout de même pas besoin de faire une thèse dessus pour comprendre que si une fonction renvoie un tableau ou false, et bien la fonction adaptée pour la tester est is_array(), c'est logique et on en gère bien assez de tableaux pour le savoir.
Je n'interviens pas très souvent en ce moment, mais là, je ne suis pas du tout d'accord.
Quand tu as un retour qui est soit un tableau (entier, chaîne, etc.) soit false, ma façon de faire est de tester s'il y a une erreur, auquel cas on arrête le programme, on sort, on fait quelque chose. Si tout va bien on continue fluidement.
La plupart des fonctions PHP renvoient un résultat (int, string, array, object) ou false ; il est donc plus simple de mémoriser un test avec le cas d'erreur.
Du coup, je propose :

$bundle = mysql_query($sql);
while($row = mysql_fetch_array($bundle) !== FALSE)
{
//le while s'arrête dès que la condition passe à FALSE
}

et sinon :
if(false === mysql_fetch_array($bundle)
{
// on arrête tout, erreur
}
else
{
//ah ben je vais fetcher tous les résultats, j'utiliserais bien une boucle :-)
}
Petites remarques moins importantes :
  • Par ailleurs, j'ai vu $query contenir une requête SQL puis des résultats. Economie de variable mais débug moins aisé.
  • Enfin, l'extension MySQL il faut arrêter, hein. C'est MySQLi (et je ne vous parle même pas de PDO) qu'il faut utiliser pour bénéficier des améliorations de MySQL 4.1 et suivants : requêtes préparées, transactions, ...
[/color]
non non non mere T tu fais la même erreur que draque
while($row = mysql_fetch_array($bundle) !== FALSE)
c'est redondant parceque $row = mysql_fetch_array($bundle) est forcément booléen, en pseudo code ce que ca donnerait c'est:

Tant que (true||false) différent de false

alors que c'est exactement qualitativement la même chose que

Tant que (true||false)

while n'évalue que des booléens et en booléen $var = array(); var_dump((bool)$var); ca fait false mysql_fetch_array ne retourne pas false, il retourne un array vide ce qui est tout à fait différent vis à vis du is_array, mais marche dans une évaluation booléenne comme dans un while.

Au passage la doc française est souvent fausse, la vrai documentation c'est la doc anglaise, qui le dit clairement que le mysql_fetch_array ne renvoit QUE des arrays.

Vous avez presque réussi à me faire perdre mon calme, bon en même temps je tente de m'arrêter de fumer alors je suis fragile ces temps ci :)
Fait du php depuis que ca existe ou presque :)

Mammouth du PHP | 985 Messages

25 mars 2010, 12:33

$bundle = mysql_query($sql);
while($row = mysql_fetch_array($bundle) !== FALSE)
{
//le while s'arrête dès que la condition passe à FALSE
}
while effectue un transtypage automatique et temporaire de $row = mysql_fetch_array($bundle) en boolean.
Quand $row retourne une valeur, et ici donc un tableau non vide ce dernier est convertit automatiquement en true.
Donc !== FALSE n'est pas nécessaire car c'est comme si tu faisais:
if (true !== FALSE)
$row = mysql_fetch_array($bundle) est inclut dans la boucle de cette façon car c'est la seule façon de réévaluer la valeur de $row à chaque passage de boucle.
...

Mais je me trompe peut-être sur toute la ligne vue que cela à l'air inutile et drôle ce Topic.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

25 mars 2010, 12:34


Et dans mon exemple, je prétends (même si ça fait 3 ans que je n'ai pas utilisé l'extension MySQL) que quand $row arrive à false, ma boucle s'arrête. Je prétends aussi que le while va détecter tous les résultats, alors qu'un IF ne va s'occuper que du début.

Je voulais surtout dire que :
- le while est suffisant selon moi
- plein de méthodes PHP renvoient FALSE en cas de problème et c'est donc une bonne pratique de tester si le retour est false, plutôt que de se focaliser sur le type de retour (qui varie...selon la méthode)
- MySQLi c'est mieux que MySQL (et il renvoie null quand il a fini de fetcher, donc on change de méthode pour nos tests)


Et je ne prétends pas que mon !== false est nécessaire...mais si vous voulez jouer aux pinailleurs, on peut pinailler.

Je sors ----> [] parce que je suis passée à PDO depuis longtemps et en mode POO.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

25 mars 2010, 12:43

non non non mere T tu fais la même erreur que draque Qui est draque ?
while($row = mysql_fetch_array($bundle) !== FALSE)
c'est redondant parceque $row = mysql_fetch_array($bundle) est forcément booléen, en pseudo code ce que ca donnerait c'est:D'accord

Tant que (true||false) différent de false

alors que c'est exactement qualitativement la même chose que

Tant que (true||false)

while n'évalue que des booléens et en booléen $var = array(); var_dump((bool)$var); ca fait false mysql_fetch_array ne retourne pas false, il retourne un array vide ce qui est tout à fait différent vis à vis du is_array, mais marche dans une évaluation booléenne comme dans un while. Pas d'accord (car je m'appuie sur la doc. Mais je te crois dans la mesure où j'ai dit que mysql_fetch_ragnagna c'est périmé pour moi)


Au passage la doc française est souvent fausse, la vrai documentation c'est la doc anglaise, qui le dit clairement que le mysql_fetch_array ne renvoit QUE des arrays. Pas d'accord. Mais c'est parce que j'ai du respect pour les traducteurs.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 3300 Messages

25 mars 2010, 12:47


Je voulais surtout dire que :
- le while est suffisant selon moi
- plein de méthodes PHP renvoient FALSE en cas de problème et c'est donc une bonne pratique de tester si le retour est false, plutôt que de se focaliser sur le type de retour (qui varie...selon la méthode)
Et je ne prétends pas que mon !== false est nécessaire...mais si vous voulez jouer aux pinailleurs, on peut pinailler.


écrire du code mécaniquement parceque php marche comme ça généralement, c'est pas défendable, je suis d'accord que c'est la bonne façon de faire dans 90% des cas (tester l'erreur plutot que la réussite c'est très sain et infiniment plus logique) seulement un while c'est un if, mais un if qui boucle jusqu'à ce qu'on le break ou que la condition passe à false, on ne devrait jamais écrire while((something) == true) parceque ca n'a aucun sens tout simplement.

Pour ce qui est du pinaillage c'est le sujet du pinaillage en fait, le vrai sujet je veux dire, on discutte de virgulles et de or et de and et de trucs qui au final sont si mineurs relativement par exemple à la mauvaise utilisation des sessions en terme de problème de perf récurant dans les développements php qu'autant y aller franchement et pinailler jusqu'au bout.
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 5462 Messages

25 mars 2010, 12:50

Au passage la doc française est souvent fausse, la vrai documentation c'est la doc anglaise, qui le dit clairement que le mysql_fetch_array ne renvoit QUE des arrays.
c'est faux
while n'évalue que des booléens
c'est faux aussi, while transcripte l'expression en booleen, c'est pas pareil

Mammouth du PHP | 985 Messages

25 mars 2010, 12:52

Ouais me suis fais avoir sur ce coup là.
Car je n'ai jamais parlé de mysql_fetch_array() mais de mysql_fetch_assoc()
.
De plus ce n'est pas dure a tester ça, il suffit, pour ceux qui lisent le topic, de faire un test if (donc un seul résultat) sur un résultat invalide, et donc ensuite faire un var_dump() sur ce que retourne la fonction.

En passant, un tableau vide, si tu regardes la table des comparaisons est égale à false.

Et en passant encore, mais bon cela ne vous n'êtes pas obligé de le croire, il suffit aussi de tester, j'utilise is_array() depuis un moment avec mysql_fetch_assoc(), et je n'ai encore jamais eu de boucle infinie...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 3300 Messages

25 mars 2010, 12:53

non non non mere T tu fais la même erreur que draque Qui est draque ?
while($row = mysql_fetch_array($bundle) !== FALSE)
c'est redondant parceque $row = mysql_fetch_array($bundle) est forcément booléen, en pseudo code ce que ca donnerait c'est:D'accord

Tant que (true||false) différent de false

alors que c'est exactement qualitativement la même chose que

Tant que (true||false)

while n'évalue que des booléens et en booléen $var = array(); var_dump((bool)$var); ca fait false mysql_fetch_array ne retourne pas false, il retourne un array vide ce qui est tout à fait différent vis à vis du is_array, mais marche dans une évaluation booléenne comme dans un while. Pas d'accord (car je m'appuie sur la doc. Mais je te crois dans la mesure où j'ai dit que mysql_fetch_ragnagna c'est périmé pour moi)


Au passage la doc française est souvent fausse, la vrai documentation c'est la doc anglaise, qui le dit clairement que le mysql_fetch_array ne renvoit QUE des arrays. Pas d'accord. Mais c'est parce que j'ai du respect pour les traducteurs.
tu te bases sur la doc fr de mysql_fetch_array qui est tout simplement fausse, pour ce qui est des traducteurs il s'agit pas de leur manquer de respect, je parlait de mehdi achour ici même y'a quelques jours pour dire qu'on le remerciait pas assez, mais qu'il y'ai des erreurs de traductions c'est normal, la doc anglaise est écrite par les dévelopeurs eux-mêmes c'est juste pour ca qu'elle est généralement plus "vrai" (encore que j'en ai vu qui se trompait sur le comportement des fonctions dont ils étaient les auteurs :)
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 5462 Messages

25 mars 2010, 12:54

ouai mais mysql_fetch_(array|row|assoc) retourne des array (le fetch array etant la combinaison de row + assoc)
par contre mysql_fetch_object lui retourne que en object :wink:

ViPHP
ViPHP | 3300 Messages

25 mars 2010, 12:56

Au passage la doc française est souvent fausse, la vrai documentation c'est la doc anglaise, qui le dit clairement que le mysql_fetch_array ne renvoit QUE des arrays.
c'est faux
l
Non c'est vrai, pis c'est celui qui dit qui yai.
while n'évalue que des booléens
c'est faux aussi, while transcripte l'expression en booleen, c'est pas pareil
tiré de son contexte oui, remis dans le contexte ca se comprend que je dis ce que tu dis, c'est moins grave que de prétendre que quelquechose est faux sans etre aller lire la doc anglaise en question :)
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 5462 Messages

25 mars 2010, 12:57

prouve moi que c'est vrai :wink: