trié un ableau avec plusieur colonne

Petit nouveau ! | 7 Messages

31 mai 2011, 14:51

bonjour, j'ai créée un tableau en php et html et je voudrais faire le tri pour chaque colonne de ce tabeau , c'est à direquand je clique sur la colonne client le tabeau sera trié selon le nom client, et quand je clique sur num commande le tableau sera trié par le num d commande.
mysql_select_db($database_connexion, $connexion);
$query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY id DESC"); 
$commandes = mysql_query($query_commandes, $connexion) or die(mysql_error());
$row_commandes = mysql_fetch_assoc($commandes);
$totalRows_commandes = mysql_num_rows($commandes);
 <table width="100%" cellpadding="5"  cellspacing="1" bgcolor="#666666">
        <tr bgcolor="#FFFFFF">
          <th scope="col"><span class="Style1 Style1">Num&eacute;ro de commande </span></th>
          <th scope="col"><span class="Style1 Style1">Num&eacute;ro de facture </span></th>
          <th scope="col"><span class="Style1 Style1">Client </span></th>
          <th scope="col"><span class="Style1 Style1">Poids </span></th>
          <th scope="col"><span class="Style1 Style1">Total TTC </span></th>
          <th scope="col"><span class="Style1">Date de Commande </span></th>
          <th scope="col"><span class="Style1 Style1">Facture format PDF</span></th>
        </tr>
        
 
        <?php do { ?>
        
        		<?php
    		$date =$row_commandes['date'];
			$total_ht =$row_commandes['total_ht'];
			$c_total_ttc =$row_commandes['total_ttc'];
			$expedition =$row_commandes['expedition'];
			$client=$row_commandes['client'];
			//$zone = $row_client['zone'];
			
			$date_french= preg_replace("/([0-9].*)-([0-9].*)-([0-9].*)/" ,"\\3-\\2-\\1",$date);
			$date_expedition= preg_replace("/([0-9].*)-([0-9].*)-([0-9].*)/" ,"\\3-\\2-\\1",$expedition);
			$total_ttc_arrondi= number_format($c_total_ttc, 2, ',', ' '); 
			
			$date_explosee = explode("-", $date);
			$annee = $date_explosee[0];
			$mois = $date_explosee[1];
			$jour = $date_explosee[2];
			
			$id =$row_commandes['id'];
			
			$id = 1000+$id;
        		?>
        <tr bgcolor="#FFFFFF">
          <td><a href="../account/detail_commande.php?id=<?php echo $row_commandes['id']; ?>" class="Style1 Style1">n°<?php echo $row_commandes['id']; ?></a></td>
          <td><div align="center"><span class="Style1 Style1">n°<?php echo $annee; ?>/<?php echo $id; ?></span></div></td>
          <td><div align="center"><span class="Style1 Style1"><?php echo $row_commandes['client']; ?></span></div></td>
          <td><div align="right"><span class="Style1 Style1"><?php echo $row_commandes['poids']; ?>gr.</span></div></td>
          <td><div align="right"><span class="Style1 Style1"><?php echo $total_ttc_arrondi; ?>€</span></div></td>
          <td><div align="center"><span class="Style1"><?php echo $date_french; ?></span></div></td>
          <td><div align="center"><span class="Style1"><a href="traitementAdmin_facture.php?id=<?php echo $row_commandes['id']; ?>">Facture</a></span></div></td>
        </tr>
        <?php } while ($row_commandes = mysql_fetch_assoc($commandes)); ?>
        
      </table>

merci d'avance pour votre aide

ViPHP
AB
ViPHP | 5818 Messages

31 mai 2011, 16:51

Le plus simple est de faire le tri au niveau de ta requête.

par défaut :
$query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY id DESC");

ou suivant le bouton
$query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY nom DESC");
ou
$query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY num_commande DESC");

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 mai 2011, 18:39

hum je m'interroge sur la pertinence du sprintf pourquoi ne pas utiliser une simple affectation ?

a la limite $query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY %s DESC",$nomduChamp);

$nomduChamp provenant du clic utilisateur pour le tri (GET / POST suivant la construction)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 7 Messages

31 mai 2011, 18:51

merci pour vos repense; mais ça ne marche tjrs pas.
j'ai essayé ton code (moogli) met il m'affiche le mg d'erreur suivant:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC' at line 1"

ViPHP
AB
ViPHP | 5818 Messages

31 mai 2011, 19:00

hum je m'interroge sur la pertinence du sprintf pourquoi ne pas utiliser une simple affectation ?
Oui effectivement, je n'ai pas regardé ni dit que c'était pertinent, j'ai simplement fait du copié-collé avec le code original pour montrer l'exemple avec un tri sur un autre critère :)

ViPHP
AB
ViPHP | 5818 Messages

31 mai 2011, 19:02

merci pour vos repense; mais ça ne marche tjrs pas.
j'ai essayé ton code (moogli) met il m'affiche le mg d'erreur suivant:
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC' at line 1"
Comment s'appelle ton nom de champ qui enregistre les numéros de commande ?

Petit nouveau ! | 7 Messages

31 mai 2011, 19:06

je ne sais pas si t'a compris ce que je veux faire ou pas!! en fait moi je voudrais trier ce tableau par plusieur criteres c'est à dire , en cliquand sur client il me le trie par ordre alphabétique des noms des clients et n cliquant sur la date il me le trie selon la date ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 mai 2011, 19:28

AIDAN, quel est le code utilisé, car si la variable est vide cette erreur est normal
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

31 mai 2011, 19:29

Ben oui et ça tu peux le faire faire directement avec ta requête. Donc pour te donner un exemple fonctionnel il faudrait que l'on connaisse le nom des champs sur lesquels tu veux faire le tri... donc je répète ma question.

Sinon tu peux enregistrer le tableau de résultats dans une variable de sessions puis faire le tri sur ce tableau avec php mais cela risque d'être assez (ou très) laborieux.

Petit nouveau ! | 7 Messages

31 mai 2011, 19:34

le nom du champ qui enregistre le num de la commande c'est "id"

Petit nouveau ! | 7 Messages

31 mai 2011, 20:03

voici le code:
mysql_select_db($database_connexion, $connexion);
$query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY %s DESC",$client); 
$commandes = mysql_query($query_commandes, $connexion) or die(mysql_error());
$row_commandes = mysql_fetch_assoc($commandes);
$totalRows_commandes = mysql_num_rows($commandes);
<table width="100%" cellpadding="5"  cellspacing="1" bgcolor="#666666">
        <tr bgcolor="#FFFFFF">
          <th scope="col"><span class="Style1 Style1">Num&eacute;ro de commande </span></th>
          <th scope="col"><span class="Style1 Style1">Num&eacute;ro de facture </span></th>
          <th scope="col"><span class="Style1 Style1">Client </span></th>
          <th scope="col"><span class="Style1 Style1">Poids </span></th>
          <th scope="col"><span class="Style1 Style1">Total TTC </span></th>
          <th scope="col"><span class="Style1">Date de Commande </span></th>
          <th scope="col"><span class="Style1 Style1">Facture format PDF</span></th>
        </tr>
 <?php do { ?>
        
        		<?php
    		$date =$row_commandes['date'];
			$total_ht =$row_commandes['total_ht'];
			$c_total_ttc =$row_commandes['total_ttc'];
			$expedition =$row_commandes['expedition'];
			$client=$row_commandes['client'];
			//$zone = $row_client['zone'];
			
			$date_french= preg_replace("/([0-9].*)-([0-9].*)-([0-9].*)/" ,"\\3-\\2-\\1",$date);
			$date_expedition= preg_replace("/([0-9].*)-([0-9].*)-([0-9].*)/" ,"\\3-\\2-\\1",$expedition);
			$total_ttc_arrondi= number_format($c_total_ttc, 2, ',', ' '); 
			
			$date_explosee = explode("-", $date);
			$annee = $date_explosee[0];
			$mois = $date_explosee[1];
			$jour = $date_explosee[2];
			
			$id =$row_commandes['id'];
			
			$id = 1000+$id;
        		?>
        <tr bgcolor="#FFFFFF">
          <td><a href="../account/detail_commande.php?id=<?php echo $row_commandes['id']; ?>" class="Style1 Style1">n°<?php echo $row_commandes['id']; ?></a></td>
          <td><div align="center"><span class="Style1 Style1">n°<?php echo $annee; ?>/<?php echo $id; ?></span></div></td>
          <td><div align="center"><span class="Style1 Style1"><?php echo $row_commandes['client']; ?></span></div></td>
          <td><div align="right"><span class="Style1 Style1"><?php echo $row_commandes['poids']; ?>gr.</span></div></td>
          <td><div align="right"><span class="Style1 Style1"><?php echo $total_ttc_arrondi; ?>€</span></div></td>
          <td><div align="center"><span class="Style1"><?php echo $date_french; ?></span></div></td>
          <td><div align="center"><span class="Style1"><a href="traitementAdmin_facture.php?id=<?php echo $row_commandes['id']; ?>">Facture</a></span></div></td>
        </tr>
        <?php } while ($row_commandes = mysql_fetch_assoc($commandes)); ?>
      </table>

je voudrais le trie selon le num commande et aussi client. merci d'avance pour votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 mai 2011, 20:20

SELECT * FROM shop_commande ORDER BY id,client DESC ?

si ton choix est dynamique il faut qu tu fasse un lien (par exemple sur le nom de la colonne) qui contient le nom de la colonne sur laquelle tu souhaite trier (par exemple ?colonne=client ou ?colonne=id)

ensuite dans le script tu test sir $_GET['colonne'] existe et si c'est le cas tu met la valeur dans $client (dans ton code) si non tu met une valeur par défaut.
<?php
mysql_select_db($database_connexion, $connexion);
if (!empty( $_GET['colonne'])) {
$tri  = $_GET['colonne']; 
// bon faut quand même vérifier que la valeur est bien un nom de colonne réelle ;)  par exemple avec in_array
}
else {
// cas par défaut
$tri = 'id';
}
$query_commandes = sprintf("SELECT * FROM shop_commande ORDER BY %s DESC",$tri);
$commandes = mysql_query($query_commandes, $connexion) OR die(mysql_error());
$row_commandes = mysql_fetch_assoc($commandes);
$totalRows_commandes = mysql_num_rows($commandes);
?>
<table width="100%" cellpadding="5"  cellspacing="1" bgcolor="#666666">
        <tr bgcolor="#FFFFFF">
          <th scope="col"><span class="Style1 Style1"><a href="?colonne=id">Num&eacute;ro de commande</a> </span></th>
          <th scope="col"><span class="Style1 Style1">Num&eacute;ro de facture </span></th>
          <th scope="col"><span class="Style1 Style1"><a href="?colonne=client">Client</a> </span></th>
          <th scope="col"><span class="Style1 Style1">Poids </span></th>
          <th scope="col"><span class="Style1 Style1">Total TTC </span></th>
          <th scope="col"><span class="Style1">Date de Commande </span></th>
          <th scope="col"><span class="Style1 Style1">Facture format PDF</span></th>
        </tr>
l'avantage de ce système et que tu n'est pas limité sur nombre de champs utilisable (tant qu'il existe dans la table).

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 7 Messages

31 mai 2011, 21:49

je te remercie infiniment pour l'attention que t'a donné pour mon prob et surtt pour ton aide , je vais essayer ce que tu m'a dis et j'espere bien que ça vas marché!! :)