Page 1 sur 7

Optimisation: or et and

Posté : 24 mars 2010, 08:45
par Dr@ke
Il est préférable d'utiliser OR et AND.

L'exemple le plus parlant est celui ci:
$link = mysql_connect("localhost", "mysql_user", "mysql_password") or die();
Tant que mysql_connect() ne renvoie pas false, la condition suivante ne sera pas vérifiée ou exécutée.
A l'inverse, || vérifiera ou exécutera (en aveugle) la condition suivante même si la première retourne true.

Le principe est le même avec AND, le code est donc optimisé :wink:

Re: Optimisation: or et and

Posté : 24 mars 2010, 10:57
par jojolapine
Attention!!!
Premièrement, j'aimerais bien une source :/
Car je lit ici: http://php.net/manual/fr/language.operators.logical.php dans les exemples:
// --------------------
// foo() ne sera jamais appeler car ces opérateurs s'annulent

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());
Ce qui semble confirmer mon idée que or ou || agit de la même façon quand à éxécuter ou non la condition qui suit une condition vraie.

Ensuite, les deux types d'opérateurs n'ont pas la même présédance: http://www.php.net/manual/fr/language.o ... edence.php
Donc attention tout de même à OR et AND, qui sont en queue de liste, après les opérateurs d'affectation.

;)

Re: Optimisation: or et and

Posté : 24 mars 2010, 11:33
par stealth35
ouai ca agis pas pareil (donc pas pour la même utilisation)

pour continuer dans le même exemple
// --------------------
// "||" a un précédence supérieure à "or"

// Le résultat de l'expression (false || true) est assigné à $e
// Agit comme : ($e = (false || true))
$e = false || true;

// La constante false est assignée à $f, puis, true est ignoré
// Agit comme : (($e = false) or true)
$f = false or true;

var_dump($e, $f);

// --------------------
// "&&" a un précédence supérieure à "and"

// Le résultat de l'expression (true && false) est assigné à $g
// Agit comme : ($g = (true && false))
$g = true && false;

// La constante true est assignée à $h, puis, false est ignoré
// Agit comme : (($h = true) and false)
$h = true and false;

var_dump($g, $h);
[hs]
et finalement le gros problème dans ce code la :
$link = mysql_connect("localhost", "mysql_user",  "mysql_password") or die();
c'est que c'est hyper vieux, je faisais ca au début, je trouve ca plus qu'aberrant, que des débutant l'utilise, que des sites le recommande et encore pire de voir des formateurs ne juré que par ca (et je parle même pas du "die")

l'extension mysql, n'a plus de développement, c'est uniquement sécurité, c'est lent, c'est compliquer pour s'en servir (pas gestion d'erreur, faut sécuriser manuellement les données et le while = mysql_fetch_assoc() y pas grand monde qui comprend comment ca marche vraiment)
je vois personne n'utilise mysqli alors que c'est beaucoup plus simple et recommandé de l'utiliser

http://fr.php.net/manual/fr/mysqli.over ... ew.mysqlnd
[/hs]

Re: Optimisation: or et and

Posté : 24 mars 2010, 12:19
par AB
et finalement le gros problème dans ce code la :
$link = mysql_connect("localhost", "mysql_user",  "mysql_password") or die();
c'est que c'est hyper vieux, je faisais ca au début, je trouve ca plus qu'aberrant, que des débutant l'utilise, que des sites le recommande et encore pire de voir des formateurs ne juré que par ca (et je parle même pas du "die")
Que ce soit hyper vieux est un plus dans cet exemple puisque c'est pour illustrer un cas d'école... et un cas d'école se doit d'être compréhensible par le plus grand nombre, c'est du niveau de la symbolique et pas destiné à montrer la dernière technologie recommandée :wink:
while = mysql_fetch_assoc() y pas grand monde qui comprend comment ca marche vraiment)
Là je comprend pas pourquoi tu dis ça... Si peu de monde avait compris comment ça marche peu de monde aurait utilisé des bdd avant pdo. Donc vraiment j'ai du mal à comprendre cette phrase #-o

Re: Optimisation: or et and

Posté : 24 mars 2010, 12:46
par stealth35
Que ce soit hyper vieux est un plus dans cet exemple puisque c'est pour illustrer un cas d'école... et un cas d'école se doit d'être compréhensible par le plus grand nombre, c'est du niveau de la symbolique et pas destiné à montrer la dernière technologie recommandée :wink:
oui mais l'éducation ca évolue, Pluton c'est plus une planète c'est qu'on dis a l'école, y'a aucune intérêt à montrer uniquement que des vielles choses (on peux dire : avant on faisais comme ca, maintenant c'est comme ca, malheureusement c'est pas ce qui se fait), après on se retrouve avec des gens avec un code qui ne marche plus et le "on ma appris y'a 10 ans que c'était comme ca donc je fais comme ca", on fait partis des gens qui aide je trouve que c'est de notre devoir de les accompagner dans ce qui se fais maintenant, et ce qui est dommage c'est que ca soit des gens tout fraichement sortis d'école.
Là je comprend pas pourquoi tu dis ça... Si peu de monde avait compris comment ça marche peu de monde aurait utilisé des bdd avant pdo. Donc vraiment j'ai du mal à comprendre cette phrase #-o
parce que demande a n'importe quelle débutant comment marche un "while" comme celui ci, il va pas comprendre, on peux recopié et faire du par coeur sans connaitre le fond des choses, j'ai même eu un formateur qui disait "while($data = mysql_fetch_assoc()), c'est pour parcourir le tableau sans savoir la longueur", ca ma bien faire rire mais j'ai eu de la pitié pour ceux qui était en formation.

