Optimisation: or et and

Mammouth du PHP | 985 Messages

24 mars 2010, 17:47

Effectivement, l'exemple avec le while n'est pas bon.
Car mysql_fetch_assoc() ne te renvoie pas 50 tableaux mais un seul quelque soit le nombre de résultats.
Donc tester à chaque incrémentation si c'est un tableau est un non sens...
Par contre, c'est valide si on utilise pas de boucle.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 17:53

Effectivement, l'exemple avec le while n'est pas bon.
Car mysql_fetch_assoc() ne te renvoie pas 50 tableaux mais un seul quelque soit le nombre de résultats.
Donc tester à chaque incrémentation si c'est un tableau est un non sens...
Par contre, c'est valide si on utilise pas de boucle.
ouai tout a fait :wink:
mais tu me diras y'a qu'a partir de php 5.3 que mysqli intègre le fetchAll (PDO le faisais deja par contre)

ViPHP
AB
ViPHP | 5818 Messages

24 mars 2010, 18:20

En le disant un peu autrement, c'était pas le bon exemple puisque quand il n'y a plus de lignes, mysql_fetch_assoc() retourne false qui est bien le boolean que tu voulais.

Donc quand tu dis "Car, qui nous dit que php ne le gère pas très bien et sans soucis ?" la réponse est qu'il le gère d'autant mieux que comme dirait l'autre "c'est étudier pour" :)

D'ailleurs c'est le même principe que pour lister un tableau avec foreach($tab as $key => $value) : la boucle va s'arrêter en fin de tableau et le pointeur de résultat va passer à la ligne suivante pour chaque itération dans la boucle tant qu'il reste des lignes à lire.

Les lignes obtenues par mysql_fetch_assoc() sont sous la forme $tab[] = array("nom_champ1" =>"resultat_champ1", "nom_champ2'"=>"resultat_champ2", etc.)

Enfin la comparaison s'arrête là car comme l'a précisé stealth35 une ressource n'a pas les mêmes propriétés qu'un tableau.

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 18:27

et a l'inverse on pourrais aussi parcourir un tableau avec while en jouant avec les pointeurs
$arr = array(1, 2, 3, 4, 5);
	
while($data = each($arr))
{
    var_dump($data['value']);
}

/*
int(1)
int(2)
int(3)
int(4)
int(5)
*/

ViPHP
AB
ViPHP | 5818 Messages

24 mars 2010, 18:33

Mais par contre on ne pourrait pas lire une ressource avec foreach :lol:

Mammouth du PHP | 985 Messages

24 mars 2010, 18:44

En fait je voulais juste souligner l'importance parfois de vérifier le type.
Ce qui plus j'avance dans le php, plus cela devient pour moi quasiment indispensable.

Donc en partant de ce principe, la meilleur façon de traiter les résultats d'un tableau, à mon avis, est dans l'idéal de vérifier si cela est bien un tableau et non se fier à un simple false.

Même si je sais: si false -> eh bien dans toute logique c'est un tableau -> oui je sais.
Je voulais juste signaler que l'approche était différente.

Et ceci peut être appliqué d'une manière générale.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 18:46

Mais par contre on ne pourrait pas lire une ressource avec foreach :lol:
si mysql_fetch_assoc te retourne un tableau ton tu peu utiliser foreach dessus
$link 	= mysql_connect('127.0.0.1', 'root');	
$query	= mysql_query('SELECT * FROM information_schema.COLUMNS') or exit(mysql_error());
	
foreach(mysql_fetch_assoc($query) as $key => $val)
{
    var_dump($key);
}

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 18:54

En fait je voulais juste souligner l'importance parfois de vérifier le type.
Ce qui plus j'avance dans le php, plus cela devient pour moi quasiment indispensable.

Donc en partant de ce principe, la meilleur façon de traiter les résultats d'un tableau, à mon avis, est dans l'idéal de vérifier si cela est bien un tableau et non se fier à un simple false.

Même si je sais: si false -> eh bien dans toute logique c'est un tableau -> oui je sais.
Je voulais juste signaler que l'approche était différente.

Et ceci peut être appliqué d'une manière générale.
t'as raison le type fort c'est bien, mais t'as que avec les fonctions que tu peux verifier le type a l'entrer , par contre ca marche qye avec "array", "object" et "Class"

Mammouth du PHP | 985 Messages

24 mars 2010, 19:02

Exemple:

