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 :

Ma requête paramétrée provoque une erreur "number of bound variables does not match number of tokens"


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Ma requête paramétrée provoque une erreur "number of bound variables does not match number of tokens"
    Bonjour,
    Dans la requête ci-dessous, j'ai l'erreur
    number of bound variables does not match number of tokens
    Pourtant ma requête comporte deux paramètres dans la requête et deux paramètres dans le tableau des variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function searchPersons(int $idAbo, string $qString): array|false {
    	$db = dbConnect();
     
    	$sql = <<<SQL
    	SELECT id, lastname, firstname, CONCAT( COALESCE(birthday, '--'), '/', COALESCE(birthmonth, '--'), '/', COALESCE(birthyear, '----') ) AS birthdate,
    	CONCAT(id, lastname, firstname, birthdate) AS searchString
    	FROM dat_persons
    	WHERE id_abo=:id_abo AND searchString LIKE '%:qString%'
    	SQL;
    	$stmt = $db->prepare($sql);
    	$stmt->execute([':id_abo'=>$idAbo, ':qString'=>$qString]);
    	return $stmt->fetchAll();
    }

  2. #2
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 435
    Par défaut
    Bonjour,

    Essaye comme cet exemple : https://www.php.net/manual/en/pdosta...p#example-1099

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	$sql = <<<SQL
    	SELECT id, lastname, firstname, CONCAT( COALESCE(birthday, '--'), '/', COALESCE(birthmonth, '--'), '/', COALESCE(birthyear, '----') ) AS birthdate,
    	CONCAT(id, lastname, firstname, birthdate) AS searchString
    	FROM dat_persons
    	WHERE id_abo=:id_abo AND searchString LIKE :qString
    	SQL;
    	$stmt = $db->prepare($sql);
    	$stmt->execute([':id_abo' => $idAbo, ':qString' => '%' . $qString . '%']);

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    L'erreur n'est plus la même. J'ai maintenant une erreur de syntaxe ou de violation d'accès, quelque soit les écriture suivantes en alternative:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Version 1
    $stmt->execute([':id_abo'=>$idAbo, ':qString'=>'%'.$qString.'%']);	// erreur près de ''%erle%''' (bizarre les différents quotes)
    // Version 2
    $stmt->execute([':id_abo'=>$idAbo, ':qString'=>"%$qString%", ]);	// erreur près de ''%erle%''' (bizarre les différents quotes)
    // Version 3
    $qString = "%qString%";
    $stmt->execute( ['id_abo'=>$idAbo, ':qString'=>$qString, ] );		// erreur près de ''%qString%''' (bizarre les différents quotes)

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    Je ne sais pas ce qu'est $db
    Avec PDO::MySQL ceci fonctionne :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function searchPersons(int $idAbo, string $qString): array|false
    {
        $db = dbConnect();
        $sql = <<<SQL
            SELECT
                id, lastname, firstname,
                CONCAT(COALESCE(birthday, '--'), '/', COALESCE(birthmonth, '--'), '/', COALESCE(birthyear, '----')) AS birthdate,
                CONCAT(id, lastname, firstname, birthdate) AS searchString
            FROM dat_persons
            WHERE id_abo = :id_abo AND searchString LIKE CONCAT('%, :qString, '%')
            SQL;
        $stmt = $db->prepare($sql);
        $stmt->execute([':id_abo' => $idAbo, ':qString' => $qString]);
        return $stmt->fetchAll();
    }

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    $db est la connexion à la base de données utilisée dans toutes mes fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function dbConnect(): PDO
    {
    	$db = new PDO(DB_DSN, DB_USER, DB_PW);
    	$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	return $db;
    }
    J'ai un fichier de configuration (en ligne ou local) qui définie les différentes constantes DB_* et je ne change rien d'autre selon que je sois en ligne ou en local.

    J'ai voulu tester ta requête et je tombe sur de nouvelles erreurs. MySQL ne reconnait pas les champs définis dans la requête avec AS comme birthdate et searchString.
    Column not found: 1054 Champ 'searchString' inconnu dans where clause

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    OK je n'avais pas fait attention à searchString qui est une colonne calculée.

    Correction :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ALL
        id, lastname, firstname,
        CONCAT(COALESCE(birthday, '--'), '/', COALESCE(birthmonth, '--'), '/', COALESCE(birthyear, '----')) AS birthdate,
        CONCAT(id, lastname, firstname, birthdate) AS searchString
    FROM dat_persons
    WHERE TRUE
        AND id_abo = :id_abo
        AND CONCAT(id, lastname, firstname, birthdate) LIKE CONCAT('%', :qString, '%')

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/02/2020, 11h40
  2. [MySQL] Erreur SQL : number of bound variables does not match number of tokens
    Par legrandse dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/12/2018, 11h11
  3. [PDO] Invalid parameter number: number of bound variables does not match number of tokens
    Par gotcha5832 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/03/2016, 09h20
  4. Réponses: 6
    Dernier message: 01/07/2011, 17h06
  5. [MySQL] Number of bound variables does not match number of tokens
    Par grenoult dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/04/2010, 09h18

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