Page 1 sur 2

Récuperation d'informations dans ma base de données

Posté : 29 nov. 2006, 08:28
par muriel
Bonjour à tous,

Je suis debutante en php et je n'ai pas reussi à trouver l'expression exact de mon probleme pour faire une recherche sur le forum ou dans les tuto...
J'ai dans ma base de données une table liens avec des champs "id,categorie,liens" j'insere à l'interieur du champs "categories" differentes données et je desirai pouvoir afficher ces données en me servant de ce que j'ai inseré à l'interieur de mon champs "$categorie" et non pas afficher toutes les données du champs categories, je vous donne un exemple se sera plus simple qu'une longue explication:

ID CATEGORIE
1 Divers
2 Divers
3 Annuaire
4 Annuaire

et je souhaiterai pouvoir afficher les 2 enregistrements "Divers" sans avoir les 2 enregistrements "Annuaire" et je ne sais pas du tout comment faire, ni ou trouver cette information.

Je vous donne mon code de départ, qui lui affiche toutes les categories:
 <?
include("../_connexion.php");
$req = "SELECT id,categorie FROM lien";
$res = mysql_query($req) or die;
$nbl = mysql_num_rows($res)or die;

$i=0 ;
while ($nbl!=$i) 
{ 
$id=mysql_result($res,$i,"id"); 
$categorie = mysql_result($res,$i,"categorie");
?>
  <tr> 
    <td align="center" valign="top"><?php echo($categorie); $i++; }?></td>
  </tr>
 
En esperant ne pas avoir été trop confuse dans mes explications, d'avance merci à tous de votre aide.

muriel

Posté : 29 nov. 2006, 09:32
par Hermès
la méthode mysql_num_rows n'est pas la plus adaptée pour parcourir tes données.

Il est préférable de passer par mysql_fetch_array().

Ce qui donnerait donc :
<?php
include("../_connexion.php");
$req = "SELECT id,categorie FROM lien";
$res = mysql_query($req) or die;
while ($tab = mysql_fetch_array($res)) {
   if ($tab['categorie'] == "Divers") {
?>
      <tr>
         <td align="center" valign="top"><?php echo $tab['categorie']; ?></td>
      </tr>
<?php
   }
}
Par ailleurs, il est préférable, comme dans le cas présent, d'enrichir la requête SQL pour effectuer le premier tri sur les données : il est inutile de récupérer toute la table si on n'a besoin que des données qui ont pour catégorie "Divers".
Il vaut mieux utiliser comme requête SELECT id,categorie FROM lien WHERE categorie='Divers'
(bon dans cet exemple ça n'est même pas nécessaire étant donné qu'on ne se sert pas de l'id et qu'on récupère que "Divers" donc on aurait très bien pu simplement demander combien d'entrées correspondent à la requête précédente et afficher autant de fois que nécessaire la partie en HTML.

Posté : 29 nov. 2006, 10:26
par Darth Killer
Selon ton goût tu préfèreras peut-être remplacer mysql_fetch_array() par un de ses équivalent :

(dans la suite, $rid est le résultat d'un mysql_query())

mysql_fetch_rows($rid) == mysql_fetch_array($rid,MYSQL_NUM) rendera un tableau indexé numériquement prenant dans l'ordre des champs les valeur du résultat extrait.

mysql_fetch_assoc($rid) == mysql_fetch_array($rid,MYSQL_ASSOC) rendera un tableau associatif au lieu d'un tableau indexé numériquement, les noms des clés étant ceux des champs

mysql_fetch_array($rid) == mysql_fetch_array($rid,MYSQL_BOTH) rendera un tableau équivalent à la fusion des 2 précédents, donc chaque valeur d'un champs sera présent à la fois sous une lcé nommée et sous une clé numérique.

mysql_fetch_object($rid) rendera un objet dont les propriétés portent le nom des champs.

Toutes ces fonctions sont aussi rapides les unes que les autres
Voilà avec ça t'as de quoi faire ^^
(Moi je préfère mysql_fetch_assoc($rid) :D )

Posté : 29 nov. 2006, 19:20
par MS-DOS_1991
Toutes ces fonctions sont aussi rapides les unes que les autres
Faux :wink:

mysql_fetch_rows (tableau indexé numériquement) est plus rapide que mysql_fetch_assoc (tableau associatif) qui lui-même est plus rapide que mysql_fetch_object (objet) ;) De manière générale, toutes les fonctions travaillant sur des objets sont plus lentes que les autres (voir un excellent article de Sara Golemon)

Après, effectivement, c'est une question de goût...

Personnellement, je n'utilise jamais fetch_rows car je n'ai pas envie d'avoir à me rappeller l'ordre exact des champs six mois plus tard :roll: . Depuis que je suis passé en tout-POO ou presque, je n'utilise donc pratiquement plus que fetch_object() avec mysqli ... un poil plus lent que fetch_assoc donc, mais beaucoup plus simple d'utilisation pour des débutants (dans des templates par exemple, cela évite les oublis de crochets toutes les deux lignes) ;)