Re: Optimisation: or et and

Posté : 24 mars 2010, 13:53
par AB
Oui mais précisément on parle du "or" comparé au "||" et cette requête vue et revue (c'est bien la fréquence qui crée la symbolique) n'est qu'un prétexte, un support, et non un modèle absolu.

En utilisant une expression moins courante on aurait pu s'interroger d'abord sur la compréhension de l'ensemble avant de finir par comprendre l'essentiel du message (la comparaison entre "or" et "||"). Ce qui est pénalisant surtout quand on s'adresse à un public débutant qui pourrait passer son chemin entre temps, ou finalement ne rien comprendre.

Je comprend aussi que tu dise "ce n'est pas le meilleur exemple de requête à montrer aux débutants". Mais encore une fois tel n'est pas le sujet. Ce serait plus dérangeant si cette requête ne fonctionnait plus, or avant qu'elle ne fonctionne plus, les débutants d'aujourd'hui auront eu largement le temps d'optimiser leur code :wink:

Et pour le "on peut recopier et faire du par coeur sans connaitre le fond des choses", c'est tout à fait vrai, mais pour tout, et je ne vois pas en quoi ce serait spécifique à l'utilisation du while pour lister la ressource d'une requête :-k

Sinon j'espère que tu as compris que ce n'est pas pour te contredire sur le fait de montrer ce qui se fait de mieux actuellement.
C'est simplement que je pense que ce ne doit pas être un impératif systématique surtout dans certaines circonstances comme celles-ci où cela pourrait avoir un effet contreproductif... pour la compréhension de "l'essentiel". Et je mets "essentiel" entre guillemets car j'ai bien compris qu'on avait du mal à avoir une définition commune dans ce cas précis :)

Re: Optimisation: or et and

Posté : 24 mars 2010, 14:29
par stealth35
Oui mais précisément on parle du "or" comparé au "||" et cette requête vue et revue (c'est bien la fréquence qui crée la symbolique) n'est qu'un prétexte, un support, et non un modèle absolu.

c'est pour ca que j'avais mis [hs] :wink:

Re: Optimisation: or et and

Posté : 24 mars 2010, 16:17
par Dr@ke
En effet, AB a tout dit,et je confirme cet exemple est juste là pour la démonstration.

Sinon dans l'absolu, je ne suis pas fan non plus de son utilisation, car oui il n'est pas évident au départ de comprendre son fonctionnement. Et aussi car il n'est pas forcément propre ou logique de comparer des fonctions qui ne retournent pas que des booleans... Dans ce contexte, la fonction is_array() est surement plus appropriée.
Maintenant ceci reste dans l'absolu et ne reste qu'une interprétation.
Car, qui nous dit que php ne le gère pas très bien et sans soucis?
Bref ceci est un autre sujet :wink:

Re: Optimisation: or et and

Posté : 24 mars 2010, 16:20
par stealth35
pourquoi is_array() tu veux le mettre ou ?

Re: Optimisation: or et and

Posté : 24 mars 2010, 16:23
par Dr@ke
Oui désolé je mélange un peu tout dans mon post:
Je parlais de ceci, par exemple:
while = mysql_fetch_assoc() 

Re: Optimisation: or et and

Posté : 24 mars 2010, 17:02
par stealth35
pas besoin de is_array() non plus :wink:

Re: Optimisation: or et and

Posté : 24 mars 2010, 17:13
par Dr@ke
Non dans l'absolu en effet mais que préfères tu?

Si la fonction ne retourne pas false -> extraire les éléments d'un hypothétique tableau.
Ou
Si la fonction retourne un tableau -> extraire les éléments de ce même tableau.

Encore une fois on sort de sujet, mais bon c'est intéressant aussi :)

Re: Optimisation: or et and

Posté : 24 mars 2010, 17:21
par stealth35
Non dans l'absolu en effet mais que préfères tu?

Si la fonction ne retourne pas false -> extraire les éléments d'un hypothétique tableau.
Ou
Si la fonction retourne un tableau -> extraire les éléments de ce même tableau.

Encore une fois on sort de sujet, mais bon c'est intéressant aussi :)
a chaque appelle ca incrémente le statement, donc tu ne pourrais pas tester avant, mysql_fetch_assoc te retournes forcement soit false soit un un tableau

Re: Optimisation: or et and

Posté : 24 mars 2010, 17:26
par Dr@ke
Ok je me suis planté d'exemple alors, le while n'était pas l'idéal :wink:

Re: Optimisation: or et and

Posté : 24 mars 2010, 17:36
par stealth35
Ok je me suis planté d'exemple alors, le while n'était pas l'idéal :wink:
si mais c'est parce que on a pas trop le choix

sinon faudrait faire

$data1 = mysql_fetch_assoc();
$data2 = mysql_fetch_assoc();
$data3 = mysql_fetch_assoc();
$data4 = mysql_fetch_assoc();
$data5 = mysql_fetch_assoc();
$data6 = mysql_fetch_assoc();
....

on s'en sort pu après, mais malheureusement on est obligé de faire le traitement dans la boucle du coup, contrairement un tableau que tu peu stocker et utilisé après avec tout les avantage des tableaux (tri, filtre....), on peu faire
$datas = array();
while($data = mysql_fetch_assoc())
{
    $datas[] = $data;
}
mais faudrais parcourir une seconde fois ce tableau pour la suite