Jump to content

problème boucle dans une requète


Recommended Posts

Bonjour,

je suis nouveau sur le forum, j'ai un petit quelque chose qui me chagrine, je suis entrain de développer une classe qui permet de commander automatiquement les produits nécéssaires aux producteurs respectifs.

il s'agit donc d'un formulaire dans le backoffice avec :

- un numéro de commande de début :

- un numéro de commande de fin :

- une possibilité d'exclusion d'id_order (séparé par des ';')

- une possibilité de ne choisir de commander a 1 seul fournisseur grace a son id_supplier.

 

Le tout est traité pour être soit envoyé par mail, ou si le producteur ne travail pas par mail nous générons dans tout les cas un CSV avec les informations sur les commandes et leur fournisseur

 

Ce qui disfonctionne, c'est le cas ou l'utilisateur du backoff choisit d'envoyer les commandes d'une plage d'id_order (par exemple : numdeb = 150 ; numfin = 175)

et qu'il souhaite exclure par exemple les valeurs : 153;158;159;170;171

Pour les test j'ai mis a tous les producteurs mon adresse mail.

Je reçois le nombre de mail voulu : sur mes tests avec les exclusions choisis, je devais récupérer 2 mails (car 2 producteurs concernés par la plage de commande) ce qui est bien le cas ...

néanmoins dans le mail le tableau ne s'affiche pas ! je pense qu'il s'agit donc d'un soucis au niveau de la $req2 car c'est à ce moment là que les informations sont récupérés sur les commandes.

 

=>> pas d'information dans la requete =>> pas de tableau dans le mail !

 

Surtout que j'utilise la meme fonction mail pour gérer l'autre cas : c'est à dire le cas ou l'utilisateur choisi de ne transmettre les commandes que d'un seul producteur ! Cette partie du code fonctionne niquel (elle n'est pas présenté ici)

 

Mon code ressemble donc à cela :

// On compte le nombre de fournisseurs différents dans l'interval choisi
// On s'en reservira pour la boucle qui enverra le mail au fournisseur
$results = explode(";", $_POST['numOrderExclu']);
$req3 = 'SELECT DISTINCT (p.id_supplier), s.mail, s.name
  FROM '._DB_PREFIX_.'order_detail AS od, '._DB_PREFIX_.'product AS p, '._DB_PREFIX_.'supplier as s
  WHERE
  od.product_id = p.id_product
  AND p.id_supplier = s.id_supplier
  AND od.id_order >=  '.intval($numdeb).'
  AND od.id_order <=  '.intval($numfin);

 foreach($results as $result)
  // tant qu'il y a des valeurs dans le tableau des id_order exclus, on exclus l'id de la requète.
 {
   $req3 .= ' AND od.id_order != '.intval($result);
 }
	 $req3 .= ' AND p.id_supplier != 9
  AND p.id_supplier != 10
  AND p.id_supplier != 11
  AND p.id_supplier != 12
  AND od.product_name != "Boite Isotherme consignée"
  AND od.product_name != "SMS de suivi de commande"
  ORDER BY 1 ASC';
 $res_sql3 = Db::getInstance()->ExecuteS($req3);
 $nbsupplier = count($res_sql3); // Contient le nombre de fournisseurs diff�rents
 // Fin du comptage des fournisseurs


 foreach($res_sql3 as $r3)
 {

  // On r�cup�re les NOMS de produits et les QUANTITES, qu'on REGROUPE ensuite par FOURNISSEURS
  $req2='SELECT  od.product_name, SUM( od.product_quantity ) AS product_quantity , p.id_supplier
   FROM '._DB_PREFIX_.'order_detail AS od, '._DB_PREFIX_.'product AS p
   WHERE od.product_id = p.id_product
   AND od.id_order >=  '.intval($numdeb).'
   AND od.id_order <=  '.intval($numfin);
	// on stock les numéros de commande exclus dans un tableau

   foreach($results as $result)
    // tant qu'il y a des valeurs dans le tableau des id_order exclus, on exclus l'id de la requète.
   {
   $req2 .= 'AND od.id_order != '.intval($result);
   }
  $req2 .= 'AND p.id_supplier = $r3[\'id_supplier\']
   AND p.id_supplier != 9
	  AND p.id_supplier != 10
   AND p.id_supplier != 11
   AND p.id_supplier != 12
   AND od.product_name != "Boite Isotherme"
   AND od.product_name != "SMS de suivi de commande"
   GROUP BY 1
   ORDER BY  3';

  $res_sql2= Db::getInstance()->ExecuteS($req2);

 {
 // mail
  $to = $r3['mail'];

  $subject = 'Commande Parole de Fermiers' ;
  $body = '<HTML>
  <HEAD>
  </HEAD>
  <BODY>
  <p> Bonjour ';
  $body = $body . $r3['name'] . ' ---- ' . $r3['id_supplier']  ;
  $body = $body . ', parole de fermiers souhaite commander des produits de votre production. En voici la liste : <br /><br />
  <div width="800">
  <center>
  <table border="1" cellspacing="0" cellpadding="15">';
 foreach($res_sql2 as $r2)
 {
  $body = $body . '<tr><td>';
  $body = $body . $r2['product_name'];
  $body = $body . '</td><td>' ;
  $body = $body . $r2['product_quantity']  ;
  $body = $body . '</td><tr>' ;
 }
  $body = $body .
  '</table>
  </center>
  </div>
  </BODY>
  </HTML>' ;
  $headers  = 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; ;
	  mail($to, $subject, $body , $headers);

 }

}

 

n'hesitez pas a demander des précisions.

 

En vous remerciant chaleureusement par avance.

Link to comment
Share on other sites

Salut,

tu devrais peut être respecté un peu plus lcertaines choses par exemple :

1- au lieu de mettre $_POST['machin'] utilise Tools::getValue('machin')

2- $req2 .= 'AND p.id_supplier = $r3[\'id_supplier\'] me gène un peu, met plutot $req2 .= 'AND p.id_supplier = '.$r3['id_supplier'].'

3- au lieu de mettre $body = $body . 'machin'; met $body .= 'machin';

4- au lieu de intval($result) met (int)$result

5- ça ne me plais pas trop : GROUP BY 1 et ORDER BY 3

6- FROM '._DB_PREFIX_.'order_detail AS od, '._DB_PREFIX_.'product AS p faudrait peut être précisé INNER JOIN... exemple : FROM '._DB_PREFIX_.'order_detail od INNER JOIN '._DB_PREFIX_.'product p ON (p.un_champ = od.un_autre_champ)

7- met des ` (ALT+7, 2 fois si ça n’affiche rien)autours des noms dans les requêtes SQL : FROM `'._DB_PREFIX_.'order_detail` od INNER JOIN `'._DB_PREFIX_.'product` p ON (p.`un_champ` = od.`un_autre_champ`)

Link to comment
Share on other sites

Bon j'ai respecté les consignes, et me voila avec une erreur intéressante en activant le debug sql.

 

il me dit : 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 '` = `p.id_product` AND `s.id_supplier` = `p.id_supplier` AND `od.id' at line 3

SELECT DISTINCT (`p.id_supplier`), `s.mail`, `s.name`
FROM `ps_supplier` AS s, `ps_order_detail` AS od, `ps_product` AS p
WHERE `od.product_id` = `p.id_product`
AND `s.id_supplier` = `p.id_supplier`
AND `od.id_order` >=  151
AND `od.id_order` <=  165
AND `od.id_order` != 152
AND `od.id_order` != 153
AND `od.id_order` != 154
AND `od.id_order` != 155
AND `od.id_order` != 156
AND `od.id_order` != 157
AND `od.id_order` != 158
AND `od.id_order` != 159
AND `od.id_order` != 160
AND `od.id_order` != 161
AND `od.id_order` != 162
AND `od.id_order` != 163
AND `p.id_supplier` != 9
AND `p.id_supplier` != 10
AND `p.id_supplier` != 11
AND `p.id_supplier` != 12
AND `od.product_name` != "Boite Isotherme consignée"
AND `od.product_name` != "SMS de suivi de commande"

 

Je n'ai pas trop l'habitude avec le INNER JOIN , j'aimerais lier tout cela grace a un INNER JOIN ! Comment faire avec 3 tables ? :

FROM `ps_supplier` AS s, `ps_order_detail` AS od, `ps_product` AS p
WHERE `od.product_id` = `p.id_product`
AND `s.id_supplier` = `p.id_supplier`

 

merci

Link to comment
Share on other sites

au lieu de mettre `od.product_id` met plutot od.`product_id` , il faut faire les changement partout évidemment

 

http://sqlpro.developpez.com/cours/sqlaz/jointures/

 

j'ai mis des exemples dans mon précédent post :

 

FROM `'._DB_PREFIX_.'table1` t1

INNER JOIN `'._DB_PREFIX_.'table2` t2 ON (t2.`un_champ_de_t2` = t1.`un_champ_de_t1`)

INNER JOIN `'._DB_PREFIX_.'table3` t3 ON (t3.`un_champ_de_t3` = t2.`un_champ_de_t2`)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...