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 :

Sous requêtes - Erreur de syntaxe [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut Sous requêtes - Erreur de syntaxe
    Je n'arrive pas à comprendre pourquoi ma sous-requête ne fonctionne pas.

    Je voudrais récupérer la liste de tous les clients étant dans la même ville que le client sélectionné.

    Le client sélectionné est dans l'url (detail.php?clientID=2025)

    Mon premier jeu d'enregistrement fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT villeID
    FROM tbl_clients
    WHERE clientID = colname

    ici, colname va chercher le n° client dans l'URL. Donc cette première requête me renvoi un chiffre qui correspond à l'id de la ville.

    Cette première requête fonctionnant, j'ai donc rédigé la requête suivante pensant pouvoir récupérer les autres clients de la ville

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM tbl_clients
    WHERE villelID = (SELECT villeID FROM tbl_clients WHERE clientID = colname)

    Dreamweawer me renvoi un message d'erreur m'indiquant que ma syntaxe SQL n'est pas correcte.

    Si vous avez un avis sur la question , je suis preneur;

    Merci d'avance

  2. #2
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Bonsoir !

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM tbl_clients
    WHERE villelID IN (SELECT villeID FROM tbl_clients WHERE clientlID = colname)

    Car ta requête te retourne plusieurs résultats

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    ça ne mache pas non plus !

    MySQL Error Error#:1064. C'est à dire le même message que lorsque j'utilise le = à la place de IN


    Pourtant la requête n'a rien d'extraordianaire ! Je ne comprends pas ce qui cloche . Est-ce que Dreamweaver souhaite une mise en forme particulière ?

  4. #4
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Cette erreur n'a pas de sens^^ un peu de code? TU as un truc du genre ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $exec=mysql_query($req) or die(mysql_error());

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et avec int(colname) ?
    ou $colname ?

    A vrai dire, on ne sait pas trop ce qu'est colname ! (numerique ou chaine ?)

    Que dit un echo colname; ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    Voici quelques précisions

    La requete qui marche :
    SELECT villeID
    FROM tbl_clients
    WHERE clientID = colname

    VARIABLE
    Nom = Colname
    Type=Integer
    Valeur par défaut = -1
    Valeur d'exécution : $_GET["clientID"]

    Cette requête permet de récupérer l'id de la ville de l'enregistrement.
    Le jeu d'enregistrement est filtré par l'id du client qui se trouve dans l'url.

    Si je teste cette requête silmple, elle fonctionne et me donne un chiffre ( cohérent par rapport à ma base).

    Voici maintenant le code entier disponible dans la page (pour la requête simple qui fonctionne) :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php require_once('Connections/zzzzz'); ?>
    <?php
    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
    {
      if (PHP_VERSION < 6) {
        $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
      }
     
      $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
     
      switch ($theType) {
        case "text":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;    
        case "long":
        case "int":
          $theValue = ($theValue != "") ? intval($theValue) : "NULL";
          break;
        case "double":
          $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
          break;
        case "date":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;
        case "defined":
          $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
          break;
      }
      return $theValue;
    }
    }
     
    $colname_TEST = "-1";
    if (isset($_GET['clientID'])) {
      $colname_TEST = $_GET['clientID'];
    }
    mysql_select_db($database_zzz, $zzzz);
    $query_TEST = sprintf("SELECT villeID FROM tbl_clients WHERE clientID = %s", GetSQLValueString($colname_TEST, "int"));
    $TEST = mysql_query($query_TEST, $zzz) or die(mysql_error());
    $row_TEST = mysql_fetch_assoc($TEST);
    $totalRows_TEST = mysql_num_rows($TEST);
    ?>

  7. #7
    Invité
    Invité(e)
    Par défaut
    As-tu essayer pour la 2eme requete :

    SELECT *
    FROM tbl_clients
    WHERE villelID = $row_TEST['villeID']

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    Je viens d'essayer.
    Ca n'a pas fonctionné mais j'avoue que je ne l'ai peut être pas placé au bon endroit car je ne comprend cette requête.

    Si je place cette requete. A quel moment le serveur saura-til que je souahite récupérer les clients de la même ville que mon client de l'url ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tu as ta 1ere requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysql_select_db($database_zzz, $zzzz);
    $query_TEST = sprintf("SELECT villeID FROM tbl_clients WHERE clientID = %s", GetSQLValueString($colname_TEST, "int"));
    $TEST = mysql_query($query_TEST, $zzz) or die(mysql_error());
    $row_TEST = mysql_fetch_assoc($TEST);
    $totalRows_TEST = mysql_num_rows($TEST);
    Elle trouve l'IDville DU client (clientID passé en URL)

    A partir de la, tu fais la 2eme requete.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Août 2007
    Messages : 109
    Par défaut
    Bonjour,

    sinon tu peux aller voir du coté de EXISTS

    http://dev.mysql.com/doc/refman/5.0/...ubqueries.html

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    jreaux62
    Oui ma 1ere requête renvoi la villeID
    Je l'ai juste préciser afin d'éliminer une première possibilité d'erreur.

    La requête récupère bien la villeID donc le problème vient de ma combinaison des 2 requêtes

    Ca, ca marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT villeID FROM tbl_clients WHERE clientID = colname

    Si je fais un test avec l'autre partie de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM tbl_clients
    WHERE villeID = 48
    Ca marche aussi

    Donc je rédige l'ensemble de ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM tbl_clients
    WHERE villeID= (SELECT villeID FROM tbl_clients WHERE clientID = colname)
    Et là , ça en marche plus !

    Donc, en clair: Les 2 requêtes prises individuellement dans 2 jeux d'enregistrements différents fonctionnent.

    Si je veux les regrouper en un seul jeux d'enregistrement, ça ne marche plus

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas un probleme de requete.
    Le probleme vient surement du fait que ta fonction "colname" n'est pas reconnue dans la requete (?!?), ou doit etre executee imperativement AVANT de lancer la requete !

    Essaie en mettant :
    $colname = colname;
    SQL=" SELECT *
    FROM tbl_clients
    WHERE villeID= (SELECT villeID FROM tbl_clients WHERE clientID = ".$colname.")"


    A quoi bon voir TROP en faire ?
    Si ca marche avec les 2 requetes, garde-les !
    En voulant tout regrouper dans une seule, tu t'exposes a un tas de soucis :
    la preuve !!
    Et au lieu de gagner du temps, tu en perds ...

    Essaie de prendre un plateau, un verre, une assiette et les couverts, TOUT EN MEME TEMPS :
    tu comprendras ce que je veux dire

    Une autre image, ta requete ressemble a :
    requete = select chaussures(select chaussettes(trouve pantalon))
    Dernière modification par Invité ; 31/03/2009 à 20h06.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    J'aimerai bien que ce soit aussi simple MAIS

    Pour m'assurer qu'une des requêtes fonctionait j'ai entré moi-même le villeID, OR, sur sur mon site, villeID doit être récupéré dynamiquement.

    Si je ne renseigne rien, je vais avoir
    - un jeu d'enregistrement qui récupère un villeID
    - un jeu d'enregistrement qui est censé récupérer tous les champs à partir du moment ou villeID = un certain nombre qui ne sera pas renseigné.

    Donc je suis bien obligé de lier les 2.

  14. #14
    Invité
    Invité(e)
    Par défaut
    C'est toi qui est tetu, ou moi qui n'ai rien compris ?
    (rassure-toi, moi aussi je suis tres TETU, et je m'accroche toujours jusqu'a avoir une solution !)

    C'est pourtant SIMPLISSIME (!) :

    1- recuperation de l'ID client :
    $_GET['clientID'] ---> qui nous donne --> colname

    2- on trouve l'ID ville correspondant :
    $query ="SELECT villeID FROM tbl_clients WHERE clientID = colname";
    $result = mysql_query($query, $zzz) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
    $IDdelavilleduclient = $row['villeID'];

    3- on trouve tous les clients de cette ville :
    $query ="SELECT * FROM tbl_clients WHERE villeID= ".$IDdelavilleduclient;
    $result = mysql_query($query, $zzz) or die(mysql_error());
    $row = mysql_fetch_assoc($result);

    4- on les affiche :
    while ....
    ...

    Ou ca te pose probleme ????

    Tu ne fais pas une requete (la 1ere) sur 10000000 enregistrement, mais sur 1 seul !

    Explique-moi en quoi tu espères gagner du temps (?) en essayant (sans succes !) de TOUT faire en meme temps ???

  15. #15
    Invité
    Invité(e)
    Par défaut
    Une question :
    tu ne mélanges quand meme pas du javascript et du PHP pour trouver ton "colname" ???

    Je n'ai toujours pas compris pourquoi tu ne fais pas tout simplement :
    $colname = mysql_real_escape_string($_GET["clientID"]);

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    Alors,

    Oui je suis têtu ( et breton en plus !)
    et surtout je suis débutant
    autant dire que mon cas n'est pas gagné.

    Au moins on est d'accord sur un truc : cette requête devrait être simplissime.

    Je suis très content de voir que quelqu'un connait la solution et tente de me la faire comprendre et je te remercie pour ça.

    Etant débutant, je compte sur Dreamweaver pour générer le code et je le retouche un peu si besoin (quand je le comprend)

    Donc je ne sais pas très bien comment utiliser ton résumé
    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
    $colname_TEST = "-1";
    if (isset($_GET['clientID'])) {
      $colname_TEST = $_GET['clientID'];
    }
    mysql_select_db($database_zzz, $zzzz);
    $query_TEST = sprintf("SELECT villeID FROM tbl_clients WHERE clientID = %s", GetSQLValueString($colname_TEST, "int"));
    $TEST = mysql_query($query_TEST, $zzz) or die(mysql_error());
    $row_TEST = mysql_fetch_assoc($TEST);
    $totalRows_TEST = mysql_num_rows($TEST);
    $IDdelavilleduclient = $row['villeID'];
     
    $query ="SELECT * FROM tbl_clients WHERE villeID= ".$IDdelavilleduclient;
    $result = mysql_query($query, $zzz) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
     
    ?>
    Comme ça ?

    et le while...

    je découvre donc je ne sais pas du tout ce que je dois faire avec ce while ?

  17. #17
    Invité
    Invité(e)
    Par défaut
    Je ne suis pas breton, mais j'aime beaucoup ecouter MANAU !
    (et j'ai un sale caractere ! )

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    // connexion a la BD
    mysql_select_db($database_zzz, $zzzz);
    // --------------------------------------------------------
    // recuperation de l ID du CLIENT
    $colname = "-1";
    if (isset($_GET['clientID'])) {
      $colname = mysql_real_escape_string($_GET["clientID"]);
      // (important contre les injections SQL)
    }
    // --------------------------------------------------------
    // recuperation de l ID de la VILLE
    $query = sprintf("SELECT villeID FROM tbl_clients WHERE clientID = %s", GetSQLValueString($colname, "int"));
    $result = mysql_query($result, $zzz) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
    	// $totalRows = mysql_num_rows($result);
    	// inutile ici, sauf si tu veux verifier qu'il existe bien une ville associee au client :
    	// if ($totalRows==0) {
    	// 	echo 'pas de ville définie pour ce client !';
    	// 	header('location :page-precedente.php');
    	// 	exit; // (arrete l execution de la page)
    	// } else {
    	// 	$IDdelavilleduclient = $row['villeID'];
    	// }
    $IDdelavilleduclient = $row['villeID'];
    // --------------------------------------------------------
    // recuperation de TOUS LES CLIENTS de cette ville
    $query ="SELECT * FROM tbl_clients WHERE villeID= ".$IDdelavilleduclient;
    $result = mysql_query($query, $zzz) or die(mysql_error());
    // --------------------------------------------------------
    // affichage de la LISTE des clients de cette ville
    // tant qu'il y a des fiches
    while ($row= mysql_fetch_array($result)) {
    	echo $row["nom"];  -
    	echo $row["prenom"];
    	// ...........
    	<br />
    } // (fin while)
    ?>
    (j'ai enlevé les _TEST ...)

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    Ok, alors en fait, j'ai pu solutionner mon problème sans me plonger dans le code.

    Le blocage venait du fait que j'utilise la version 4 de MysQL et cette version ne permet pas de rédiger des sous-requêtes.

    J'ai transféré ma base sur une base MySQl version 5

    J'ai rédigé ma requête avec ma sous-requête tout simplement...

    et tout fonctionne nickel du premier coup

    YES

    Merci à tous ceux qui ont essayé de m'aider !

  19. #19
    Invité
    Invité(e)
    Par défaut
    Il fallait y penser ! ....

    Match nul !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête: Erreur de syntaxe
    Par I.Z.M.M dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/01/2009, 19h09
  2. Réponses: 3
    Dernier message: 22/12/2007, 14h06
  3. Erreur syntaxe SQL DELETE avec sous requête
    Par jeanbenoit1987 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/12/2007, 12h14
  4. Plusieurs lignes pour une sous-requête (erreur #1242)
    Par Sieldev dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/08/2007, 01h21
  5. Agrégats et sous-requêtes "Erreur de syntaxe"
    Par Finidrigoler dans le forum Access
    Réponses: 3
    Dernier message: 08/12/2006, 17h39

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