2010-08-09 5 views
4

je veux savoir comment nous convertissons le code suivant pour travailler avec foreachUtilisation mysql_fetch_array() avec foreach() au lieu de while()

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; 

    $result_select = mysql_query($query_select) or die(mysql_error()); 

    while($row = mysql_fetch_array($result_select)) { 
     $ename = stripslashes($row['name']); 
     $eemail = stripcslashes($row['email']); 
     $epost = stripslashes($row['post']); 
     $eid = $row['id']; 

     $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70"; 

     echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>'); 

     echo $eid . '<br/>'; 

     echo $ename . '<br/>'; 

     echo $eemail . '<br/>'; 

     echo $epost . '<br/><br/><br/><br/>'; 
+1

Pourquoi? Je ne vois aucune raison de changer votre code. Utiliser un foreach ne fera que le faire plus longtemps et utiliser plus de mémoire. –

+5

Eh bien, n'allez pas apprendre des choses qui vont aggraver votre code. Au lieu de cela, apprenez ceci: n'utilisez pas une boucle foreach avec mysql_fetch_array(). –

Répondre

8

Vous pouvez coder comme ceci:

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; 
$result_select = mysql_query($query_select) or die(mysql_error()); 
$rows = array(); 
while($row = mysql_fetch_array($result_select)) 
    $rows[] = $row; 
foreach($rows as $row){ 
    $ename = stripslashes($row['name']); 
    $eemail = stripcslashes($row['email']); 
    $epost = stripslashes($row['post']); 
    $eid = $row['id']; 

    $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70"; 

    echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>'); 

    echo $eid . '<br/>'; 

    echo $ename . '<br/>'; 

    echo $eemail . '<br/>'; 

    echo $epost . '<br/><br/><br/><br/>'; 
} 

Comme vous pouvez le voir, il est encore besoin d'une boucle while pour obtenir des données de mysql_fetch_array

+0

ne peut pas être fait sans utiliser la boucle while? Je veux dire qu'il n'est pas du tout possible d'extraire les données de la base de données et de les parcourir en utilisant la boucle foreach sans réellement utiliser la boucle while ... –

+3

Vous ne pouvez pas. ** Foreach ** est une boucle qui utilise un tableau existant pour faire une boucle sur chacun de ses éléments. Pour récupérer des données, un ** while loop ** (ou ** for loop **) est requis. http://php.net/manual/fr/control-structures.foreach.php –

+0

Non, les fonctions mysql récupèrent 1 ligne à la fois, pas un tableau de lignes. Si vous passez à PDO (http://nl3.php.net/manual/fr/book.pdo.php), fetchAll() peut être utilisé pour obtenir le resultset en tant que tableau. – Kwebble

5

il n'y a pas une bonne façon de le convertir en foreach, parce que mysql_fetch_array() récupère juste le résultat suivant de $result_select. Si vous vraiment voulu foreach, vous pourriez faire tirer tous les résultats dans un tableau d'abord, faire quelque chose comme ce qui suit:

$result_list = array(); 
while($row = mysql_fetch_array($result_select)) { 
    result_list[] = $row; 
} 

foreach($result_list as $row) { 
    ... 
} 

Mais il n'y a pas de bonne raison que je peux voir à le faire - et vous avez encore pour utiliser la boucle while, ce qui est inévitable en raison de la façon dont fonctionne mysql_fetch_array(). Pourquoi est-il si important d'utiliser un foreach()?

EDIT: Si cela est juste à des fins d'apprentissage: vous ne pouvez pas convertir cela en foreach. Vous devez avoir un tableau préexistant pour utiliser un foreach() au lieu d'un while(), et mysql_fetch_array() récupère un résultat par appel - il n'y a pas de tableau préexistant pour foreach() pour parcourir.

+0

j'apprends php, et je vouloir apprendre la possibilité, en fait je ne pouvais pas trouver de bonnes tuts sur internet qui pourraient m'expliquer le processus d'utilisation de foreach() pour la manipulation de base de données, j'apprécierais que quelqu'un puisse me pointer la bonne façon (tut), et possibilité d'utiliser la boucle foreach avec la requête de base de données. –

+0

La bonne façon est: NE PAS utiliser foreach boucle avec des requêtes de base de données. –

+0

Vous ne pouvez pas trouver de tutoriels parce que vous ne pouvez simplement pas utiliser foreach() pour la manipulation de la base de données en utilisant les bibliothèques PHP MySQL standard (et vous ne voulez pas utiliser autre chose). Si, pour une raison quelconque, vous voulez vraiment utiliser foreach() et avoir toutes vos lignes dans un tableau à la fois, vous devez le faire comme ci-dessus. – cincodenada

0

Pour utiliser foreach, vous devez disposer d'un tableau contenant toutes les lignes du résultat de la requête. Certaines bibliothèques DB pour PHP fournissent une fonction fetch_all qui fournit un tableau approprié, mais je ne pouvais pas en trouver un pour mysql (cependant, l'extension mysqli le fait). Vous pouvez bien sûr écrire le vôtre, comme si

function mysql_fetch_all($result) { 
    $rows = array(); 
    while ($row = mysql_fetch_array($result)) { 
    $rows[] = $row; 
    } 
    return $rows; 
} 

Cependant, je dois faire écho au "pourquoi?" En utilisant cette fonction, vous créez deux boucles au lieu d'une, et vous devez charger tout le jeu de résultats dans la mémoire. Pour des ensembles de résultats suffisamment volumineux, cela peut devenir un sérieux frein à la performance. Et pour quoi?

foreach (mysql_fetch_all($result) as $row) 

vs

while ($row = mysql_fetch_array($result)) 

while est tout aussi concis et plus facile à lire l'OMI.

EDIT Il existe une autre option, mais elle est assez absurde. Vous pouvez utiliser le Iterator Interface

class MysqlResult implements Iterator { 
    private $rownum = 0; 
    private $numrows = 0; 
    private $result; 

    public function __construct($result) { 
    $this->result = $result; 
    $this->numrows = mysql_num_rows($result); 
    } 

    public function rewind() { 
    $this->rownum = 0; 
    } 

    public function current() { 
    mysql_data_seek($this->result, $this->rownum); 
    return mysql_fetch_array($this->result); 
    } 

    public function key() { 
    return $this->rownum; 
    } 

    public function next() { 
    $this->rownum++; 
    } 

    public function valid() { 
    return $this->rownum < $this->numrows ? true : false; 
    } 
} 

$rows = new MysqlResult(mysql_query($query_select)); 

foreach ($rows as $row) { 
    //code... 
} 

Dans ce cas, l'instance MysqlResult va chercher des lignes seulement sur demande comme avec while, mais il enveloppe dans un joli paquet foreach-mesure. Tandis que vous vous épargniez une boucle, vous avez ajouté le surcoût de l'instanciation de classe et une charge d'appels de fonction, sans parler de la complexité supplémentaire du code.

Mais vous avez demandé si cela pouvait être fait sans utiliser while (ou for j'imagine). Eh bien, peut être fait, juste comme ça.Que ce soit devrait être fait à vous.

+0

je ne suis pas habitué à oop, mais merci pour ce long code BTW, je l'ai traversé et dois admettre que j'ai appris quelque chose. merci pour votre aide étendue :) –

0

la possibilité la plus évidente de rendre foreach une possibilité inclut la matérialisation de l'ensemble de résultats dans un tableau, ce qui va probablement vous tuer dans le sens de la mémoire, tôt ou tard. vous devez vous tourner vers les itérateurs pour éviter ce problème. voir http://www.php.net/~helly/php/ext/spl/

Questions connexes