IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQL] Problème de requête


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut [SQL] Problème de requête
    Bonjour

    j'ai un problème dans ma fonction, lorsque je teste la requête SQL, elle fonctionne correctement, mais dans ma fonction, rien ne s'affiche, pouvez-vous m'aider et me dire ce qui ne va pas ? Merci

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function datesqlcategory($catego, $date1, $date2){
    	$sql = mysql_query("SELECT avg( a.delai )
    FROM (
     
    SELECT id, category, DATEDIFF( closedate, date ) AS delai
    FROM glpi_tracking
    WHERE ( date
    BETWEEN '$date1%'
    AND '$date2%' )
    AND (
     
    STATUS = 'old_done'
    AND category = '%$catego'
    )
    ) AS a
    GROUP BY category");
    	$req = mysql_fetch_row($sql) or die ("Non cloturé ".mysql_error()); 
    	echo "<td>".$req[0]."</td>";

  2. #2
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    Je l'aurais écrit comme ca :
    ( mettre la requête dans un variable fait un peu plus propre je trouve )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    $query = ' SELECT avg( a.delai ) '.
    ' FROM ( '.
    ' SELECT id, category, DATEDIFF( closedate, date ) AS delai '.
    ' FROM glpi_tracking '.
    ' WHERE ( date '.
    ' BETWEEN "'.$date1.'%" '.
    ' AND "'.$date2'%" ) '.
    ' AND ('.
    ' STATUS = "old_done" '.
    ' AND category = "%'.$catego.'" '.
    ' ) '.
    ' ) AS a '.
    'GROUP BY category';
    //echo $query; // Ca aide toujours à voir ce qui peut cloquer dans la requête
    $sql = mysql_query($query);
    $req = mysql_fetch_row($sql) or die ("Non cloturé ".mysql_error());
    echo "<td>".$req[0]."</td>";
    Est-ce mieux ?

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Ca n'affiche toujours rien,
    j'ai décommenter //echo $query, j'obtiens ça :

    SELECT avg( a.delai ) FROM ( SELECT id, category, DATEDIFF( closedate, date ) AS delai FROM glpi_tracking WHERE ( date BETWEEN "2006-12-01%" AND "2006-12-01%" ) AND ( STATUS = "old_done" AND category = "6" ) ) AS a GROUP BY category

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    salut
    En plaçant un mysql_error sur l'execution de la requête, ça renvoie quelque chose ?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = mysql_query($query) or die (" erreur : ".mysql_error());

    edit : koo
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Remplaces ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = mysql_query($query);
    $req = mysql_fetch_row($sql) or die ("Non cloturé ".mysql_error());
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = mysql_query($query)or die ("Non cloturé ".mysql_error());
    $req = mysql_fetch_row($sql);
    pour vérifier que ton mysql_query() se passe bien.

    Sinon, tu es sur que SELECT * FROM ( autre requete) est valable en SQL ? Dans mes lointains souvenirs il fallait utiliser IN pour utiliser des requetes imbriquées (mais ca a peut etre changé depuis, je demande au cas où).

    EDIT : Celira ^^, grillé again!

  6. #6
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par koopajah
    Remplaces ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = mysql_query($query);
    $req = mysql_fetch_row($sql) or die ("Non cloturé ".mysql_error());
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = mysql_query($query)or die ("Non cloturé ".mysql_error());
    $req = mysql_fetch_row($sql);
    J'ai fait ta modif, alors là rien ne s'affiche mais le code continue de s'afficher pour le reste (il y a des espaces vides certes, mais le reste s'affiche alors qu'avant, ça bloquait aux espaces vides)

  7. #7
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    Citation Envoyé par eduardosan
    SELECT avg( a.delai ) FROM ( SELECT id, category, DATEDIFF( closedate, date ) AS delai FROM glpi_tracking WHERE ( date BETWEEN "2006-12-01%" AND "2006-12-01%" ) AND ( STATUS = "old_done" AND category = "6" ) ) AS a GROUP BY category
    Est-ce la requête que tu voulais, si tu l'avais écrit sur papier ?
    Et si tu as la possibilité de lancer la requête sql avec un phpmyadmin ( ou par un autre moyen ) pour voir ce qu'il peut en ressortir.

  8. #8
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Ca veut dire que ta requete est bien formée du point de vue de SQL. Par contre je viens de m'apercevoir que tu utilises BETWEEN en SQL avec des % dans la valeur. Les % sont utilisés pour le LIKE, il ne faut pas les mettre pour le BETWEEN a mon avis c'est pour ca que tu n'as aucun résultat qui revient de ta requête, et ca me surprend qu'elle marche dans ton phpmyAdmin ou autre frontal SQL.

    en plus pourquoi passer par un FROM() au lieu de ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, category, AVG(DATEDIFF( closedate, date )) AS delai FROM glpi_tracking WHERE ( date BETWEEN "2006-12-01%" AND "2006-12-01%" ) AND ( STATUS = "old_done" AND category = "6" ) ) AS a GROUP BY category

  9. #9
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par francoisIT
    Est-ce la requête que tu voulais, si tu l'avais écrit sur papier ?
    Et si tu as la possibilité de lancer la requête sql avec un phpmyadmin ( ou par un autre moyen ) pour voir ce qu'il peut en ressortir.
    La requête sous phpmyadmin fonctionne, mais une fois dans ma fonction plus rien, je ne vois pas le problème pourtant

  10. #10
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par koopajah
    Ca veut dire que ta requete est bien formée du point de vue de SQL. Par contre je viens de m'apercevoir que tu utilises BETWEEN en SQL avec des % dans la valeur. Les % sont utilisés pour le LIKE, il ne faut pas les mettre pour le BETWEEN a mon avis c'est pour ca que tu n'as aucun résultat qui revient de ta requête, et ca me surprend qu'elle marche dans ton phpmyAdmin ou autre frontal SQL.
    Tu mets donc quoi à la place des % pour le BETWEEN ?

  11. #11
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Ben rien, tu mets pas de % pour un between!

    J'aurai fait ca clairement moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, category, AVG(DATEDIFF( closedate, date )) AS delai FROM glpi_tracking WHERE date >= "2006-12-01" AND  date <= "2006-12-01" AND STATUS = "old_done" AND category = "6" GROUP BY category
    EDIT : autant pour moi, ton jour est le meme pour le début et la fin de la période.
    Est-ce toujours le cas?

  12. #12
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par koopajah
    Ben rien, tu mets pas de % pour un between!

    J'aurai fait ca clairement moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, category, AVG(DATEDIFF( closedate, date )) AS delai FROM glpi_tracking WHERE date >= "2006-12-01" AND  date <= "2006-12-01" AND STATUS = "old_done" AND category = "6" GROUP BY category
    Oui mais dans ma table, la valeur est 2006-12-01 00:00:00 (l'heure)
    et je n'ai pas envi de demander aux gens de taper l'heure

  13. #13
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par koopajah
    Ben rien, tu mets pas de % pour un between!

    J'aurai fait ca clairement moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, category, AVG(DATEDIFF( closedate, date )) AS delai FROM glpi_tracking WHERE date >= "2006-12-01" AND  date <= "2006-12-01" AND STATUS = "old_done" AND category = "6" GROUP BY category
    EDIT : autant pour moi, ton jour est le meme pour le début et la fin de la période.
    Est-ce toujours le cas?
    Non le 1er est 1 et le 2e 31, j'ai fait une erreur de copie

  14. #14
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Dans ce cas ma requete marcherait, mais dans tous les cas, voila une modif qui fonctionnerait pour le cas où la date de début est la meme que la date de fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, category, AVG(DATEDIFF( closedate, date )) AS delai FROM glpi_tracking WHERE DATE_FORMAT(date,'%Y-%m-%d') >= "2006-12-01" AND  DATE_FORMAT(date,'%Y-%m-%d') <= "2006-12-01" AND STATUS = "old_done" AND category = "6" GROUP BY category
    Le fait d'utiliser >= et <= permet de gérer toutes les heures en fait, mais faut quand meme utiliser la dernière version de ma requête pour que ca marche

  15. #15
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    Chose très bête, tu te connectes bien à mysql avant de lancer ta fonction ? (Je me permet de te poser la question car parfois ca m'arrive de l'oublier )

  16. #16
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par francoisIT
    Chose très bête, tu te connectes bien à mysql avant de lancer ta fonction ? (Je me permet de te poser la question car parfois ca m'arrive de l'oublier )
    Oui bien sur, j'ai déjà fait l'erreur mais plus maintenant

  17. #17
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Est ce que tu as testé la simplification de la requete et l'utilisation du DATE_FORMAT() comme dit dans mon message précédent?

  18. #18
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Citation Envoyé par koopajah
    Est ce que tu as testé la simplification de la requete et l'utilisation du DATE_FORMAT() comme dit dans mon message précédent?

    Voici ma fonction complète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    function datesqlcategory($catego, $date1, $date2){
    $query = ' SELECT avg( a.delai ) '.
    ' FROM ( '.
    ' SELECT id, category, DATEDIFF( closedate, date ) AS delai '.
    ' FROM glpi_tracking '.
    ' WHERE ( date '.
    ' BETWEEN "'.$date1.'%" '.
    ' AND "'.$date2.'%" ) '.
    ' AND ('.
    ' STATUS = "old_done" '.
    ' AND category = "'.$catego.'" '.
    ' ) '.
    ' ) AS a '.
    'GROUP BY category';
    //echo $query; // Ca aide toujours à voir ce qui peut cloquer dans la requête
    $sql = mysql_query($query)or die ("Non cloturé ".mysql_error());
    $req = mysql_fetch_row($sql);
    echo "<td>".$req[0]."</td>";
    Elle fonctionne correctement, merci à vous

Discussions similaires

  1. [SQL] Problème de requête et <tr>+<td>
    Par ruty dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 15/08/2006, 09h10
  2. [SQL] Problème bizarre requête date
    Par masseur dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/02/2006, 13h12
  3. [Oracle] [SQL] problème de requête
    Par joselito dans le forum PHP & Base de données
    Réponses: 24
    Dernier message: 25/01/2006, 12h55
  4. [SQL]problème de requête.
    Par shnouf dans le forum Oracle
    Réponses: 21
    Dernier message: 24/01/2006, 11h12
  5. [SQL] Problème de requête SQL de plus de 8060 caractères ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 06/04/2005, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo