8
votes

Alors que les boucles ne peuvent pas être utilisées deux fois? Php

Je suis nouveau à PHP, j'espère que quelqu'un peut m'aider. J'ai une table contenant "ID", "IMG", "LINK" et "DESC" dans la base de données MySQL. Je veux que cela écho à quelque chose comme ça:

<?php
  require_once "./dbconfig.php";
  opendb();
  $sql = "SELECT * FROM images ORDER BY id DESC"; 
  $query = querydb($sql);
?>
<div id="featured"> 
<?php
  while($row = mysql_fetch_array( $query )){
    echo "<a target='_blank' href='$row[link]'><img src='$row[img]' title='$row[desc]'/></a>";
  }
?>
</div>
<div id="cap">
<?php
  while($row = mysql_fetch_array( $query )){
    echo "<span class='desc' id='$row[id]'>$row[desc]</span>";
  }
closedb();
?>
</div>


3 commentaires

Veuillez indenter votre code source correctement.


Désolé, veuillez séparer le code HTML avec le code PHP ci-dessous, je ne peux pas le modifier. :(


@edward: Oui, vous pouvez - voir ce lien "Modifier" sous votre question?


10 Réponses :


1
votes

fromt the docs pour mysql_fetch_array

retourne un tableau qui correspond à la ligne extraite et déplace le pointeur de données interne à venir.

Le point de données interne est toujours à la fin lorsque vous essayez d'utiliser votre seconde en boucle. Vous n'avez rien fait pour le réinitialiser.

Vous pouvez le déplacer vers le début avec mysql_data_seek


0 commentaires

13
votes

Utilisez-le avant votre seconde tandis que la boucle

mysql_data_seek($query,0);


0 commentaires

0
votes

mysql_fetch_array code> sera vide car vous avez déjà récupéré toutes les lignes de la base de données. Vous devrez réinitialiser le pointeur à l'aide de mysql_data_seek code>.

<?php
mysql_data_seek( $query, 0 );
while($row = mysql_fetch_array( $query )){
echo "<span class='desc' id='$row[id]'>$row[desc]</span>";
}
... rest of code


0 commentaires


0
votes

avec mysql_fetch_array () code> Vous traversez les résultats étape par étape, jusqu'à ce que vous soyez à la fin. Ou comme les documents PHP disent:

retourne un tableau qui correspond à la rangée extraite et déplace l'interne pointeur de données à venir. P> blockQuote>

Cela signifie que vous devez commencer de nouveau. Ainsi, utilisez-le avant votre deuxième fois: P>

mysql_data_seek($query,0);


0 commentaires

1
votes

Vous pouvez utiliser pendant deux fois, mais voir quoi il fait :

Il indique à PHP d'exécuter la ou les instructions imbriquées à plusieurs reprises, tant que l'expression tandis que l'expression est évaluée vers true.

une fois que mysql_fetch_array n'a plus de lignes à récupérer, il retournera false sur chaque appel ultérieur - donc votre premier tandis que boucle arrêtera de boucler, comme le expression mysql_fetch_array ($ requis) est faux; Et puisque c'est la même expression dans le second tandis que , cette boucle n'exécutera jamais (comme l'expression évalue vers false ).

Que faire: Si vous souhaitez boucler sur les résultats à plusieurs reprises, je suggérerais de stocker les lignes de résultat dans un tableau d'abord, puis de la boucle. Exemple simplifié: xxx


0 commentaires

17
votes

La première boucle consomme déjà toutes les données de MySQL, il n'y a donc plus rien dans la deuxième boucle. Vous pouvez stocker les données des lignes dans le même temps, cependant, puis réutiliser ce magasin.

<div id="featured"> 
<?php
$rows = array();
while($row = mysql_fetch_array( $query )){
  $rows[] = $row;
  echo "<a target='_blank' href='$row[link]'><img src='$row[img]' title='$row[desc]'/></a>";
}
?>
</div>
<div id="cap">
<?php
foreach($rows as $row){
  echo "<span class='desc' id='$row[id]'>$row[desc]</span>";
}
closedb();
?>
</div>


4 commentaires

Oui, c'est la réponse en remercie et merci pour ceux qui ont répondu. Passez une bonne journée tout le monde.


Cela semble être un gaspillage de mémoire.


@edward: N'oubliez pas d'encoder correctement le HTML que vous produisez.


@JLEVETT: Question: PHP est copie sur l'écriture, alors combien de mémoire ces déchets?



0
votes

Essayez ceci xxx


0 commentaires

0
votes

$ str_res1 = ''; $ str_res2 = ''; tandis que ($ rang = mysql_fetch_array ($ requis)) { $ str_res1. = "une cible = '_ blank' href = '$ ligne [link]' 'img src =' $ ligne [img] 'title =' $" A "; $ str_res2. = "span class = 'desc' id = '$ ligne [ID]'> $ ligne [DESC] span>"; }

Désolé, je n'ai pas pu compléter les balises HTML dans ma réponse car elle disparaît de la poste si j'écris "<" ou "/>"

Par ceci, vous pouvez prendre toutes les valeurs dans PHP Strings et vous pouvez l'écho à tout ce que vous souhaitez.


0 commentaires

0
votes
$stuff = mysql_query("SELECT * FROM tbl");

while($s = mysql_fetch_array($stuff)){
//ur code
}
// add this line
mysql_data_seek( $stuff, 0 );

while($r = mysql_fetch_array($stuff)){
//ur code
}

0 commentaires