Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/06/2007, 14h57   #1
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
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 :
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>";
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h28   #2
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
Je l'aurais écrit comme ca :
( mettre la requête dans un variable fait un peu plus propre je trouve )

Code :
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 ?
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h38   #3
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
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
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h41   #4
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 686
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 686
Points : 5 451
Points : 5 451
salut
En plaçant un mysql_error sur l'execution de la requête, ça renvoie quelque chose ?
Code php :
$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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h43   #5
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Remplaces ca :
Code :
1
2
$sql = mysql_query($query);
$req = mysql_fetch_row($sql) or die ("Non cloturé ".mysql_error());
par
Code :
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!
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h47   #6
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
Citation:
Envoyé par koopajah
Remplaces ca :
Code :
1
2
$sql = mysql_query($query);
$req = mysql_fetch_row($sql) or die ("Non cloturé ".mysql_error());
par
Code :
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)
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h48   #7
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
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.
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h50   #8
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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 :
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
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h50   #9
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
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
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h51   #10
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
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 ?
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h54   #11
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Ben rien, tu mets pas de % pour un between!

J'aurai fait ca clairement moi:
Code :
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?
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h58   #12
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
Citation:
Envoyé par koopajah
Ben rien, tu mets pas de % pour un between!

J'aurai fait ca clairement moi:
Code :
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
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 15h59   #13
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
Citation:
Envoyé par koopajah
Ben rien, tu mets pas de % pour un between!

J'aurai fait ca clairement moi:
Code :
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
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 16h02   #14
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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 :
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
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 16h09   #15
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
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 )
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 16h39   #16
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
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
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 16h50   #17
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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?
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 09h05   #18
Invité de passage
 
Inscription : juin 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 18
Points : 1
Points : 1
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 :
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
eduardosan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h01.


 
 
 
 
Partenaires

Hébergement Web