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

Eléphant du PHP | 101 Messages

29 nov. 2006, 08:28

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
muriel

Eléphant du PHP | 312 Messages

29 nov. 2006, 09:32

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.

Eléphanteau du PHP | 10 Messages

29 nov. 2006, 10:26

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 )
Darth Killer, the only one...

Eléphanteau du PHP | 23 Messages

29 nov. 2006, 19:20

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) ;)

Eléphant du PHP | 101 Messages

30 nov. 2006, 23:01

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
muriel

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 nov. 2006, 23:29

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 101 Messages

06 déc. 2006, 12:34

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.
muriel

Mammouth du PHP | 592 Messages

06 déc. 2006, 12:49

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:

Mammouth du PHP | 592 Messages

06 déc. 2006, 12:51

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]

Eléphant du PHP | 101 Messages

06 déc. 2006, 13:26

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,

@++
muriel

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 13:34

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(), ...
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 592 Messages

06 déc. 2006, 14:46

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:

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 17:55

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))
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 101 Messages

06 déc. 2006, 19:11

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,
muriel

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 19:34

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)
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein