Page 1 sur 1

Problème, requete, while, boucle, variable ??

Posté : 22 avr. 2009, 15:40
par karty
Bonjour,

je me retrouve face à un petit problème et j'aurais si possible besoin de votre aide pour trouver une solution à celui-ci... Je vous explique :

J'ai une base de données avec notement 2 tables :
- commande
- details

Quand un acheteur passe une commande sur mon site (c'est théorique, je ne monte pas une boutique, j'apprends !) la commande sera inscrite dans la table commande et les produits de cette commande seront affichés dans la table détails avec la référence de la commande.

Une fois que le client aura payé, un email automatique et indépendant devra partir pour lui confirmer sa commande, et c'est la que le problème se pose.

Pour récupérer la commande, pas de problème il n'y en a qu'une, donc je peux enregistrer les variables de cette façon :

Code : Tout sélectionner

//sélection de la réservation $result = mysql_query("SELECT * FROM commande WHERE email = '$email' AND timestamp = '$order'"); while ($row = mysql_fetch_array ($result) ) { $idcommande = $row['id'] ; $prixcommande = $row['prix'] ; etc... }
Sauf que pour la table details, je vais avoir plusieurs produits à récupérer, et donc ma boucle while va bouclé à plusieurs reprises (produit1, produit2, etc...). Comment récupérer les données de ces produits (id, prix, etc...), car si un simple echo aurait fonctionné en temps normal pour afficher tout celà, ici je dois récupérer celà sous forme de variable pour les intégrer dans ma variable message de l'envoi d'email, et là je bloque ??!

Quelqu'un pour m'aider à trouver une solution ?? ou à m'orienter vers une piste ??? :?


Merci d'avance ! a+ karty

Posté : 22 avr. 2009, 16:03
par zazadec
Dans ta boucle, tu crée un tableau Array ou tu y incrémentes les détails de tes produits.
(Je sais c'est simple à dire)

Posté : 22 avr. 2009, 16:03
par dunbar
Peut-être introduire à chaque commande un id pour celle-ci ce qui te permettrais facilement de récupérer les détail d'une commande.
where id = '".$id_detail_commande."'
Donc en gros à chaque commande tu créer un id unique par commande

Posté : 22 avr. 2009, 16:12
par karty
Merci dunbar, il y a bien un id unique dans la table commande, et je souhaite d'ailleurs récupérer les produits de la table details grâce à ce champ, comme ça je n'ai effectivement plus qu'à ressortir les produits notés sous l'id de cette commande.

Le problème, c'est qu'avec ma boucle while, je vais affiché plusieurs produits dans ma requete, et j'ai besoin de les récupérer tous en variable, par exemple :

- Quand ca va bouclé sur le produit 1, je veux récupérer en variable son prix, son id, sa quantité
- Quand ca va bouclé sur le produit 2, même chose... et ainsi de suite automatiquement...

Hors comment faire celà en terme de variable ou de tableau ?? Car si je note une variable dans ma boucle while, seul le dernier produit sera enregistré ??

Je viens de tester les tableaux, comme ce que m'a dit zazadec, mais ça ne change rien dans ce que je fais voici le code testé :

Code : Tout sélectionner

//sélection de la réservation $result = mysql_query("SELECT * FROM details WHERE email = '$email' AND timestamp = '$order' AND id = '$idcommande' "); while ($row = mysql_fetch_array ($result) ) { [b]$arr = array("table" => array(1 => $row['produit'], 2 => $row['quantite'], 3 => $row['prix']) );[/b] }
En testant un echo de la sorte :

Code : Tout sélectionner

[b]echo $arr["table"][1];[/b]
Je n'aurais finalement que récupérer un seul produit, parmi la liste, comme avec une boucle while en fait. Même problème !

En fait il faudrait faire le même tableau, dans le sens inverse, et avec un chiffre infini, mais je ne sais pas comment faire ?? :(

Posté : 22 avr. 2009, 16:57
par dunbar
Peut-être quelque chose du genre.
$id = array(); //-->Déclaration du tableau.
$prix = array(); //-->Déclaration du tableau.

                  while ($row = mysql_fetch_array ($result) )
                  {
                           $idcommande = $row['id'] ;
                           $prixcommande = $row['prix'] ;


                        array_push($id,$idcommande); //-->Remplir le tableau
                        array_push($prix,$prixcommande); //-->Remplir le tableau

                  }

                  $n = count($id);//-->On compte le nombre d'élément du tableau pour $i


                  for ($i=0; $i<$n; $i++) {

                  $commandeid = $id[$i];
                  $commandeprix = $prix[$i];

                  echo $commandeid.'+++++'.$commandeprix.'<br>';


                  }

Posté : 22 avr. 2009, 17:14
par karty
Merci beaucoup, mais en fait j'ai toujours un problème...


C'est que je dois utiliser la fonction : mail($to,$sujet,$message,$from);

Donc d'après ce que tu marques, je dois remplacer la formule echo par quelque chose, car je ne veux pas faire un echo sur ma page, mais bien intégrer ces valeurs dans ma variable $message pour envoi ensuite l'email contenant le récapitulatif de transaction.

Que faire ? :?

Posté : 22 avr. 2009, 17:37
par dunbar
Comme je suis de bonne humeur :wink:
 while ($row = mysql_fetch_array ($result) )
                  {
                           $idcommande = $row['id'] ;
                           $prixcommande = $row['prix'] ;


                        array_push($id,$idcommande);
                        array_push($prix,$prixcommande);

                  }



     $n = count($id);//-->On compte le nombre d'élément du tableau

    //-->Paramètre du mail.

    $vendeur = 'Ici le vendeur';
    $mail = 'mail de l\'expéditeur';
    $mailCache = 'copie caché';
    $nom = 'Nom du client';      
    $email_dest = 'mail du destinataire du message';




     $headers  ='From: '.$vendeur.'<'.$mail.'>'."\n";                 //----> Mail de l'expiditeur<-----//
     $headers .='Bcc:'.$mailCache."\n";                               //----> Copie caché <-----//
     $headers .='cc:'.$mailCopy."\n";                                 //----> Copie Mail <-----//
     $headers .='Disposition-Notification-To:'.$mail."\n";            //----> Notification de lecture <----//
     $headers .='Content-type: text/plain; charset=iso-8859-1'."\n";  //----> Type d'encodage du mail <----//
     $headers .='Content-Transfer-Encoding: 8bit'."\n";               //----> Niveau de crytage du mail <---//
     $headers .='X-MSMail-Priority: Normal'."\n";                     //----> Niveau de priorité du mail <---//
     $headers .='X-Originating-IP: [0.0.0.0]'."\n";                   //----> Adresse IP de l'expéditeur <---//

     $objet    = 'Votre commande .';
     $contenu  = 'Bonjour '.$nom."\n\n".//--> Le client.
                 'Vous trouverez ci-joint le détail de votre commande. '."\n\n".
                 '++++++++++++++++++++++++++++++++++++++++++++++++++++++'."\n";
                 for ($i=0; $i<$n; $i++)
                    {
                    	$contenu  .= 'Article: '.$id[$i].' pièce(s).'."\n";
                                $contenu  .='Article: '.$prix[$i].' pièce(s)'."\n";

                    }
    $contenu  .= '++++++++++++++++++++++++++++++++++++++++++++++++++++++'."\n\n".
                 'En cas de difficulté(s), pourriez-vous prendre contact avec '.$vendeur.'.'."\n\n".

                 'Cordialement '.$vendeur."\n";

	             if(mail($email_dest,$objet,$contenu,$headers))

	      {

          echo '<center><p> Envoi réussi</p>';

          }
     else
          {
          echo 'Le mail n\'a pu être envoyé';
          }

Posté : 22 avr. 2009, 17:59
par GiorgioLino
Je n'ai pas bien compris pourquoi tu ne récupérais qu'une ligne de produit. En tout cas en rajoutant quelques lignes à ton code, tu peux rentrer les valeurs dans un tableau à deux dimensions. Par la suite tu te serviras de ce tableau pour en afficher les valeurs qu'il te faut. Ce n'est pas idéal comme façon de procéder mais en attendant mieux, ça fonctionne.

voici le code en question :
	$ligne_commande = array();	// tableau stockant les infos de commande pour un produit 
	$tab_commande = array();	// tableau stockant les lignes de commandes

	//sélection de la réservation
	$result = mysql_query("SELECT * FROM details WHERE email = '$email' AND timestamp = '$order' AND id = '$idcommande' ");
	while ($row = mysql_fetch_array ($result) )
	{
		$ligne_commande = array($row['produit'],$row['quantite'],$row['prix']);
		array_push($tab_commande, $ligne_commande);                 
	}

Pour parcourir le tableau et afficher les valeurs, tu peux faire deux boucles imbriquées comme ceci :
$max_row = count($test)	;	 //nombre de lignes de commande.

for( $i=0 ;$i< $max_row; $i++ )
{
    $max_col = count($test[$i]);       //nombre d'éléments/colonnes récupérés par ligne de commande
    
    for($j=0;$j<$max_col;$j++){
      echo $test[$i][$j] . " " ;
    }
    echo '<br />';
}

A toi d'optimiser ou de remanier selon tes besoins.

Sayonara.