Problème de requète qui ne retourne rien [Résolu]

Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
-
Bonjour,
lorsque j'exécute ma requête elle ne donne rien dans le code comme en directe
voici mon code :
      $sql = "SELECT DISTINCT S.id_pros
,ART.*
,SUM(S.qte) AS arrive
,SUM(S.qte) - (ART.vendu) AS diff
FROM stocks S
,(SELECT
A.article,
A.id_prod
,SUM(A.qte) as vendu
FROM destocks A
GROUP BY A.id_prod) ART
WHERE(ART.id_prod = S.id_pros) AND
$critere
GROUP BY S.id_pros
";
NB : ma date a un format de 12/05/2014

voici le code de $critere
                // on récupère les critères sélectionnés
                extract($_POST); 
    print_r($_POST);

                $i = 0;
         
                // si la variable est présente, on lui affecte une place dans le tableau 'choix[]', qui nous servira ensuite à construire le WHERE de la requête.
                if(!empty($date_debut)) { 
       //RECUPERATION DE LA DATE DE DEBUT
      $date_debuts = explode("/",$date_debut);
      $jour_debut = $date_debuts[0];
      $mois_debut = $date_debuts[1];
      $annee_debut = $date_debuts[2];
         $choix[$i++] = "DAY(date) >= '$jour_debut'"; 
    }
                if(!empty($date_fin)) { 
      //RECUPERATION DE LA DATE DE DEBUT
      $date_fins = explode("/",$date_fin);
      $jour_fin = $date_fins[0];
      $mois_fin = $date_fins[1];
      $annee_fin = $date_fins[2];
         $choix[$i++] = "DAY(date) >= '$jour_fin'";
    
    }

                // etc... tu fais pareil pour chaque critère

                // on insère les éléments remplis dans une variable $critere, en commençant par la première occurrence, puis on boucle
                $critere = $choix[0]." ";
         
               // for($j=1;$j<$i;$j++)
                //{
                    //    $critere .= " AND ".$choix[$j]." ";
      
               // }
                $critere = implode( " AND " , $choix);
Afficher la suite 

Votre réponse

5 réponses

Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
0
Merci
Bonjour Msi;

Déjà... il faudrait que tu nous donnes un exemple de requête GENEREE (c'est à dire après en avoir fait un ECHO sur ta page PHP).

Ensuite... quand tu dis :
NB : ma date a un format de 12/05/2014
Tu parles de la date $date_debut .... ou de la date dans ta BDD ??

- De quel type est le champ qui contient tes dates ?
Il est bien au format DATETIME ou TIMESTAMP ? ( par Varchar ni Text j'espère ! )



jordane45
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Ah .. et au passage ....
lorsque j'exécute ma requête elle ne donne rien dans le code comme en directe

SI ton souci concerne ...non pas le code PHP ... mais ta REQUETE .... POURQUOI CONTINUES TU A POSTER DANS LA SECTION PHP DU FORUM ?????????!!!!!!!!!!
Il y a une section SQL qui sert aux problèmes de requêtes !!!!
....ça fait déjà 50 fois que je te le dis..... tu n'avais pas lu les précédentes fois ou bien tu t'en moques de ce qu'on te dit ????
msi79
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
-
la patie $critere est en php
jordane45
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Oui $critere est en PHP... mais ta requête... qui ne retourne rien en direct dans ta BDD... tu ne l'écris pas avec le $critere.... tu testes la requête GENEREE dans ta page PHP... celle que tu récupère après en avoir fais un ECHO ....... donc... c'est bien la requête qui n'est pas bonne non ????
msi79
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
-
c'est pas faux
Commenter la réponse de jordane45
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
0
Merci
1- jj/mm/yy est le format de mes date dans la BDD.
2- voici ce que donne mes print et echo
Array ( [date_debut] => 25/06/2014 [date_fin] => 03/07/2014 [Submit] => Rechercher >> ) DAY(date) >= '25' AND DAY(date) >= '03'
La requête est :
SELECT DISTINCT S.id_pros ,ART.* ,SUM(S.qte) AS arrive ,SUM(S.qte) - (ART.vendu) AS diff 
FROM stocks S 
,(SELECT A.article, A.id_prod ,SUM(A.qte) as vendu 
FROM destocks A GROUP BY A.id_prod) ART 
WHERE(ART.id_prod = S.id_pros) 
AND DAY(date) >= '25' 
AND DAY(date) >= '03' 
GROUP BY S.id_pros


EDIT : Ajout des balises de code !!!
Commenter la réponse de msi79
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
0
Merci
jj/mm/yy est le format de mes date dans la BDD.

DONC ....... ton champ n'est pas un FORMAT date ... mais un Champ de type TEXTE ou VARCHAR ???
Tu ne pourras donc pas t'en sortir comme ça...
(je te l'avais déjà fait remarqué dans une précédente discussion).

Il faut... que dans ta BDD ... tu stockes tes dates ... dans une colonne de type......suspense........... =>>>>> DATE !
http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-types.html


mpmp93
Messages postés
6711
Date d'inscription
mercredi 13 avril 2011
Dernière intervention
28 septembre 2015
-
Bonjour,

Cite: "Il faut... que dans ta BDD ... tu stockes tes dates ... dans une colonne de type......suspense........... =>>>>> DATE ! "

Tout à fait. Je confirme. Il est important de stocker au format AAAA-MM-JJ qui est le type DATE.

MySQL utilise des fonctions particulières pour traiter ces données de type DATE dont on ne dispose pas si on est en mode texte JJ/MM/AAAA.

Je constate, en suivant la discussion que MSI79 veut faire du SQL de haut vol (SELECT dans un SELECT) alors qu'il ne maîtrise pas même le typage des données. Pour moi - à mon sens - et sans vouloir être offensant, est quand même la base de la gestion de données avant de s'attaquer aux requêtes SQL

Je programme en PHP/SQL depuis que PHP existe. ET je peux dire que sur des applications professionnelles lourdes on ne s'embête pas autant que MSI79 avec des requêtes compliquées comme il essaye de faire.

Pour traiter les dates en sortie à partir de données au format AAAA-MM-JJ j'utilise ce qu'on appelle des "helpers":

<?php
class Zend_View_Helper_DateSqlToFr extends Zend_View_Helper_Abstract
{

    private $listeMois = array(
        '01' => 'janvier',      '02' => 'février',      '03' => 'mars',         
        '04' => 'avril',        '05' => 'mai',          '06' => 'juin',
        '07' => 'juillet',      '08' => 'août',         '09' => 'septembre',
        '10' => 'octobre',      '11' => 'novembre',     '12' => 'décembre',
    );

    public function dateSqlToFr($dateSql, $format='JJ/MM/AAAA') {
        $Date = new Zend_Date($dateSql, Zend_Date::ISO_8601);
        
        $jourSemaine = $Date->get(Zend_Date::WEEKDAY);
        $jour   = $Date->get(Zend_Date::DAY);
        $mois   = $Date->get(Zend_Date::MONTH);
        $annee  = $Date->get(Zend_Date::YEAR);
        
        if($format=='JJ/MM/AAAA') {
            return $jour.'/'.$mois.'/'.$annee;
        } else if($format=='JJ mmm') {
            return $jour.' '.$this->listeMois[$mois];
        } else if($format=='JJ mmm AAAA') {
            return $jour.' '.$this->listeMois[$mois].' '.$annee;
        } else if($format=='JS JJ mmm AAAA') {
            return $jourSemaine.' '.$jour.' '.$this->listeMois[$mois].' '.$annee;
        }
        // valeur de retour par défaut
        return $dateSql;
    }

}


et dans la vue, pour afficher une date:

<?php echo $this->dateSqlToFr($sortie['date_debut'], 'JS JJ mmm AAAA'); ?>


En injectant une date 2014-09-30 j'aurai à l'affichage:
mardi 9 septembre 2014

Je sais c'est un peu hors sujet, mais c'est pour montrer à MIS79 l'importance de gérer ses dates de manière homogène en base de données, donc au format DATE et aucun autre format de données pour les dates. Le travail de mise en forme doit être réalisé en aval au moment d'afficher la date.

Pour son problème de SQL, au vu de la seule requête et sans avoir les données sous les doigts du clavier, je ne peux apporter de réponse satisfaisante.

A+
jordane45
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Là... avec tes framework (Zend..) et tes histoires de Helper.. tu vas nous le perdre le MSI....

Pour résumer :
- Une base de données... sert à stocker... des données... (sans se soucier de l'utilisation qu'on en fera ni le format...)
=> Un peu comme EXCEL qui stocke les date sous forme de nombre (integer)... et ensuite.. c'est l'interface qui gère l'affichage en format de date "commune"....

- Pas besoin de Helper.. une simple fonction PHP fait l'affaire pour convertir une date DATE ou DATETIME en Date FR
par exemple un truc du genre :
  function ConvDateFR($strDate,$format=null){
// Converti une Date au format : YYYY-MM-DD HH:MM:SS
// au format Français : jj/mm/AAAA HH:MM:SS
// si $format .. retourne DATE + HEURE
// sinon.. ne retourne QUE la date
    if($strDate){   
        $expDate=explode(' ',$strDate);
        $D=explode('-',$expDate[0]);
	    $H=explode(':',$expDate[1]);
        if($expDate[0]=="0000-00-00"){
            return " ";
        }else{
            $DateFR=$D[2].'/'.$D[1].'/'.$D[0];
           if(!$format){
               return $DateFR; 
           }else{
              return $DateFR." ".$H[0].':'.$H[1].':'.$H[2];    
           }
        }
      }
 }  

Et pour l'utiliser :
<?php echo ConvDateFR($sortie['date_debut'],True); ?>
// Affiche sour la forme : jj/mm/AAAA HH:MM:SS


Pour en revenir à SES différentes questions... Le format DATE ou DATETIME (ou TIMESTAMP éventuellement) est totalement NÉCESSAIRE !
Et sela peut aussi expliquer des éventuelles lenteurs... surtout si il essaye de filtrer dans son WHERE sur ces champs de date au format 'text'...

Je constate, en suivant la discussion que MSI79 veut faire du SQL de haut vol (SELECT dans un SELECT) alors qu'il ne maîtrise pas même le typage des données
Ca...ça doit surement venir de moi (ou d'un autre membre) lors d'une précédente question...
Commenter la réponse de jordane45
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
0
Merci
je changé le type du champ date en date dans ma BDD.
mais ma question reste posée. ma requête qui contient
$critere 
ne fonctionne pas . elle ne m'affiche rien.
est-ce que j'utilise bien
$critere
mpmp93
Messages postés
6711
Date d'inscription
mercredi 13 avril 2011
Dernière intervention
28 septembre 2015
-
Si vous changez le type du champ date en type DATE, votre date en base sera au format: AAAA-MM-JJ

Donc, votre code PHP:
$critere = "DAY(date) >= '$jour_debut'"; 


ne sera plus valable.

Admettons que vous vouliez sortir toutes les fiches supérieures à une certaines date, par exemple le 02/04/2014, voici comment faire:

$dateDebut = "02/04/2014"; // c'est pour l'exemple
$expDate=explode('/',$dateDeb );
// transformation $dateDebut au format AAAA-MM-JJ
$dateDebutSql = $expDate[2] . '-' . $expDate[1] . '-' . $expDate[0];
$critere = "date >= ''$dateDebutSql";


A+
jordane45
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Si vous changez le type du champ date en type DATE, votre date en base sera au format: AAAA-MM-JJ
Pourquoi ?

DAY(date)>=25 ... retournera toutes les dates dont le JOUR est supérieur ou égal à 25 ... je ne vois pas où est le souci.

Maintenant.. oui c'est sûr.. ce n'est pas la meilleur solution... et ta solution (MPM93) est plus sûr. mais ça n'explique pas vraiment pourquoi sa requête ne retourne rien....


@MSI :
Pour trouver où se trouve ton souci.. il faut y aller par étapes...
Déjà.. que donne ( EN DIRECT DANS LA BDD) la requête :

SELECT DISTINCT S.id_pros ,ART.* 
    ,SUM(S.qte) AS arrive 
    ,SUM(S.qte) - (ART.vendu) AS diff 
    , DAY(date) as DDate
FROM stocks S 
,(SELECT A.article, A.id_prod ,SUM(A.qte) as vendu 
FROM destocks A GROUP BY A.id_prod) ART 
WHERE(ART.id_prod = S.id_pros) 
GROUP BY S.id_pros


Puis.. si tu as des résultats..
SELECT DISTINCT S.id_pros ,ART.*
     ,SUM(S.qte) AS arrive 
    ,SUM(S.qte) - (ART.vendu) AS diff 
    , DAY(date) as DDate
FROM stocks S 
,(SELECT A.article, A.id_prod ,SUM(A.qte) as vendu 
FROM destocks A GROUP BY A.id_prod) ART 
WHERE(ART.id_prod = S.id_pros) 
AND DAY(date) >= '03' 
GROUP BY S.id_pros
mpmp93
Messages postés
6711
Date d'inscription
mercredi 13 avril 2011
Dernière intervention
28 septembre 2015
-
Cite: "DAY(date)>=25 ... retournera toutes les dates dont le JOUR est supérieur ou égal à 25 ... je ne vois pas où est le souci. "

A mon sens, le souci est que $critere est mal géré. Dans certains cas on peut avoir une ambiguïté:

$critere = $choix[0]." ";
// .......[CUT]
$critere = implode( " AND " , $choix);


Admettons que la date_debut soit 25/04/2014 et date_fin soit 05/05/2014,

sauf erreur, si j'analyse le comportement de la construction de $critère, j'aurai:

var_dump($critere);

string "DAY(date) >= '25' AND DAY(date) >= '05'


Je pense que MSI7 9 voudrait sortir des fiches dont date est situé dans un intervalle de date.... En clair, il voudrait sortir les fiches datées entre 25/4 et 05/05 par exemple.

Voici un bout de code non testé qu'il pourrait utiliser, mais sous réserve que son champ date soit bien de type DATE dans sa base de données

function dateToSql($date) {
    $expDate=explode('/',$dateDeb );
    // transformation $dateDebut au format AAAA-MM-JJ
    return $expDate[2] . '-' . $expDate[1] . '-' . $expDate[0];
}


et plus loin, lors de la construction de $critere:

$critere = null;
if(!empty($date_debut) && empty($date_fin)) { 
       $critere = " date >= '".dateToSql($date_debut)."'"; 
} else if (!empty($date_debut) && !empty($date_fin)) {
       $critere = " date BETWEEN '"
                    . dateToSql($date_debut)."' AND '"
                    . dateToSql($date_fin)."' "; 
}


A+
Commenter la réponse de msi79
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
0
Merci
@jordane45 en direct quand je fais :
SELECT DISTINCT S.id_pros ,ART.* 
,SUM(S.qte) AS arrive
,SUM(S.qte) - (ART.vendu) AS diff
, DAY(date) as DDate
FROM stocks S
,(SELECT A.article, A.id_prod ,SUM(A.qte) as vendu
FROM destocks A GROUP BY A.id_prod) ART
WHERE(ART.id_prod = S.id_pros)
GROUP BY S.id_pros

voici ce que ça donne :


pour la deuxième requète :
SELECT DISTINCT S.id_pros ,ART.*
,SUM(S.qte) AS arrive
,SUM(S.qte) - (ART.vendu) AS diff
, DAY(date) as DDate
FROM stocks S
,(SELECT A.article, A.id_prod ,SUM(A.qte) as vendu
FROM destocks A GROUP BY A.id_prod) ART
WHERE(ART.id_prod = S.id_pros)
AND DAY(date) >= '03'
GROUP BY S.id_pros

j'ai :
MySQL a retourné un résultat vide (aucune ligne). ( Traitement en 0.0171 sec )
msi79
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
-
mon champ date se nomme date de type date
jordane45
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Le problème.. c'est que DATE est un mot clé réservé...
ALors deux choix :

1 - Tu renommes ton champ autrement.. (c'est le mieux)
2 - Tu entoures le nom de ton champ dans la requête par des QUOTES inversées... 'date'

=> Le choix 1 est le plus conseillé...
msi79
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
-
oui j'ai fai les changements et j'obtiens un resultat.
mais mon probleme reste le critère je veux recuperer les données entres 2 dates
jordane45
Messages postés
23592
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 décembre 2018
-
Et bien rien de plus simple...

Tu peux utiliser des AND ou BETWEEN

AND champ_date >= '2014-01-10'
AND champ_date <= '2014-08-20' 



AND champ_date BETWEEN '2014-01-10' AND  '2014-08-20' 



Mais ceci est une nouvelle question....
et ta question initiale : Ma REQUETE ne retourne rien... est résolue.... tu penseras donc à clôturer le sujet.
Merci.
msi79
Messages postés
458
Date d'inscription
lundi 24 août 2009
Dernière intervention
8 décembre 2018
-
merci
Commenter la réponse de msi79

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.