Page 1 sur 1

Afficher par tri? Mysql

Posté : 21 sept. 2006, 06:38
par Mike_php
Bonjour à tous. Comme je débute, je ne suis pas très alaise avec le PHP.

J'aimerais afficher les détails de la categorie carte mère de ma table.

Que dois-je mettre à la place de
while($data = mysql_fetch_array($req))
<?PHP 

$db = mysql_connect('localhost', '*****', '******');  
mysql_select_db('*****',$db); 

// Combien d'entrées dans la table ?
$retour = mysql_query("SELECT COUNT(*) AS categorie  FROM item WHERE categorie LIKE 'carte mère'"  );
$donnees = mysql_fetch_array($retour);

echo '<h2>'.'Il y a pr&eacute;sentement '. $donnees['categorie']. ' it&egrave;mes affich&eacute;s sur cette page'.'</h2>'; 
echo '<h5>'.'Cliquez sur une image pour plus de d&eacute;tails '.'</h5>';
$sql = 'SELECT * FROM item';  
$req = mysql_query($sql) or die('Erreur SQL ! 
'.$sql.' 
'.mysql_error()); 
 


 
// affichage du début de la table 
echo " 
<table border=1 align=left >
<th bgcolor='#CFFEFE'> Image </th>
<th bgcolor='#CFFEFE'> Compagnie </th> 
<th bgcolor='#CFFEFE'> Mod&egrave;le </th> 
<th bgcolor='#CFFEFE'> type </th> 
<th bgcolor='#CFFEFE'> Description </th> 
<th bgcolor='#CFFEFE'> Prix </th> 
<th bgcolor='#CFFEFE'> En&nbsp;sp&eacute;cial </th> 
<th bgcolor='#CFFEFE'> Commentaire </th>
"; 
while($data = mysql_fetch_array($req))
{ 
// affichage des lignes de la table 
echo " 
<tr> 
<td align= left valign=middle width=17>"; 
echo '<a target="_blank" href= "'.$data['web'].'"> <img src="cartes_mere/'.$data['photo'].'"></a>';  
echo "</td>  
<td  align= left valign=middle width=50 >";  
echo $data['brand'];  
echo "</td>  
<td align= left valign=middle width=50>"; 
echo $data['model'];  
echo "</td>  
<td align= left valign=middle width=50>"; 
echo $data['type'];  
echo "</td>  
<td align= left valign=middle width=50>"; 
echo $data['description_FR'];  
echo "</td>  
<td align= left valign=middle width=50>"; 
echo $data['Price'];  
echo "</td>  
<td align= left valign=middle width=50>"; 
echo $data['special']; 
echo "</td>
<td align= left valign=middle width=50>"; 
echo $data['commentaire']; 
echo "</td>    
</tr>  

";}  
// affichage de la fin de la table 
echo "</table>";  



mysql_close(); 
?> 

Merci pour votre aide.

Posté : 21 sept. 2006, 08:20
par Cyrano
Je ne suis pas sûr de comprendre pourquoi tu veux remplacer cette partie, mais on peut commencer par nettoyer un peu le code et ranger ça plus convenablement en séparant correctement le PHP du HTML. Première proposition:
<?php 
$db = mysql_connect('localhost', '*****', '******');  
mysql_select_db('*****',$db); 

// Combien d'entrées dans la table ?
$sql1 = "SELECT COUNT(*) AS categorie  ".
       "FROM item ".
       "WHERE categorie = 'carte mère'";
$retour = mysql_query($sql);
$donnees = mysql_fetch_array($retour);
?>
<h2>Il y a présentement <?php echo($donnees['categorie']); ?> items affichés sur cette page</h2> 
<h5>Cliquez sur une image pour plus de détails</h5>
<?php
$sql = "SELECT web, photo, brand, model, type, description_FR, Price, special, commentaire ".
       "FROM item";  
$req = mysql_query($sql) or die('Erreur SQL ! 
'.$sql.' 
'.mysql_error()); 

// affichage du début de la table 
?>
<table border="1" align="left" >
  <tr>
    <th bgcolor='#CFFEFE'> Image </th>
    <th bgcolor='#CFFEFE'> Compagnie </th> 
    <th bgcolor='#CFFEFE'> Modèle </th> 
    <th bgcolor='#CFFEFE'> type </th> 
    <th bgcolor='#CFFEFE'> Description </th> 
    <th bgcolor='#CFFEFE'> Prix </th> 
    <th bgcolor='#CFFEFE'> En spécial </th> 
    <th bgcolor='#CFFEFE'> Commentaire </th>
  </tr>
<?php
while(false != ($data = mysql_fetch_array($req)))
{ 
// affichage des lignes de la table 
?>
  <tr> 
    <td align="left" valign="middle" width="17">
      <a target="_blank" href= "<?php echo($data['web']); ?>"> <img src="cartes_mere/<?php echo($data['photo']); ?>" alt=""></a>
    </td>
    <td align="left" valign="middle" width="50"><?php echo($data['brand']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['model']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['type']); ?></td>  
    <td align="left" valign="middle" width="50"><?php echo($data['description_FR']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['Price']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['special']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['commentaire']); ?></td>
  </tr>  
<?php
}  
// affichage de la fin de la table 
?>
</table>
<?php
mysql_close(); 
?>
Ce que je ne comprends pas c'est qu'au départ, tu compte seulement selon une clause "WHERE categorie LIKE 'carte mère'" mais ensuite tu récupères tout sans clause de tri. :-k

Un détail : évite systématiquement le "SELECT * " : ne récupère QUE les champs dont tu as besoin, tu gagneras en performances.

D'autre part, dans ta première requête de comptage, le LIKE ne sert à rien si tu n'utilises pas de joker : dans ce cas, le "=" est plus approprié. Sinon, ce sera "LIKE 'carte mère%' et là ce sera logique si tu as des catégories comme par exemple "carte mère ASUS" ou "carte mère autre chose". Mais si la colone pour cette catégorie ne contient pas autre chose que "carte mère", alors le "=" s'impose.

Posté : 21 sept. 2006, 08:44
par zeus
Puisqu'on parle d'optimisation, plutôt de faire une requete qui récupère le nombre de ligne puis une qui récupère les lignes en question, tu peux directement faire la 2nd requete et utiliser mysql_num_rows() pour savoir combien de lignes elle a retournée
2nd proposition
<?php 
$db = mysql_connect('localhost', '*****', '******');  
mysql_select_db('*****',$db); 

//Execution de la requete
$sql = "SELECT web, photo, brand, model, type, description_FR, Price, special, commentaire ".
       "FROM item
       WHERE categorie = 'carte mère'";
$req = mysql_query($sql) or die('Erreur SQL ! 
'.$sql.' 
'.mysql_error()); 

$nb_lignes = mysql_num_rows($req);
?>
<h2>Il y a présentement <?php echo($nb_lignes); ?> items affichés sur cette page</h2> 
<h5>Cliquez sur une image pour plus de détails</h5>
<?php


// affichage du début de la table 
?>
<table border="1" align="left" >
  <tr>
    <th bgcolor='#CFFEFE'> Image </th>
    <th bgcolor='#CFFEFE'> Compagnie </th> 
    <th bgcolor='#CFFEFE'> Modèle </th> 
    <th bgcolor='#CFFEFE'> type </th> 
    <th bgcolor='#CFFEFE'> Description </th> 
    <th bgcolor='#CFFEFE'> Prix </th> 
    <th bgcolor='#CFFEFE'> En spécial </th> 
    <th bgcolor='#CFFEFE'> Commentaire </th>
  </tr>
<?php
while(false != ($data = mysql_fetch_array($req)))
{ 
// affichage des lignes de la table 
?>
  <tr> 
    <td align="left" valign="middle" width="17">
      <a target="_blank" href= "<?php echo($data['web']); ?>"> <img src="cartes_mere/<?php echo($data['photo']); ?>" alt=""></a>
    </td>
    <td align="left" valign="middle" width="50"><?php echo($data['brand']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['model']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['type']); ?></td>  
    <td align="left" valign="middle" width="50"><?php echo($data['description_FR']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['Price']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['special']); ?></td>
    <td align="left" valign="middle" width="50"><?php echo($data['commentaire']); ?></td>
  </tr>  
<?php
}  
// affichage de la fin de la table 
?>
</table>
<?php
mysql_close(); 
?>

Posté : 21 sept. 2006, 08:50
par Cyrano
C'est bien pour ça que j'attendais sa réponse avant d'aller plus loin, mais je crois qu'on devra attendre un peu, à la lecture du contenu de son code, notre ami est au Québec et à l'heure qu'il est, il doit roupiller ;)

Posté : 23 sept. 2006, 15:56
par Mike_php
Salut les copains, je n'ai pas eu le temps d'essayer ce que vous me proposez car j'ai été bien occupé cette semaine. Ce que je veux c'est afficher combien il y a de cartes mère dans ma table et afficher seulement les cartes mère du champ catégorie qui contient tous mes composantes informatique à vendre.

Merci Cyrano et Zeus je vous en donne des nouvelles.