Posté : 30 nov. 2006, 23:01
par muriel
Merci beaucoup pour vos reponses et votre aide Hermès, Darth Killer et MS-DOS_1991, ça marche parfaitement bien. J'aurai surement d'autres questions mais pour le moment c'est parfait.

Longue vie à ce super forum.

muriel

Posté : 30 nov. 2006, 23:29
par Truc
Modération :
muriel, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération en cliquant sur le bouton [Mettre Résolu] en haut à gauche de ce sujet. :wink:

Posté : 06 déc. 2006, 12:34
par muriel
Bonjour à vous tous,

Je reviens vers vous car j'ai encore un petit probleme avec mon code qui marche tres bien mais que j'aimerais automatiser plus !?
Donc je m'explique, j'ai un formulaire ou on peut créer de nouvelles categories dans la base de données et je desirai savoir si il y a une solution pour que à chaque fois qu'il y a une nouvelle categorie crée elle s'affiche automatiquement sur la page, et pour le moment j'ai mon code qui affiche que les categories que je lui dis d'afficher et si une nouvelle categorie est créee je dois manuellement mettre le code, ci-dessous mon code pour exemple:
<?php 
include("../_connexion.php"); 
$req = "SELECT id,categorie,liens_1 FROM lien"; 
$res = mysql_query($req) or die; 
while ($tab = mysql_fetch_array($res)) { 
   if ($tab['categorie'] == "Liens et sites utiles") { 
?> 
      <tr> 
         <td><?php echo $tab['liens_1']; ?><br></td> 
      </tr> 
<?php 
   } 
} 
?> 
<br>
<?php 
include("../_connexion.php"); 
$req = "SELECT id,categorie,liens_1 FROM lien"; 
$res = mysql_query($req) or die; 
while ($tab = mysql_fetch_array($res)) { 
   if ($tab['categorie'] == "Divers") { 
?> 
      <tr> 
         <td><?php echo $tab['liens_1']; ?><br></td> 
      </tr> 
<?php 
   } 
} 
?> 
en esperant que mes explications sont comprehensible, pour plus de detail n'hesitez pas à me demander.
d'avance merci de votre aide.

Posté : 06 déc. 2006, 12:49
par fred9999
salut
en fait tu peut utiliser mysql_fetch row
mais il me semble qu'il y avait quelques erreurs :
<? 
include("../_connexion.php"); 
$req = "SELECT id,categorie FROM lien"; 
$res = mysql_query($req) or die; 
while ($nbl= mysql_num_rows($res))  
{  
echo"
  <tr>  
    <td align="center" valign="top>".$nbl[1]."</td> 
  </tr> ";
et tout deviendra plus simple :lol:

Posté : 06 déc. 2006, 12:51
par fred9999
oups :oops:

moi aussi j'ai fait des erreurs
<?  
include("../_connexion.php");  
$req = "SELECT id,categorie FROM lien";  
$res = mysql_query($req) or die;  
while ($nbl= mysql_num_rows($res))   
{   
echo" 
  <tr>   
    <td align=\"center\" valign=\"top\">".$nbl[1]."</td>  
  </tr> ";
}
voila voila :lol: :lol: [/code]

Posté : 06 déc. 2006, 13:26
par muriel
Bonjour fred,

Je suis désolée Fred mais le code ne marche pas, j'ai ma page qui est blanche mais j'ai l'impression que ça cherche car ma page est bloquée, loll !!!
En esperant trouver ensemble comment faire marcher ce code.

Merci de ton aide Fred,

@++

Posté : 06 déc. 2006, 13:34
par Ajoloca
Bonjour,

Ton programme boucle.
Cette condition
while ($nbl= mysql_num_rows($res))
sera toujours vraie.
mysql_num_rows()
donne le nombre lignes retournées par MySQL pour la requête, mais ne les lit pas .

Pour les lire il faut utiliser
mysql_fetch_row(), mysql_fetch_array(), mysql_fetch_assoc(), ...

Posté : 06 déc. 2006, 14:46
par fred9999
autant pour moi j'ai pas corrigé cette erreur :
<?   
include("../_connexion.php");   
$req = "SELECT id,categorie FROM lien";   
$res = mysql_query($req) or die;   
while ($nbl= mysql_fetch_rows($res))    
{    
echo"  
  <tr>    
    <td align=\"center\" valign=\"top\">".$nbl[1]."</td>   
  </tr> "; 
}
voila maintenant ça devrai tourner :wink:

Posté : 06 déc. 2006, 17:55
par Ajoloca
Re,
Attention, il y a une erreur ici
while ($nbl= mysql_fetch_rows($res))
c'est pas mysql_fetch_rows mais
while ($nbl= mysql_fetch_row($res))

Posté : 06 déc. 2006, 19:11
par muriel
Bonsoir Ajoloca et fred9999,

tout d'abord merci Ajoloca et fred9999 de votre aide et pour toutes vos infos qui marchent parfaiement bien. Dans mes explications j'ai voulu faire simple et maintenant je ne m'en sors plus donc reviens vers vous pour de plus amples informations, je m'explique dans mon code j'ai des catégories mais aussi des liens et je voudrais afficher 1 seule fois la categorie et en dessous tous les liens qui correspondent à cette categorie et ainsi de suite, mais evidemment avec mon explications simplistes vous m'avez donné une réponse parfaite mais maintenant je sais afficher les categories et les liens mais je n'arrive pas à afficher le champs categorie qu'une seule fois, loll !? voici mon code:
<?    
include("../_connexion.php");    
$req = "SELECT id,categorie,liens_1 FROM lien";    
$res = mysql_query($req) or die;    
while ($nbl= mysql_fetch_row($res))     
{     
echo"  
<tr>     
    <td align=\"center\" valign=\"top\">".$nbl[1]."</td><br>   
  </tr>   
  <tr>     
    <td align=\"center\" valign=\"top\">".$nbl[2]."</td><br>   
  </tr> ";  
}

?>
et le probleme maintenant viens du code
<tr>     
    <td align=\"center\" valign=\"top\">".$nbl[1]."</td><br>   
  </tr>   
d'avance merci de votre aide,

Posté : 06 déc. 2006, 19:34
par Ajoloca
Re,
En premier lieu tu dois modifier ta requête pour regrouper tes liens par catégorie.
QQ chose du style
$req = 'SELECT id, categorie, liens_1 FROM lien GROUP BY categorie ORDER BY categorie, liens_1';
Ensuite dans la construction de page tu devras conserver la catégorie en cours et voir si la suivante change, si c'est le cas afficher la nouvelle catégorie

Un exemple
<?php    
include("../_connexion.php");    
$req = 'SELECT id, categorie, liens_1 FROM lien GROUP BY categorie ORDER BY categorie, liens_1';    
$res = mysql_query($req) or die('ERR_SQL : ' . $req . '<br />' . mysql_error());
$lastCat = '';   
while ($nbl= mysql_fetch_array($res)){
   if($nbl['categorie'] != $lastCat){
      $lastCat = $nbl['categorie'];
      echo '<h3>Cat&eacute;gorie : ' . $lastCat . '</h3>';
   }
   echo 'Lien : ' . $nbl['liens_1'] . '<br />';
}
?>
Quelques conseils :
Ne jamais utiliser les "short_open_tag" (<?) toujours utiliser <?php
Tester le retour de MySQL or die() avec des messages parlants (ne pas oublier la requête incriminée)