résultat requête qui ne s'affiche pas??????

Eléphant du PHP | 66 Messages

10 oct. 2007, 09:52

Bonjour,

J'ai créé une requête avec des jointures mais je ne vois pas pourquoi elle ne m'affcihe pas mon résultat sur ma page.
<?
$sql = "SELECT I.num_interv, I.date_demande, I.heure_demande, I.description, I.num_user, I.num_service, I.num_urg, D.num_tech, D.num_interv, T.num_tech, T.nom_tech, T.prenom_tech, U.num_urg, U.nom_urg, US.num_user, US.nom_user, US.prenom_user, US.login_user, US.pass_user, US.num_service, S.num_service, S.nom_service
FROM intervention I, demtech D, technicien T, urgence U, users US, service S
WHERE D.num_tech = T.num_tech
AND D.num_interv = I.num_interv
AND I.num_user = US.num_user
AND I.num_urg = U.num_urg
AND S.num_service = I.num_service";

$sql_exe = mysql_query($sql) or die('Erreur : ' . mysql_error());
while ($Tab = mysql_fetch_array($sql_exe)) 
    {
?>
		  <table width="1024">
		   <tr>
		     <td width="170" align="center"><?php echo $Tab["num_interv"]; ?></td>
			 <td width="170" align="center"><?php echo $Tab["date_demande"]; ?></td>
			 <td width="170" align="center"><?php echo $Tab["heure_demande"]; ?></td>
			 <td width="170" align="center"><?php echo $Tab["nom_user"]; ?> <?php echo $Tab["prenom_user"]; ?></td>
			 <td width="170" align="center"><?php echo $Tab["nom_tech"]; ?> <?php echo $Tab["prenom_tech"]; ?></td>
			 <td width="170" align="center"><?php echo $Tab["nom_urg"]; ?></td>
		   </tr>
		  </table>
<? } ?>
voila si quelqu'un voit le problème

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2007, 10:02

As-tu un message d'erreur ou simplement pas d'affichage ?
As-tu testé ta requête dans MySQL ou phpMyAdmin pour vérifier qu'elle retournait bien des résultats ?

Nota : pour des raisons de compatibilité quel que soit la config du serveur, il vaut mieux utiliser les tags "<?php" plutôt que les shorts open tags "<?"
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

d0m
Mammouth du PHP | 1141 Messages

10 oct. 2007, 10:03

une vérification simple à faire pour voir les résultat de ta requete :
while ($Tab = mysql_fetch_array($sql_exe)){
  print_r($Tab );
}

Eléphant du PHP | 66 Messages

10 oct. 2007, 10:33

Non rien ne s'affiche pourtant j'ai des données dans ma table intervention

Le print_r ne donne rien non plus

Et quand jexécute la requête sous php ça donne ça :
Votre requête SQL a été exécutée avec succès (traitement: 0.0005 sec.)
requête SQL:
SELECT I.num_interv, I.date_demande, I.heure_demande, I.description, I.num_user, I.num_service, I.num_urg, D.num_tech, D.num_interv, T.num_tech, T.nom_tech, T.prenom_tech, U.num_urg, U.nom_urg, US.num_user, US.nom_user, US.prenom_user, US.login_user, US.pass_user, US.num_service, S.num_service, S.nom_service
FROM intervention I, demtech D, technicien T, urgence U, users US, service S
WHERE D.num_tech = T.num_tech
AND D.num_interv = I.num_interv
AND I.num_user = US.num_user
AND I.num_urg = U.num_urg
AND S.num_service = I.num_service
LIMIT 0 , 30

d0m
Mammouth du PHP | 1141 Messages

10 oct. 2007, 10:40

c'est donc à priori un problème dans tes clauses WHERE, tes conditions ne sont pas correctes.
Mais ça, sans la structure de ta base, on peut pas t'aider.

Eléphant du PHP | 66 Messages

10 oct. 2007, 10:56

En gros ma structure

Mes tables :

intervention : num_interv(primaire) / num_user, num_service, num_urg (étrangères)
technicien : num_tech(primaire)
demtech : num_techn, num_interv(primaire composée entre intervention et technicien)
users : num_user(primaire)
urgence : num_urg(primaire)
service : num_service(primaire)

Voila j'espère que ça va pouvoir vous aider

Eléphant du PHP | 73 Messages

10 oct. 2007, 10:57

SELECT I.num_interv, I.date_demande, I.heure_demande, I.description, I.num_user, I.num_service, I.num_urg, D.num_tech, D.num_interv, T.num_tech, T.nom_tech, T.prenom_tech, U.num_urg, U.nom_urg, US.num_user, US.nom_user, US.prenom_user, US.login_user, US.pass_user, US.num_service, S.num_service, S.nom_service
FROM intervention I, demtech D, technicien T, urgence U, users US, service S
WHERE D.num_tech = T.num_tech
AND D.num_interv = I.num_interv
AND I.num_user = US.num_user
AND I.num_urg = U.num_urg
AND S.num_service = I.num_service
LIMIT 0 , 30
Tu devrais utiliser la notation plus claire suivante, qui permet de distinguer les jointures des clauses de restrictions, augmente la lisibilité et donc la facilité de débogage.

Code : Tout sélectionner

SELECT I.num_interv, I.date_demande, I.heure_demande, I.description, I.num_user, I.num_service, I.num_urg, D.num_tech, D.num_interv, T.num_tech, T.nom_tech, T.prenom_tech, U.num_urg, U.nom_urg, US.num_user, US.nom_user, US.prenom_user, S.login_user, US.pass_user, US.num_service, S.num_service, S.nom_service FROM intervention I JOIN demtech D ON I.num_interv = D.num_interv JOIN technicien T ON D.num_tech = T.num_tech JOIN urgence U ON I.num_urg = U.num_urg JOIN users US ON I.num_user = US.num_user JOIN service S ON I.num_service = S.num_service LIMIT 0 , 30
Pour aller plus loin dans l'aide que l'on peut t'apporter, il faut prendre connaissance du schéma de la base de données.

Je ne vois pas de problèmes pour l'instant, y compris dans la clause WHERE, puisque tu ne fais que des jointures...
Image Un bon maître a ce souci constant : enseigner à se passer de lui.

Eléphant du PHP | 443 Messages

10 oct. 2007, 11:10

Extrait de la doc mysql
LIMIT 0 va toujours retourner rapidement un résultat vide. C'est pratique pour vérifier une requête et lire les types de colonnes du résultat, sans exécuter réellement la requête.
Utilise Limit 1, 30

d0m
Mammouth du PHP | 1141 Messages

10 oct. 2007, 11:11

pour identifier sur quelle jointure plus aucun résultat n'est renvoié tu peux réduire ta requête à celle ci :

Code : Tout sélectionner

SELECT I.num_interv, I.date_demande, I.heure_demande, I.description, I.num_user, I.num_service, I.num_urg FROM intervention I LIMIT 0 , 30
au départ normalement toutes tes interventions sont retournées, ensuite tu rajoutes jointure par jointure en testant entre chaque ajout :

Code : Tout sélectionner

SELECT I.num_interv, I.date_demande, I.heure_demande, I.description, I.num_user, I.num_service, I.num_urg FROM intervention I JOIN demtech D ON I.num_interv = D.num_interv LIMIT 0 , 30
etc...

Eléphant du PHP | 443 Messages

10 oct. 2007, 11:14

Extrait de la doc mysql
LIMIT 0 va toujours retourner rapidement un résultat vide. C'est pratique pour vérifier une requête et lire les types de colonnes du résultat, sans exécuter réellement la requête.
Utilise Limit 1, 30
Je reposte !!!

Eléphant du PHP | 66 Messages

10 oct. 2007, 11:14

Je me suis amusé à débugger en ajoutant mes tables petit à petit et le problème survient lorsque j'ajoute ma table demtech celle avec l'id composé après avoir ajouter la jointure ma requête ne retourne plus rien.

pourtant ma jointure me semble bonne et je met bien tous mes champs dans mon select

je n'utilise pas le limit en fait

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2007, 11:35

Extrait de la doc mysql
LIMIT 0 va toujours retourner rapidement un résultat vide. C'est pratique pour vérifier une requête et lire les types de colonnes du résultat, sans exécuter réellement la requête.
Utilise Limit 1, 30
Il est question dans la doc de "LIMIT 0", pas de "LIMIT 0, X". Le fait de faire un "LIMIT 1, 30" va simplement te retourner 29 résultats à partir du second.

Quant à ton problème, c'est peut être parcequ'il te faut des jointures externes (OUTER JOIN). Est-ce que tu as une correspondance dans chaque table ou bien se peut-il que certains enregistrement ne soient pas renseignés ?
Il me sembla qu'avec une jointure classique, s'il n'y a pas un résultat dans chaque table, l'enregistrement n'est pas retourné...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 443 Messages

10 oct. 2007, 12:02

Extrait de la doc mysql
LIMIT 0 va toujours retourner rapidement un résultat vide. C'est pratique pour vérifier une requête et lire les types de colonnes du résultat, sans exécuter réellement la requête.
Utilise Limit 1, 30
Il est question dans la doc de "LIMIT 0", pas de "LIMIT 0, X". Le fait de faire un "LIMIT 1, 30" va simplement te retourner 29 résultats à partir du second.

Quant à ton problème, c'est peut être parcequ'il te faut des jointures externes (OUTER JOIN). Est-ce que tu as une correspondance dans chaque table ou bien se peut-il que certains enregistrement ne soient pas renseignés ?
Il me sembla qu'avec une jointure classique, s'il n'y a pas un résultat dans chaque table, l'enregistrement n'est pas retourné...
Effectivement milles plates excuses :wink: