8795 sujets

Développement web côté serveur, CMS

slt à tous,
voila ce qui m'amene, j'aurais besoin de faire une requete sur une bdd, mais je suis un peu a la ramasse. il s'agit d'un base de donnee de commande.

la bdd de base :
id nom prenom adresse n°cmd ref prix

1 bob momo labas 100 assiette 13 €
2 bob momo labas 100 assiette03 10 €
3 bob momo labas 100 assiette05 12 €
4 luc sky labas 101 assiette10 5 €
5 luc sky labas 101 assiette20 16 €
etc....

sachant que 'nom prenom adresse' peuvent etre identiques, je voudrais faire afficher donc dans un tableau, le nom, prenom et adresse une seule fois, le tous basée sur le n°de commande. Mais par contre aficher egalement les reference et prix.
exemple d'affichage :
bob momo labas commande n°100
assiette 13 €
assiette03 10 €
assiette05 12 €

j'espere avoir reussi à expliquer mon cas. je pense que la requete doit utiliser du group by ou distinct, j'ai essayé plusieurs truc sans succes.

j'ai essayé ca :

SELECT * FROM ta_table GROUP BY nom, prenom, n°cmd


mais cela m'affiche que :
bob momo labas commande n°100
assiette 13 €

il manque le reste :
assiette03 10 €
assiette05 12 €

je mets egalement le code d'affichage au cas ou il faudrait travailler sur le php.
$req = mysql_query("SELECT * FROM commandes GROUP BY nom, prenom, n° order by id") or die('Erreur de requête');
 
echo '<div class="gauche">'; include "left.php"; echo'</div>
<div class="principal"><span class="titrecontenu">Liste des commandes</span><br /><br /><span class="contenu">';
while ($sortie = mysql_fetch_array($req)){
$a=$sortie[ ref];
$b=$sortie[n°cmd];
$c=$sortie[ prix];
$e=$sortie[ nom];
$f=$sortie[ prenom];
$g=$sortie[ adresse];
 
echo '<table class="cad01">
<tr><td>
<tr><td class="cad02">'.$e.' - '.$f.' - '.$g.' commande N°'.$b.'</td>
<tr><td class="cad02">'.$a.'</td>
<td class="cad05">'.$c.' €</td>
<td></tr>';


Si qql'un pouvait me donner un petit coup de mains,
je suis preneur.
Merci
@+
Modifié par spawns (11 Sep 2008 - 07:30)
Modérateur
Salut spawns,

De tout évidence, ta bdd n'est pas aux normes. Là, dans ton cas, il te faut au moins 2/3 tables que tu relies entre elles.

1 les clients
2 les produits
3 les commandes
4 liaison client/produit (relation plusieurs à plusieurs)
table 1 :
CREATE TABLE client(
id_client INT NOT NULL AUTO_INCREMENT PRIMARY KEY
prenom VARCHAR(64) NOT NULL,
nom VARCHAR(64) NOT NULL
);


table 2 :

CREATE TABLE produit(
id_produit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
ref_produitVARCHAR(64) NOT NULL,
produit VARCHAR(64) NOT NULL,
description TEXT NOT NULL,
prix FLOAT(5,2) NOT NULL,
);


table 3 :

CREATE TABLE commande (
id_commande INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_client INT NOT NULL,
date DATE NOT NULL,
CONSTRAINT client_id_client_ce FOREIGN KEY(id_client) REFERENCES client(id_client)
);


table 4 :

CREATE TABLE client_produit(
id_client INT NOT NULL,
id_produit INT NOT NULL,
CONSTRAINT client_id_client_ce FOREIGN KEY(id_client) REFERENCES client(id_client),
CONSTRAINT produit_id_produit_ce FOREIGN KEY(id_produit) REFERENCES produit(id_produit)
)


Ta requête devrait être à peu près ceci :
$sql="SELECT co.id_commande AS ref, p.prix, p.produit, cl.prenom, cl.nom ";
$sql.="FROM commande AS co, produit AS p, client AS cl, client_produit AS cp ";
$sql.="WHERE cl.id_client=co.id_client ";
$sql.="AND cl.id_client=cp.id_client ";
$sql.="AND p.id_produit=cp.id_produit ";


J'ai sûrement fait des petites pétouilles, mais je pense que ce schémas n'est pas mauvais. Là, je ne peux pas débuguer mon code, « because » je ne suis pas sur mon ordi. Également, j'ai dû oublié des champs par ci par là.

J'espère toutefois t'avoir aider.

++
Modifié par Nolem (10 Sep 2008 - 21:57)
Slt et merci de t'être penché sur mon probleme.
Le souci, c'est que ta modif est trop lourde à effectuer sur le site. c'est un site assez ancien et cette bdd ne sert qu'au final à visualiser les commandes.

si je crée tes tables et le reste, je suis obligé de modifier trop de code en amon.

Je cherche vraiment une solution basique pour afficher l'intégralité des commandes.
Modifié par spawns (10 Sep 2008 - 22:59)
Salut,

spawns a écrit :

si je crée tes tables et le reste, je suis obligé de modifier trop de code en amon.
C'est bien dommage car même si la proposition de Nolem n'est pas parfaite (notamment le fait que la table 4 devrait être "commande_produits"), ce serait effectivement bien plus efficace (propre, clair, facile à coder, etc..., etc...) de normaliser les tables. Smiley murf

Du coup tu es obligé de faire un vilain code du genre :
<?php
$sql = "Select * from commandes order by numcmd, ref";
$result = mysql_query($sql) or die(mysql_error());
$cmd_en_cours = 0;
while($ligne = mysql_fetch_assoc($result)) {
	if($ligne['numcmd'] != $cmd_en_cours) {
		echo '<h2>'.$ligne['nom'].' '.$ligne['prenom'].' / N°Cde : '.$ligne['numcmd']."</h2>\n";
		$cmd_en_cours = $ligne['numcmd'];
	}
	echo '<p>Article : '.$ligne['ref'].' - Prix : '.$ligne['prix']."</p>\n";
}
?>

En passant, la clause GROUP BY sert... à regrouper Smiley langue ! Et du coup elle ne renvoie qu'1 enregistrement.

A+
Modifié par Heyoan (11 Sep 2008 - 00:22)
Milles merci Heyoan
tu me sauves la vie, c'est exactement que qu'il me fallait. Je concede comme tu le dit que le code n'est pas spécialement estetique mais cela suffira bien pour ce simple affichage.

Encore merci
& @+ sur le forum
Modifié par spawns (11 Sep 2008 - 00:24)
désolé,
petite question subsidiaire

voila mon code avec a mise en forme

$sql = "Select * from commandes order by nmrcde, ref";
$result = mysql_query($sql) or die(mysql_error());
$cmd_en_cours = 0;

echo '<div class="gauche">'; include "left.php"; echo'</div>
<div class="principal"><span class="titrecontenu">Liste des commandes</span><br /><br /><span class="contenu">';
while($ligne = mysql_fetch_assoc($result)) {
	$aa=$ligne['qte'];
	$bb=$ligne['prixu'];
	$unit=$aa*$bb;
	if($ligne['nmrcde'] != $cmd_en_cours) {
		echo '<table class="com01"><tr><td colspan="2" class="com09"><hr width="50%"></td></tr>
		<tr><td colspan="4" class="com06">'.$ligne['titre'].' '.$ligne['nom'].' '.$ligne['prenom'].'</td><td class="com02">Commande N°: '.$ligne['nmrcde'].'</td></tr>
		<tr><td colspan="5" class="com07">'.$ligne['adresse'].' -- '.$ligne['cp'].' -- '.$ligne['ville'].'</td></tr></table>';
		$cmd_en_cours = $ligne['nmrcde'];
		}
		echo '<table class="com01" ><tr><td class="com02">'.$ligne['ref'].'</td><td class="com03">'.$ligne['desi'].'</td><td class="com04">'.$ligne['qte'].'</td><td class="com04">'.$ligne['prixu'].' €</td><td class="com04">'.$unit.' €</td></tr></table>';
}


Je voudais ajouter un petit tableau a la fin de chaque commande pour y afficher le prix total. Comme j'ai la quantité et le prix unitaire ce n'est pas dur à calculer ligne par ligne mais pour tout additionner c'est plus tendu.
j'ai essayé avec
$prixtotal+=$unit;


Une idée... encore Smiley smile
Modifié par spawns (11 Sep 2008 - 02:17)
Hem... le code PHP est déjà moche alors ce n'est pas la peine d'en rajouter avec le code html ! Smiley biggol

Typiquement je ne vois pas l'intérêt de créer une TABLE par ligne ! D'ailleurs personnellement je n'aurais utilisé une table que pour lister les lignes commandes...

Sinon tu pourrais faire quelque chose comme :
<?php
$sql = "Select * from commandes order by nmrcde, ref";
$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
	echo "<table>\n";
	$cmd_en_cours = 0;
	$premiere_commande = true;
	while($ligne = mysql_fetch_assoc($result)) {
		if($ligne['nmrcde'] != $cmd_en_cours) {
			if($premiere_commande) {
				$premiere_commande = false;
			} else {
				echo '<tr><td colspan="3"> </td><td>Total :</td><td>'.number_format($total_cmd, 2, ',', ' ')." €</td></tr>\n";
			}
			echo '<tr><td colspan="5"><hr style="width:50%" /></td></tr>'."\n";
			echo '<tr><td colspan="4">'.$ligne['titre'].' '.$ligne['nom'].' '.$ligne['prenom'].'</td><td class="com02">Commande N°: '.$ligne['nmrcde'].'</td></tr>'."\n";
			echo '<tr><td colspan="5">'.$ligne['adresse'].' -- '.$ligne['cp'].' -- '.$ligne['ville'].'</td></tr>'."\n";
			$cmd_en_cours = $ligne['nmrcde'];
			$total_cmd = 0;
		}
		$total_ligne = $ligne['qte'] * $ligne['prixu'];
		$total_cmd += $total_ligne;
		echo '<tr><td class="com02">'.$ligne['ref'].'</td><td class="com03">'.$ligne['desi'].'</td><td class="com04">'.$ligne['qte'].'</td><td class="com04">'.number_format($ligne['prixu'], 2, ',', ' ').' €</td><td class="com04">'.number_format($total_ligne, 2, ',', ' ')." €</td></tr>\n";
	}
	echo '<tr><td colspan="3"> </td><td>Total :</td><td>'.number_format($total_cmd, 2, ',', ' ')." €</td></tr></table>\n";
}
?>

Modifié par Heyoan (11 Sep 2008 - 05:09)
Ok, cette voici c'est bon.
je te remercie infiniment pour ton aide, je vais utiliser ta solution.

c'etait pour depanner un ami sur son vieux site et tu m'as sauver.

Encore merci
@+