Pour des requêtes du type: INSERT, UPDATE, DELETE, DROP
$query = mysql_query($sql) or die(); // true ou false
Pour des requêtes du type: SELECT, SHOW, DESCRIBE, EXPLAIN...
if (is_resource($query = mysql_query($sql)) { //ressource ou false
    //...
} else {
   die();
}
Dans l'absolu cela ne change pas grand chose, mais c'est peut-être plus logique et/ou compréhensible...

PS:
pour Steal, oh non il est important souvent de vérifier le type tes données aussi, string, int... ou de faire du transtypage.
Exemple:
$id = (isset($_GET['ID'])) ? (int) $_GET['ID'] : null
[/i]
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 19:18

j'ai pas dis le contraire, mais PHP vérifie nativement uniquement avec les fonctions :wink:
avec les erreur du type :
function test(array $arr)
{
    print_r($arr);
}
	
test(array());
test('kikoo');
//Catchable fatal error: Argument 1 passed to test() must be an instance of object, array given
ducoup je viens de regarder sous php 5.3 ca accepte d'autre type que array et object (cool :mrgreen: )

Mammouth du PHP | 985 Messages

24 mars 2010, 19:55

Bref je me complique la vie pour rien là :mrgreen:

Le principal a retenir c'est que c'est mieux d'utiliser OR et AND.
Puis cela évite de les confondre avec d'autres opérateurs...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 20:04

Bref je me complique la vie pour rien là :mrgreen:

Le principal a retenir c'est que c'est mieux d'utiliser OR et AND.
Puis cela évite de les confondre avec d'autres opérateurs...
:wink:
c'est pas que c'est mieux ca depend des cas, quand c'est entre parenthèse c'est pareil, par contre quand y'en a pas c'est diffèrent (je remet le truc)

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

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

ViPHP
AB
ViPHP | 5818 Messages

24 mars 2010, 20:41

Bref je me complique la vie pour rien là :mrgreen:

Le principal a retenir c'est que c'est mieux d'utiliser OR et AND.
Puis cela évite de les confondre avec d'autres opérateurs...
Oui avec is_ressource devant un résultat qui ne peut retourner qu'une ressource sinon false, c'est comme quand tu veux tester si if($result = mysql_fetch_assoc($query)) retourne un tableau de résultat sinon false...
Et comment vas-tu faire ensuite pour tester si is_array retourne effectivement true si c'est un tableau sinon false ?

A part ça le typage c'est utile... quand c'est utile mais ce ne doit pas être une religion non plus.
Sinon cela peut devenir très contraignant, voire très pénible et sans réel avantage excepté pour ceux qui ne connaissent pas bien le langage et se rassurent de cette façon. Souvent les plus ahuris sont ceux qui viennent d'un autre langage fortement typé et qui poussent des cris de fillettes effarouchées devant si peu de rigueur. Mais au final c'est très robuste déjà rien qu'avec les précautions élémentaires.

Pour le "c'est mieux d'utiliser OR et AND.", encore un fois ça dépend du contexte et précisément oui dans ton exemple initial, comme le réexplique stealth35


Mais par contre on ne pourrait pas lire une ressource avec foreach :lol:
si mysql_fetch_assoc te retourne un tableau ton tu peu utiliser foreach dessus
$link 	= mysql_connect('127.0.0.1', 'root');	
$query	= mysql_query('SELECT * FROM information_schema.COLUMNS') or exit(mysql_error());
	
foreach(mysql_fetch_assoc($query) as $key => $val)
{
    var_dump($key);
}
Oui mais pour une seule ligne de ressource et ce n'est pas représentatif.

Mammouth du PHP | 985 Messages

24 mars 2010, 20:53

Pour le is_array(), j'ai dis que la boucle n'était pas le bon exemple plus haut AB.
Sinon ce n'est pas compliqué, exemple:
	$query = mysql_fetch_assoc($query);
	if (is_array($query)) {
            echo $query['toto'];
        }
c'est tout de même plus propre bon :wink:
Ce sont juste des exemples sinon, il ne faut pas tout prendre à la lettre et comprendre le fond.
<?php
$val = 'tt';
$link = $val or die('stop');
var_dump($link); // retourne string(2) "tt"

$link = $val || die('stop');
var_dump($link); // bool(true)

$link = ($val or die('stop'));
var_dump($link); // bool(true)

$link = ($val || die('stop'));
var_dump($link); // bool(true)
?>
Ce n'est pas si simple qu'un problème de parenthèses, car parenthèses ou pas || est incapable de retourner 'tt'.
Donc au lieu d'utiliser un des deux suivant la situation, autant utiliser OR et AND toujours.
Pas plus compliqué :wink:
Modifié en dernier par Dr@ke le 24 mars 2010, 20:58, modifié 3 fois.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

24 mars 2010, 20:56

Oui mais pour une seule ligne de ressource et ce n'est pas représentatif.
exact et une ressource c'est pas forcement un tableau :wink: