Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 04/01/2012, 18h18   #1
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 146
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 146
Points : 26
Points : 26
Par défaut requete non reconnue

Bonsoir

C'est encore moi

J'ai un bug avec le script suivant :

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$db = mysql_connect('localhost','root','');
mysql_select_db('projet',$db);
 
$sql = "'SELECT num_cli,cat,vol,comp,num_pan_a, PANIER_AVIONref_a, TARIF_AVION.ref_a,quantite,montant,date_c,date_f,date_d FROM TARIF_AVION,PANIER_AVION WHERE num_cli='".mysql_real_escape_string($num_cli)."'AND PANIER_AVION.ref_a=TARIF_AVION.ref_a'";
 
$req = mysql_query($sql) or die('Erreur SQL ! '.$sql.' '.mysql_error());
 
echo "<div align=\"center\"><center> <table border=\"1\">";
$i=0;
while($data = mysql_fetch_array($req) AND $data['num_cli']=$num_cli)
 
{
echo  "<tr>";
echo "<td>";
echo " Commande numéros :" ;
echo "</td> ";
echo "<td>";
echo $data['num_pan_a'];
echo "</td> ";
echo "</tr>";
 
}
 
echo " </table> </center></div>";
mysql_close();


Voici le message d'erreur :

Citation:
Erreur SQL ! 'SELECT num_cli,cat ,vol ,comp , num_pan_a, PANIER_AVIONref_a, TARIF_AVION.ref_a, quantite, montant, date_c, date_f, date_d FROM TARIF_AVION , PANIER_AVION WHERE num_cli LIKE'2'AND PANIER_AVION.ref_a=TARIF_AVION.ref_a' You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''SELECT num_cli,cat ,vol ,comp , num_pan_a, PANIER_AVIONref_a, TARIF_AVION.ref_a' at line 1
Ici je dispose d'un numéro de client extérieur à la base .

J'en m'en sert pour :

- retrouver toutes les commandes que le client a passé
- je doit toute les afficher dans un tableau ( seulement le numéros de la commande pour le moment pour simplifier )

Je pense à un problème d'affichage au niveau du while ?

Merci d'avance
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 22h42   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonsoir,

dans la chaine sql tu as mis ça : PANIER_AVIONref_a.
Remplaces par PANIER_AVION.ref_aEnsuite je te conseille de faire plutôt tes jointures dans la clause FROM que de dans la clause WHERE.

Ton while n'a aucun sens : tu filtres déjà tes données dans le sql sur $num_cli, en conséquence tes données correspondront de fait à ton $num_cli.

Et une dernière chose : relis-toi encore et encore.
Tu sais, les messages d'erreurs sont utiles pour aider au débogage.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h35   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Le message d'erreur indique que l'erreur est "near 'SELECT..." c'est à dire juste au début de la requête.

Et en relisant ton code, tu trouves facilement l'erreur :
Tu as une apostrophe qui traîne après le guillemet d'ouverture !

Prend l'habiture d'aérer ton code et notamment l'écriture des requêtes, en écrivant les jointures tel que le préconise la norme SQL depuis 1992 !

Code :
1
2
3
4
5
6
7
8
9
$sql = "
	SELECT num_cli, cat, vol, comp, num_pan_a, -- de quelle table viennent ces colonnes ?
	PANIER_AVION.ref_a, 
	TARIF_AVION.ref_a, 
	quantite, montant, date_c, date_f, date_d -- de quelle table viennent ces colonnes ?
	FROM TARIF_AVION
	INNER JOIN PANIER_AVION ON PANIER_AVION.ref_a = TARIF_AVION.ref_a
	WHERE num_cli = '".mysql_real_escape_string($num_cli)."'
";
C'est pas plus agréable à lire comme ça ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h36   #4
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 146
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 146
Points : 26
Points : 26
Bonsoir

J'ai vérifier ce tu as dis et j'ai toujours un bug , c'est plus une erreur de requete elle bonne j'ai un warning pour toutes les lignes de mon tableau

" Warning , machintruc .... ligne XXX "

- le "PANIER_AVION.ref_a" je l'ai balayé en appelant le "PANIER_AVION.*" car j'ai besoin de toutes les infos des lignes qui m’intéresse

- exact le while n'as aucun intérêt car je ne prend qu'une partie , j'ai pensé mettre un foreach mais après je ne sais pas comment le faire marcher

- tu veux dire quoi par faire une jointure en le FROM ???

- la requête et bonne puisque testée dans le SGBD PHPMYADMIN

Voici le code acutel que j'ai changé avec en rouge les zone ou je ne sais pas quoi mettre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$db= mysql_connect('localhost','root','');
mysql_select_db('projet',$db);

$sql = "'SELECT PANIER_AVION.*, TARIF_AVION.* FROM TARIF_AVION , PANIER_AVION WHERE num_cli='".mysql_real_escape_string($num_cli)."' AND PANIER_AVION.ref_a=TARIF_AVION.ref_a'";

$req = mysql_query($sql)  ; 

echo "<div align=\"center\"><center> <table border=\"1\">";

$data=mysql_fetch_assoc($req); // ici je dois mettre un assoc  array ou rows ????

foreach ($... as $data['num_pan_a']) // ici je ne suis pas d'accord avec la boucle , je désire afficher uniquement les lignes qui concernent le client , si client numéros 17 alors afficher les lignes ou num_cli = 17 , le reste ne nous interesse pas 

{
echo "<tr>";
echo "<td>";
echo " Commande numéros :" ;
echo "</td> ";
echo "<td>";
echo $data['num_pan_a'];
echo "</td> ";
echo "</tr>";

... // les autres informations désirés  , comme la quantité de billet commandé ou le montant 

}

echo " </table> </center></div>";
mysql_close();

La je sèche complétement au niveau de l'affichage avec l'aide d'une boucle

Encore merci d'avance

PS : désolé j'ai posté en même temps
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h47   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Tu es sûr que tu n'as plus d'erreur SQL ? Je vois toujours les apostrophes en trop au début et à la fin de la requête !

Et évite la guerre des étoiles ! Sur ce plan, ta première requête était meilleure !

Par contre, tu ne connais toujours pas les jointures !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h01   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Tu devrais te rapprocher d'un truc comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
 
$db = mysql_connect('localhost','root','');
mysql_select_db('projet', $db);
 
// vérifies bien que $num_cli est défini avant le traitement
 
$sql =
"  SELECT
      PANIER_AVION.*,
      TARIF_AVION.*
   FROM
      TARIF_AVION INNER JOIN PANIER_AVION ON TARIF_AVION.ref_a = PANIER_AVION.ref_a
   WHERE
      PANIER_AVION.num_cli = '".mysql_real_escape_string($num_cli)."'";
 
$exec = mysql_query($sql) or die(mysql_error());
 
?>
<div align="center">
   <center>
      <table border="1">
         <thead>
            <tr>
               <th>En-tête 1</th>
               <th>En-tête 2</th>
               <th>En-tête 3</th>
            </tr>
         </thead>
         <tbody>
            <?php while($row = mysql_fetch_assoc($exec)): ?>
            <tr>
               <td><?php echo $row['num_pan_a']; ?></td>
               <td><?php echo $row['nom']; ?></td>
               <td><?php // ici tu mets d'autres colonnes ?></td>
            </tr>
            <?php endwhile; ?>
         </tbody>
      </table>
   </center>
</div>
Essayes de déporter la mise en page dans le CSS au lieu de trainer des attributs ou des balises relatives à la mise en forme
Et prends le temps de lire les liens du collègue CinePhil
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 19h17   #7
Nouveau Membre du Club
 
Inscription : janvier 2011
Messages : 146
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 146
Points : 26
Points : 26
Ah voila ca marche avec le INNER JOIN est c'est dix fois mieux , j'ai lu la doc de cinphil , ca sert

Merci

Cependant un erreur persiste avec cette requête :

Code php :
1
2
3
4
5
6
$sql = "SELECT param1, param2, param3 .... 
	    FROM TARIF_BATEAU_CLI, TARIF_BATEAU_VEC , TRAJET_BATEAU ,PANIER_BATEAU
		WHERE PANIER_BATEAU.ref_tar_cli IN (SELECT TARIF_BATEAU_CLI.ref_tar_cli FROM TARIF_BATEAU_CLI)
		AND PANIER_BATEAU.ref_tar_vec IN ( SELECT TARIF_BATEAU_VEC.ref_tar_vec FROM TARIF_BATEAU_VEC)
		AND PANIER_BATEAU.ref_traj IN ( SELECT TRAJET_BATEAU.ref_traj FROM SELECT TRAJET_BATEAU)
		AND WHERE num_cli = '".mysql_real_escape_string($num_cli)."'";

et aussi celle ci :

Code php :
1
2
3
4
5
6
$sql="SELECT param1, param2, param3 .... 
FROM TARIF_BATEAU_CLI, TARIF_BATEAU_VEC, TRAJET_BATEAU
INNER JOIN PANIER_BATEAU ON PANIER_BATEAU.ref_tar_cli = TARIF_BATEAU_CLI.ref_tar_cli
INNER JOIN PANIER_BATEAU ON PANIER_BATEAU.ref_tar_vec = TARIF_BATEAU_VEC.ref_tar_vec
INNER JOIN PANIER_BATEAU ON PANIER_BATEAU.ref_traj = TRAJET_BATEAU.ref_traj
WHERE num_cli = '".mysql_real_escape_string($num_cli)."'";

J'ai lu que on ne peut pas faire plusieur INNER JOIN à la suite des autres ?

Ou alors LEFT ou RIGHT JOIN ?

Merci d'avance
tanaka59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 20h26   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
J'ai lu que on ne peut pas faire plusieur INNER JOIN à la suite des autres ?
Hein ? !
Où as-tu lu ça ?

Citation:
Envoyé par tanaka59 Voir le message
Cependant un erreur persiste avec cette requête :

Code php :
1
2
3
4
5
6
$sql = "SELECT param1, param2, param3 .... 
	    FROM TARIF_BATEAU_CLI, TARIF_BATEAU_VEC , TRAJET_BATEAU ,PANIER_BATEAU
		WHERE PANIER_BATEAU.ref_tar_cli IN (SELECT TARIF_BATEAU_CLI.ref_tar_cli FROM TARIF_BATEAU_CLI)
		AND PANIER_BATEAU.ref_tar_vec IN ( SELECT TARIF_BATEAU_VEC.ref_tar_vec FROM TARIF_BATEAU_VEC)
		AND PANIER_BATEAU.ref_traj IN ( SELECT TRAJET_BATEAU.ref_traj FROM SELECT TRAJET_BATEAU)
		AND WHERE num_cli = '".mysql_real_escape_string($num_cli)."'";
Encore des jointures d'il y a 20 ans !

Citation:
et aussi celle ci :

Code php :
1
2
3
4
5
6
$sql="SELECT param1, param2, param3 .... 
FROM TARIF_BATEAU_CLI, TARIF_BATEAU_VEC, TRAJET_BATEAU
INNER JOIN PANIER_BATEAU ON PANIER_BATEAU.ref_tar_cli = TARIF_BATEAU_CLI.ref_tar_cli
INNER JOIN PANIER_BATEAU ON PANIER_BATEAU.ref_tar_vec = TARIF_BATEAU_VEC.ref_tar_vec
INNER JOIN PANIER_BATEAU ON PANIER_BATEAU.ref_traj = TRAJET_BATEAU.ref_traj
WHERE num_cli = '".mysql_real_escape_string($num_cli)."'";
Et là tu mélange les jointures anciennes et modernes ! Bref, c'est le bordel tes requêtes !

Si tu fais plusieurs jointures sur la même table, tu dois utiliser des alias. En plus je te conseille d'en utiliser systématiquement dès que tu as plus d'une table dans la requête. Ça facilite la lecture de la requête et t'évite de recopier X fois le nom de chaque table.

Si tu donnes la structure de tes tables, une expression claire de ce que tu cherches à obtenir et éventuellement un petit jeu de données et le résultat attendu, ce sera plus facile de t'aider.

Quelle erreur obtiens-tu ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil 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 04h04.


 
 
 
 
Partenaires

Hébergement Web