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

MySQL Discussion :

unexpected identifier dans SELECT


Sujet :

MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut unexpected identifier dans SELECT
    Bonjour
    je ne comprends pas pourquoi j'ai "unexpected identifier" dans la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT adresse, FROM groupe_index WHERE groupe LIKE 'airbag';
    Evidemment j'ai vérifié qu'il n'y avait pas d'erreur dans le nom "adresse" (du genre "espace")

    Ca fonctionne dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes_index WHERE
    groupe LIKE ?");
    où bien entendu le ? est remplacé par 'airbag' après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_stmt_execute($stmt, [$_GET["Mot"]]);
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 423
    Par défaut
    Bonjour,
    Il y a une virgule de trop dans le SELECT. Elle ne doit se trouver qu'ENTRE les colonnes.

    Tatayo.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    ça ne fonctionne pas même sans virgule

    unexpected identifier "adresse" in H:\recherche.php on line 16

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 423
    Par défaut
    Peux-tu nous montrer le code qui ne fonctionne pas ?

    Tatayo.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $bdd=mysqli_connect('localhost', 'root', '','proglyrics') or die
    ("Connexion au serveur impossible"); 
     
    SELECT adresse FROM groupe_index WHERE groupe LIKE 'airbag';
    Rien que ça, ça plante. Evidemment "groupe_index" est une table dans la bdd qui s'appelle "proglyrics"

    Parse error: syntax error, unexpected identifier "adresse" in H:\proglyrics\recherche.php on line 16

    La BDD est en copie écran quand tu me l'avais demandé pour ce post
    https://www.developpez.net/forums/d2...syntaxe-match/

    J'ai tenté de faire marcher le MATCH sans requête préparée et in fine j'ai décidé de tester le SELECT directement pour m'apercevoir que ça plante aussi.

    Je ne comprends vraiment pas pourquoi ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes_index WHERE
    groupe LIKE ?");
    ça fonctionne et pas quand je le sort de son mysqli_prepare.
    Peut-être que le SELECT ne sait pas que la BDD se nomme $bdd ?

    Bref, je ne comprends rien à ce qui se passe.

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 423
    Par défaut
    Dans le premier code tu mets directement la requête dans le code (PHP ?), alors que dans le second tu la passes en paramètre à mysqlcli_prepare.
    Ce n'est pas du tout la même chose !

    Tatayo

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    Mais où est l'erreur de syntaxe ?
    Pourquoi ai-je droits à "unexpected identifier"

    On n'écrit pas select comme ça ?

    Je n'ai fait que recopier des tutos.
    Si déjà ça ça marche pas je suis mal pour faire fonctionner un MATCH avec une requête en FULLTEXT

    D'ailleurs est-ce qu'on écrit bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes_index
    WHERE MATCH(groupe)  AGAINST(*)");
    le * devant être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_stmt_execute($stmt, [$_GET["Mot"]]);
    et je récupère le tout avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysqli_stmt_get_result($stmt);
    Est-ce que c'est bon ?

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 423
    Par défaut
    Là je passe la main, je ne connais pas PHP.

    Tatayo

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Citation Envoyé par noradan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $bdd=mysqli_connect('localhost', 'root', '','proglyrics') or die
    ("Connexion au serveur impossible"); 
     
    SELECT adresse FROM groupe_index WHERE groupe LIKE 'airbag';
    Rien que ça, ça plante. Evidemment "groupe_index" est une table dans la bdd qui s'appelle "proglyrics"
    Comme on te l'a dit, écrit en l'état, c'est normal que cela ne fonctionne pas. Si tu écris ta requête telle quelle directement dans le code, le préprocesseur PHP va considérer que c'est à lui que ça s'adresse et pas au SGBD. Autrement dit, le serveur va considérer que c'est du PHP et pas du SQL. Il n'y a aucune raison pour que cela aboutisse.

    L'erreur n'est pas dans la syntaxe de la requête elle-même mais dans le fait que ta requête n'est pas au bon endroit.

    ça fonctionne et pas quand je le sort de son mysqli_prepare.
    Peut-être que le SELECT ne sait pas que la BDD se nomme $bdd ?
    Et pourquoi veux-tu la sortir de mysqli_prepare ?

    Encore une fois, le PHP ne sait pas que c'est du SQL. Ce qu'il se passe ici, c'est que tu passes une chaîne de caractère à une fonction, chaîne qui — elle — doit contenir du SQL. La fonction en question se charge ensuite de la compiler au besoin et de transmettre ta requête au serveur de bases de données (MySQL en l'occurrence) pour qu'il l'honore. Le serveur de bases de données fonctionne en parallèle sur ta machine en même temps que le serveur web, mais en tant que service indépendant. Rien ne t'oblige d'ailleurs à démarrer les deux à la fois si tu ne te sers pas de l'un des deux.


    Je ne comprends vraiment pas pourquoi ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes_index WHERE
    groupe LIKE ?");
    ça fonctionne et pas quand je le sort de son mysqli_prepare.
    Ici, il y a un détail à prendre en compte : tu reviens à la ligne, mais comme tu n'as pas encore refermé ta chaîne avec un guillemet " fermant, PHP considère que l'on est toujours dedans. Cela se voit à la coloration syntaxique utilisée dans les extraits de code sur ce forum.

    Deux conseils si ce n'est pas déjà le cas :

    • Utilise un éditeur gérant la coloration syntaxique si ce n'est pas le cas (ce serait très étonnant aujourd'hui mais si tu utilises le notepad, par exemple, ce n'est pas impossible).
    • Si tu débutes en PHP et en bases de données, oublie les interfaces « mysql_ » et « mysqli_ » et pars directement sur PDO.

  10. #10
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 73
    Par défaut
    OK ! Je crois que j'ai fait la même erreur qu'à mes tous débuts (comme si je n'y étais pas encore...) entre php et html. Maintenant ça va mieux
    Là ce serait entre php et sql. SELECT n'est pas une commande php d'où un intermédiaire auquel php envoie la commande et en attend un retour

    J'ai démarré avec mysql parce que .... comme ça ... ça ressemblait à des choses un peu connues.

    En fait concrètement j'ai uniquement besoin d'un ultra mini moteur de recherche sur une seule colonne au max dans deux tables. D'après ce que j'ai lu SELECT avec un MATCH dans une table indexé en FULLTEXT devait faire exactement ce que je voulais directement sans du tout que j'ai à me prendre la tête en apprenant plein de chose qui allaient s'avérer inutiles.
    Il s'agit bêtement de trouver des noms d'artistes et d'afficher le lien vers la page html qui les concerne.
    De ce que j'ai pu lire ici et là ça se fait en une ligne en sql.

    J'ai sorti le select parce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes_index
    WHERE MATCH(groupe)  AGAINST(*)");
    mysqli_stmt_execute($stmt, [$_GET["Mot"]]);
    $result = mysqli_stmt_get_result($stmt);  //récupère le jeux de résultat
    // parcours des lignes du résultat
     
    echo 'avec array<br>';
    while ($row = mysqli_fetch_array($result)) {
    echo '<a href="'.$row["adresse"].'"> toto</a><br>' ;
      }
    retourne
    Erreur de syntaxe près de '*)'

    Dites docteur ! c'est compliqué pdo ?

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Citation Envoyé par noradan Voir le message
    En fait concrètement j'ai uniquement besoin d'un ultra mini moteur de recherche sur une seule colonne au max dans deux tables. D'après ce que j'ai lu SELECT avec un MATCH dans une table indexé en FULLTEXT devait faire exactement ce que je voulais directement sans du tout que j'ai à me prendre la tête en apprenant plein de chose qui allaient s'avérer inutiles.
    C'est vrai mais c'est spécifique à MySQL. Si tu veux quelque chose qui soit à la fois simple et conforme à la norme SQL, je te suggère de t'en tenir à LIKE comme dans ta première requête.

    J'ai sorti le select parce que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $stmt = mysqli_prepare($bdd, "SELECT adresse FROM groupes_index
    WHERE MATCH(groupe)  AGAINST(*)");
    retourne
    Erreur de syntaxe près de '*)'
    AGAINST attend une chaîne de caractères, qui doit contenir le texte à chercher. Et une chaîne de caractères littérale en SQL doit être encadrée par des apostrophes '. Exemple : 'chaine'. Sinon, ce doit être une expression qui puisse être évaluée telle qu'un nom de colonne, de variable ou une fonction. L'astérisque existe dans ce contexte, mais toujours au sein de ta chaîne et dans des modes particuliers, notamment le BOOLEAN MODE. Voir :

    https://mysql.developpez.com/tutorie...et-WHERE#L12-6
    https://dev.mysql.com/doc/refman/8.0...xt-search.html
    https://dev.mysql.com/doc/refman/8.0...expansion.html

    Dites docteur ! c'est compliqué pdo ?
    Pas tellement. Ce n'est pas forcément trivial non plus.

    Par contre, c'est d'abord une API orientée objet et c'est surtout l'interface unifiée désormais proposée par PHP pour se connecter aux bases de données. Elle essaie de pallier certaines erreurs du passé et te permet surtout d'être utilisée avec n'importe quelle base de données derrière. Ici, nous sommes toujours sur le forum MySQL bien sûr, mais si tu t'investis dans le PHP et étant donné que l'API mysql_ a déjà été officiellement dépréciée au profit de mysqli_, cela peut t'éviter d'avoir à recommencer une fois encore à l'avenir.

Discussions similaires

  1. Selectionner l'option voulue dans select
    Par LeParrain735 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/01/2006, 23h45
  2. Réponses: 5
    Dernier message: 12/12/2005, 18h30
  3. procedure dans select
    Par RSBMW dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 17h07
  4. Lien dans select
    Par LeDoc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 02/08/2005, 11h39
  5. Ajout de critères dans Select utilisé par xp_sendmail
    Par bd0606 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 28/05/2004, 17h02

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