Problème d'inbricatation avec mes if

Problème d'inbricatation avec mes if - SQL/NoSQL - Programmation

Marsh Posté le 05-05-2009 à 08:16:52    

Bonjours,
 
Voilà j'ai un petit problème avec mon imbrication de if de plus mon code n'est pas des plus logique donc si quelqu'un pourrait me guider ver une solution plus efficace ce serait gentille.
 
Mon problème est le suivant je veu créer un formulaire ou l'on met deux dates on peu aussi en mettre qu'une ( date_du && date_au) si je mets juste date_du sa va m'affiché tou les renseignement après cette date, et si je me date_au sa me donne les resultats d'après. et si je mets les deu dates sa m'affiche ce qu'il y a entre c'est ce que j'ai fai mais j'ai toujours des problème si quelqu'un voit l'erreur ce serai gentille ou si quelqu'un pourrai me guidé ver une autre solution je le remerci  
 
je vous donne mon code qui est :
 

Code :
  1. <?php
  2. if (isset($date_du) && isset($date_au))
  3. {
  4.  $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  5.           COUNT(*) AS effectif_vg
  6.         FROM customers  inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id
  7.         WHERE customers_client='0'
  8.         AND customers_emv='0'
  9.         AND customers_seance ='0'
  10.         AND relances_gratuites_inscription_date>='" . $date_du . "' and  relances_gratuites_inscription_date<='" . $date_au . "'
  11.         GROUP BY Origin " );
  12.      $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  13.          COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  14.          AVG(co.commandes_montant) AS Mmc
  15.        FROM customers cu
  16.        INNER JOIN commandes co
  17.        ON cu.customers_id=co.customers_id
  18.        INNER JOIN relances_gratuites rg
  19.        ON cu.customers_id=rg.customers_id 
  20.        WHERE co.commandes_status='1'
  21.        AND rg.relances_gratuites_inscription_date>='" . $date_du . "' AND  rg.relances_gratuites_inscription_date<='" . $date_au . "' 
  22.        GROUP BY Origin ";
  23.  else if (isset($date_du) && $date_du != '')
  24.  {
  25.   $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  26.            COUNT(*) AS effectif_vg
  27.          FROM customers  inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id
  28.          WHERE customers_client='0'
  29.          AND customers_emv='0'
  30.          AND customers_seance ='0'
  31.          AND relances_gratuites_inscription_date>='" . $date_du . "'
  32.          GROUP BY Origin " );
  33.   $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  34.           COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  35.           AVG(co.commandes_montant) AS Mmc
  36.         FROM customers cu
  37.         INNER JOIN commandes co
  38.         ON cu.customers_id=co.customers_id
  39.         INNER JOIN relances_gratuites rg
  40.         ON cu.customers_id=rg.customers_id 
  41.         WHERE co.commandes_status='1'
  42.         AND rg.relances_gratuites_inscription_date>='" . $date_du . "' 
  43.         GROUP BY Origin" );
  44.  }
  45.  else (isset($date_au) && $date_au != '')
  46.  {
  47.   $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  48.            COUNT(*) AS effectif_vg
  49.          FROM customers  inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id
  50.          WHERE customers_client='0'
  51.          AND customers_emv='0'
  52.          AND customers_seance ='0'
  53.          AND relances_gratuites_inscription_date<='" . $date_au . "'
  54.          GROUP BY Origin " );
  55.   $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  56.           COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  57.           AVG(co.commandes_montant) AS Mmc
  58.         FROM customers cu
  59.         INNER JOIN commandes co
  60.         ON cu.customers_id=co.customers_id
  61.         INNER JOIN relances_gratuites rg
  62.         ON cu.customers_id=rg.customers_id 
  63.         WHERE co.commandes_status='1'
  64.         AND rg.relances_gratuites_inscription_date<='" . $date_au . "' 
  65.         GROUP BY Origin" );
  66.  }
  67. }
  68. ?>

Reply

Marsh Posté le 05-05-2009 à 08:16:52   

Reply

Marsh Posté le 05-05-2009 à 09:35:43    

je vien de remarqué que si j'enlève les else if et else sa m'enlève des messages d'erreur je comprend pas pourquoi??? normalement quant on fai des imbrication on met else if non???

Reply

Marsh Posté le 05-05-2009 à 09:41:53    

Sur le plan de la logique :
 
Il y a deux critères, donc 2 x 2 cas = 4 cas. Mais votre programme n'a que 3 if. Je ne sais pas si c'est normal de laisser tomber le quatrième cas.
 
Les deux critères sont testés en même temps. Il serait peut-être plus simple de les tester séparément :

if (isset($date_du)) {
  if (isset($date_au)) {
  }
  else {
  }
}
else {
  if (isset($date_au)) {
  }
  else {
  }
}

En regardant le code, on s'aperçoit qu'il y a au moins un autre critère, if ($date_au != ''), et je suppose que l'on devrait aussi avoir if ($date_au != ''). Donc, il faudrait en fait avoir ceci :

if (isset($date_du) && $date_du != '') {
  if (isset($date_au)  && $date_au != '') {
  }
  else {
  }
}
else {
  if (isset($date_au)  && $date_au != '') {
  }
  else {
  }
}


Reply

Marsh Posté le 05-05-2009 à 10:16:03    

Merci pour tes éclaircissements, je suis dessus, mais je voulais comprendre pour le quatrième cas vue que mon premier cas est:  
date_du (à) date_au,  
mon deuxième est:
plus grand que date_du,
et mon troisième est:  
plus petit que date_au.
 
personnellement je vois pas la quatrième??

Reply

Marsh Posté le 05-05-2009 à 10:33:57    

voilà j'a retouché mon code comme celà mais c'est la quatrième condition qui me pose problème
 

Code :
  1. if (isset($date_du) && $date_du != '') {
  2.  if (isset($date_au)  && $date_au != '') {
  3.  $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  4.           COUNT(*) AS effectif_vg
  5.         FROM customers  inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id
  6.         WHERE customers_client='0'
  7.         AND customers_emv='0'
  8.         AND customers_seance ='0'
  9.         AND relances_gratuites_inscription_date>='" . $date_du . "' and  relances_gratuites_inscription_date<='" . $date_au . "'
  10.         GROUP BY Origin " );
  11.      $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  12.          COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  13.          AVG(co.commandes_montant) AS Mmc
  14.        FROM customers cu
  15.        INNER JOIN commandes co
  16.        ON cu.customers_id=co.customers_id
  17.        INNER JOIN relances_gratuites rg
  18.        ON cu.customers_id=rg.customers_id 
  19.        WHERE co.commandes_status='1'
  20.        AND rg.relances_gratuites_inscription_date>='" . $date_du . "' AND  rg.relances_gratuites_inscription_date<='" . $date_au . "' 
  21.        GROUP BY Origin " );
  22.  }
  23.  else {
  24.   $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  25.            COUNT(*) AS effectif_vg
  26.          FROM customers  inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id
  27.          WHERE customers_client='0'
  28.          AND customers_emv='0'
  29.          AND customers_seance ='0'
  30.          AND relances_gratuites_inscription_date>='" . $date_du . "'
  31.          GROUP BY Origin " );
  32.   $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  33.           COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  34.           AVG(co.commandes_montant) AS Mmc
  35.         FROM customers cu
  36.         INNER JOIN commandes co
  37.         ON cu.customers_id=co.customers_id
  38.         INNER JOIN relances_gratuites rg
  39.         ON cu.customers_id=rg.customers_id 
  40.         WHERE co.commandes_status='1'
  41.         AND rg.relances_gratuites_inscription_date>='" . $date_du . "' 
  42.         GROUP BY Origin" );
  43.  }
  44. }
  45.  else {
  46.   if (isset($date_au)  && $date_au != '') {
  47.  
  48.   $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  49.            COUNT(*) AS effectif_vg
  50.          FROM customers  inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id
  51.          WHERE customers_client='0'
  52.          AND customers_emv='0'
  53.          AND customers_seance ='0'
  54.          AND relances_gratuites_inscription_date<='" . $date_au . "'
  55.          GROUP BY Origin " );
  56.   $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  57.           COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  58.           AVG(co.commandes_montant) AS Mmc
  59.         FROM customers cu
  60.         INNER JOIN commandes co
  61.         ON cu.customers_id=co.customers_id
  62.         INNER JOIN relances_gratuites rg
  63.         ON cu.customers_id=rg.customers_id 
  64.         WHERE co.commandes_status='1'
  65.         AND rg.relances_gratuites_inscription_date<='" . $date_au . "' 
  66.         GROUP BY Origin" );
  67.            }
  68.      else {
  69.      
  70.      
  71.      
  72.         }
  73. }

Reply

Marsh Posté le 05-05-2009 à 11:07:04    

pour le dernier else j'ai mis : echo "Veuillez insérer une date valide";
 
c'est la seul chose qui ma paru logique, Merci de votre aide mais pourrai-je avoir la confirmation svp

Reply

Marsh Posté le 05-05-2009 à 11:08:07    

Le quatrième cas est celui où aucune date n'est renseignée, donc où il ne faudrait pas faire de restriction sur le dates dans la requête, pas de test sur les dates dans la clause Where. Mais peut-être que cela retournerait trop de lignes et qu'il ne faudrait pas avoir ce cas. Je ne sais pas.
Edit : Oui, le message est très bien.


Message édité par olivthill le 05-05-2009 à 11:08:35
Reply

Marsh Posté le 05-05-2009 à 11:10:00    

Et quelquechose comme ça :

Code :
  1. $condition = "";
  2. if (isset($date_du) && !empty($date_du)) {
  3.    $condition .= " AND rg.relances_gratuites_inscription_date>='" . $date_du . "' ";
  4. }
  5. if (isset($date_au) && !empty($date_au)) {
  6.    $condition .= " AND rg.relances_gratuites_inscription_date<='" . $date_au . "' ";
  7. }
  8. $query_vg = mysql_query("SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  9.                       COUNT(*) AS effectif_vg
  10.                        FROM customers c inner join relances_gratuites rg on c.customers_id=rg.customers_id
  11.                        WHERE customers_client='0'
  12.                        AND customers_emv='0'
  13.                        AND customers_seance ='0'
  14.                        " . $condition . "                        
  15.                        GROUP BY Origin " );
  16.  
  17. $query = mysql_query("SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin,
  18.                       COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
  19.                       AVG(co.commandes_montant) AS Mmc
  20.                        FROM customers cu
  21.                        INNER JOIN commandes co
  22.                        ON cu.customers_id=co.customers_id
  23.                        INNER JOIN relances_gratuites rg
  24.                        ON cu.customers_id=rg.customers_id
  25.                        WHERE co.commandes_status='1'
  26.                        " . $condition . "
  27.                        GROUP BY Origin " );


 
Ce ne serait pas plus simple !?
(Et encore, il est possible de faire, je suis allé vite :o)


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 05-05-2009 à 11:25:39    

Merci kao98,
 
tu dis qu'il est possible de faire mieu moi perso sa me va j'ai ce que je voulais et grace a toi j'ai découvert une façon très agréable et bien plus pratique qui me permet d'avoir les deux date ou juste une si elle est renseigné merci mille fois

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed