Page 1 sur 1

Invalid parameter number: number of bound variables does not match number of tokens

Posté : 24 mars 2017, 18:18
par yoann38
Salut,
Voilà j'ai décidé de tester la lecture d'un fichier CSV.
Ca l'air pas mal cependant je me retrouve avec un message d'erreur et seul la première ligne s'insère sur certaines entrées.

Message d'erreur:
Invalid parameter number: number of bound variables does not match number of tokens
	$fichier = 'datafeed_325105.csv';
	
	$csv = new SplFileObject($fichier);
	$csv->setFlags(SplFileObject::READ_CSV);
	$csv->setCsvControl(',');
	
	// Parcourt du fichier CSV + stockage variables
	foreach($csv as $ligne){
	
		// Attribution de la valeur pour Ticketmaster 
    	$id_simply_user = '1000';	
		$tracker = $ligne[0]; // Tracker
		$titre = $ligne[1]; // Nom de l'évènement
		$number =  $ligne[3]; // Id de l'évènement
		$price =  $ligne[30]; // Prix	
		$photo =  $ligne[4]; // Miniature de l'image de l'annonce
		$description =  $ligne[5]; // Texte de l'annonce
		
		$nom_categorie =  $ligne[10]; // Exemple : Tennis
		
		$mise_a_jour =  $ligne[18];
		$artiste_1 =  $ligne[22];
		$date_debut_sortie =  $ligne[23];
		$horaire = substr($date_debut_sortie,  10);
		$manufacturer =  $ligne[25];
		$street =  $ligne[26];
		$catégorie =  $ligne[28];
		$longitude =  $ligne[32];
		$latitude  =  $ligne[33];
		$city =  $ligne[35];
		$postcode =  $ligne[36];
		$departement = substr($postcode, 0, 2);  // Exemple : 38
		$pays =  $ligne[37];
		
		// On valide la sortie par default
    	$valide = '1';	
		
		// Région
		$region = regionIdByDepartement($departement);
		
		$date_debut_sortie = substr($date_debut_sortie, 0,-10);  // retourne "abcde"
		

		// Si il n y a pas de date de fin de renseignée on attribut la date de début
		if(empty($ligne[39])) {
			$date_fin_sortie =  $date_debut_sortie;	
		}else{
			$ligne[39];
		}

		
        // Requete pour calculer le nombre d'annonces en cours de validité
        $sql = "SELECT id_loisirs FROM loisirs WHERE number ='".$number."'";
        $req = $bdd->query($sql);
        $nbResult = $req->rowCount();
             
        //Entrée déjà existante
        if ($nbResult > 0) {  
        echo '"'.$number.'" existe déjà en '.$nbResult.' exemplaire(s)';
        } else { //  libre
             

       // Insertion
       $req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,price,photo,tracker,id_region,id_departements,postcode,longitude,latitude,city,manufacturer,street,horaire,description,number,date_debut_sortie,valide) VALUES ('$id_simply_user','$titre','$price','$photo','$tracker','$region','$departement','$postcode','$longitude','$latitude','$city','$manufacturer','$street','$horaire','$description','$number','$date_debut_sortie','$valide')");
        $req->execute(array(
             
                      'id_simply_user'=>$id_simply_user,
                      'titre'=>$titre,
                      'price'=>$price,
                      'photo'=>$photo,
                      'tracker'=>$tracker,
					  'id_region'=>$region,
					  'postcode'=>$postcode,
					  'longitude'=>$longitude,
					  'latitude'=>$latitude,
					  'city'=>$city,
					  'manufacturer'=>$manufacturer,
					  'street'=>$street,
					  'horaire'=>$horaire,
					  'id_departements'=>$departement,
					  'description'=>$description,
					  'number'=>$number,
                      'date_debut_sortie'=>$date_debut_sortie,
                      'valide'=>$valide
                      )) or die('Problème lors de l\'insertion');
            }
	}
?>
Merci à vous

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 24 mars 2017, 19:35
par Spols
tu utilise une requète préparée sans utiliser son principe.

ton erreur dis que le nombre de paramètres donnée à la requète ne correspond pas au nombre de paramètre de ta requète.

alors soit tu retire l'array de paramètres de ton execute soit (et c'est la solution à préferré) tu transforme ta requète pour qu'elle utilise le principe de la préparation.
dans le dernier cas, remplace les $ par des : dans ta requète et ajoute un : avant chaque paramètre de ton array dans ton execute. inspire toi de la doc
http://php.net/manual/fr/pdo.prepare.php

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 25 mars 2017, 16:09
par yoann38
?
et ajoute un : avant chaque paramètre de ton array dans ton execute.
Quelque chose comme ça ?
       // Insertion
$req = $bdd->prepare("INSERT INTO `loisirs` (:id_simply_user,:titre,:price,:photo,:tracker,:id_region,:id_departements,:postcode,:longitude,:latitude,:city,:manufacturer,:street,:horaire,:description,:number,:date_debut_sortie,:valide) VALUES ('$id_simply_user','$titre','$price','$photo','$tracker','$region','$departement','$postcode','$longitude','$latitude','$city','$manufacturer','$street','$horaire','$description','$number','$date_debut_sortie','$valide')");
        $req->execute(array(
             
                      'id_simply_user'=>$id_simply_user,
                      'titre'=>$titre,
                      'price'=>$price,
                      'photo'=>$photo,
                      'tracker'=>$tracker,
					  'id_region'=>$region,
					  'postcode'=>$postcode,
					  'longitude'=>$longitude,
					  'latitude'=>$latitude,
					  'city'=>$city,
					  'manufacturer'=>$manufacturer,
					  'street'=>$street,
					  'horaire'=>$horaire,
					  'id_departements'=>$departement,
					  'description'=>$description,
					  'number'=>$number,
                      'date_debut_sortie'=>$date_debut_sortie,
                      'valide'=>$valide
                      )) or die('Problème lors de l\'insertion');
            }
	}
?>
Merci pour le coup de pouce

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 25 mars 2017, 17:40
par Spols
Non ceci:
$req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,price,photo,tracker,id_region,id_departements,postcode,longitude,latitude,city,manufacturer,street,horaire,description,number,date_debut_sortie,valide) VALUES (':id_simply_user',':titre',':price',':photo',':tracker',':region',':departement',':postcode',':longitude',':latitude',':city',':manufacturer',':street',':horaire',':description',':number',':date_debut_sortie',':valide')");
        $req->execute(array(
             
                      ':id_simply_user'=>$id_simply_user,
                      ':titre'=>$titre,
                      ':price'=>$price,
                      ':photo'=>$photo,
                      ':tracker'=>$tracker,
            ':id_region'=>$region,
            ':postcode'=>$postcode,
            ':longitude'=>$longitude,
            ':latitude'=>$latitude,
            ':city'=>$city,
            ':manufacturer'=>$manufacturer,
            ':street'=>$street,
            ':horaire'=>$horaire,
            ':id_departements'=>$departement,
            ':description'=>$description,
            ':number'=>$number,
                      ':date_debut_sortie'=>$date_debut_sortie,
                      ':valide'=>$valide
                      )) or die('Problème lors de l\'insertion');

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 25 mars 2017, 18:12
par yoann38
Ok effectivement c'est peut etre mieux comme ça, ceci dit le champ entrée en bdd pour chaque valeur est le parametre passé.
J'entends par cela que en gros en bdd :

Au lieu d'avoir en titre : le beau jardin j'ai :titre.

Et ce pour chaque parametre....
	<?php
    include("include/conndb.php");
    include("include/variables.php");

	$fichier = 'datafeed_325105.csv';
	
	$csv = new SplFileObject($fichier);
	$csv->setFlags(SplFileObject::READ_CSV);
	$csv->setCsvControl(',');
	
	// Parcourt du fichier CSV + stockage variables
	foreach($csv as $ligne){
	
		// Attribution de la valeur pour Ticketmaster 
    	$id_simply_user = '1000';	
		$tracker = $ligne[0]; // Tracker
		$titre = $ligne[1]; // Nom de l'évènement
		$number= str_replace(' ', '',$ligne[3]); // Id de l'évènement
		$price =  $ligne[30]; // Prix	
		$photo =  $ligne[4]; // Miniature de l'image de l'annonce
		$description =  $ligne[5]; // Texte de l'annonce
		
		$nom_categorie =  $ligne[10]; // Exemple : Tennis
		
		$mise_a_jour =  $ligne[18];
		$artiste_1 =  $ligne[22];
		$date_debut_sortie =  $ligne[23];
		$horaire = substr($date_debut_sortie,  10);
		$manufacturer =  $ligne[25];
		$street =  $ligne[26];
		$catégorie =  $ligne[28];
		$longitude =  $ligne[32];
		$latitude  =  $ligne[33];
		$city =  $ligne[35];
		$postcode =  $ligne[36];
		$departement = substr($postcode, 0, 2);  // Exemple : 38
		$pays =  $ligne[37];
		
		// On valide la sortie par default
    	$valide = '1';	
		
		// Région
		$region = regionIdByDepartement($departement);
		
		$date_debut_sortie = substr($date_debut_sortie, 0,-10);  // retourne "abcde"
		

		// Si il n y a pas de date de fin de renseignée on attribut la date de début
		if(empty($ligne[39])) {
			$date_fin_sortie =  $date_debut_sortie;	
		}else{
			$ligne[39];
		}

		
        // Requete pour calculer le nombre d'annonces en cours de validité
        $sql = "SELECT id_loisirs FROM loisirs WHERE number = '".$number."'";
        $req = $bdd->query($sql);
        $nbResult = $req->rowCount();
             
        //Entrée déjà existante
        if ($nbResult > 0) {  
        echo '"' . $number. '" existe déjà en ' . $nbResult . ' exemplaire(s)';
        } else { //  libre
             
             

       // Insertion
      $req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,price,photo,tracker,id_region,id_departements,postcode,longitude,latitude,city,manufacturer,street,horaire,description,number,date_debut_sortie,valide) VALUES (':id_simply_user',':titre',':price',':photo',':tracker',':region',':departement',':postcode',':longitude',':latitude',':city',':manufacturer',':street',':horaire',':description',':number',':date_debut_sortie',':valide')");
        $req->execute(array(
             
            ':id_simply_user'=>$id_simply_user,
            ':titre'=>$titre,
            ':price'=>$price,
            ':photo'=>$photo,
            ':tracker'=>$tracker,
            ':id_region'=>$region,
            ':postcode'=>$postcode,
            ':longitude'=>$longitude,
            ':latitude'=>$latitude,
            ':city'=>$city,
            ':manufacturer'=>$manufacturer,
            ':street'=>$street,
            ':horaire'=>$horaire,
            ':id_departements'=>$departement,
            ':description'=>$description,
            ':number'=>$number,
            ':date_debut_sortie'=>$date_debut_sortie,
            ':valide'=>$valide
            )) or die('Problème lors de l\'insertion');
			
       }
	}
?>

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 25 mars 2017, 19:42
par Spols
ah oui il faut que tu enlève les ' autour des paramètre pdo s'en chargera

$req = $bdd->prepare("INSERT INTO `loisirs` (id_simply_user,titre,price,photo,tracker,id_region,id_departements,postcode,longitude,latitude,city,manufacturer,street,horaire,description,number,date_debut_sortie,valide) VALUES (:id_simply_user,:titre,:price,:photo,:tracker,:region,:departemen,:postcode,:longitude,:latitude,:city,:manufacturer,:street,:horaire,:description,:number,:date_debut_sortie,:valide)");

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 25 mars 2017, 20:20
par yoann38
Heu....
Au risque de passé pour un âne c'est bien ce que j'ai fait et pourtant il me dit que :
Invalid parameter number: parameter was not defined

On voit ds mon code pourtant :
$number= $ligne[3]; // Id de l'évènement
<?php
    include("include/conndb.php");
    include("include/variables.php");

	$fichier = 'datafeed_325105.csv';
	
	$csv = new SplFileObject($fichier);
	$csv->setFlags(SplFileObject::READ_CSV);
	$csv->setCsvControl(',');
	
	// Parcourt du fichier CSV + stockage variables
	foreach($csv as $ligne){
	
		// Attribution de la valeur pour Ticketmaster 
    	$id_simply_user = '1000';	
		$tracker = $ligne[0]; // Tracker
		$titre = $ligne[1]; // Nom de l'évènement
		$number= $ligne[3]; // Id de l'évènement
		$price =  $ligne[30]; // Prix	
		$photo =  $ligne[4]; // Miniature de l'image de l'annonce
		$description =  $ligne[5]; // Texte de l'annonce
		
		$nom_categorie =  $ligne[10]; // Exemple : Tennis
		
		$mise_a_jour =  $ligne[18];
		$artiste_1 =  $ligne[22];
		$date_debut_sortie =  $ligne[23];
		$horaire = substr($date_debut_sortie,  10);
		$manufacturer =  $ligne[25];
		$street =  $ligne[26];
		$catégorie =  $ligne[28];
		$longitude =  $ligne[32];
		$latitude  =  $ligne[33];
		$city =  $ligne[35];
		$postcode =  $ligne[36];
		$departement = substr($postcode, 0, 2);  // Exemple : 38
		$pays =  $ligne[37];
		
		// On valide la sortie par default
    	$valide = '1';	
		
		// Région
		$region = regionIdByDepartement($departement);
		
		$date_debut_sortie = substr($date_debut_sortie, 0,-10);  // retourne "abcde"
		

		// Si il n y a pas de date de fin de renseignée on attribut la date de début
		if(empty($ligne[39])) {
			$date_fin_sortie =  $date_debut_sortie;	
		}else{
			$ligne[39];
		}

		
        // Requete pour calculer le nombre d'annonces en cours de validité
        $sql = "SELECT id_loisirs FROM loisirs WHERE number = '".$number."'";
        $req = $bdd->query($sql);
        $nbResult = $req->rowCount();
             
        //Entrée déjà existante
        if ($nbResult > 0) {  
        echo '"' . $number. '" existe déjà en ' . $nbResult . ' exemplaire(s)';
        } else { //  libre
		

$req = $bdd->prepare('INSERT INTO loisirs(id_simply_user,titre,price,photo,tracker,id_region,id_departements,postcode,longitude,latitude,city,manufacturer,street,horaire,description,number,date_debut_sortie,valide) VALUES(:id_simply_user,:titre,:price,:photo,:tracker,:region,:departement,:postcode,:longitude,:latitude,:city,:manufacturer,:street,:horaire,:description,:number,:date_debut_sortie,:valide)');




        $req->execute(array(   
            'id_simply_user'=>$id_simply_user,
            'titre'=>$titre,
            'price'=>$price,
            'photo'=>$photo,
            'tracker'=>$tracker,
            'id_region'=>$region,
			'id_departements'=>$departement,
            'postcode'=>$postcode,
            'longitude'=>$longitude,
            'latitude'=>$latitude,
            'city'=>$city,
            'manufacturer'=>$manufacturer,
            'street'=>$street,
            'horaire'=>$horaire,
            'description'=>$description,
            'number'=>$number,
            'date_debut_sortie'=>$date_debut_sortie,
            'valide'=>$valide
            )) or die('Problème lors de l\'insertion');
			
       }
	}
?>

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 25 mars 2017, 21:26
par Spols
tu as :region et :id_region pareil pour departement il faut harmoniser

et aussi mettre le : devant tes paramètres

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 26 mars 2017, 12:15
par yoann38
Bon j'ai trouvé le problème mais n'arrive pas à le résoudre .

En fait le problème pour l'INSERT en bdd vient de $departement, $id_region si je ne met pas ces variables dans mon prepare et execute tout s'insère bien mais si je les mets j'ai le fameux messafe d'erreur en question.

Donc pour récupérér le contenu de ses variables procéde ainsi :
$postcode =  $ligne[36]; // Exmple : 38100
$departement = substr($postcode, 0, 2);  // Exemple : 38

// Région
$region = regionIdByDepartement($departement);
regionIdByDepartement fonctionne correctement je vous rassure ;)

Donc voila mon fameux problème :
Invalid parameter number: number of bound variables does not match number of tokens

Re: Invalid parameter number: number of bound variables does not match number of tokens

Posté : 26 mars 2017, 18:37
par Spols
si ton code est toujours le même, j'ai pointé le doigt dessus,

tu met une fois :departement dans ta trequète préparé et id_departement dans ton tableau de correspondance. si tu harmonise le tout cela marchera mieux

(idem pour région)

Et comme il semble qu'il faille toujours mettre le code
$req->execute(array(   
            'id_simply_user'=>$id_simply_user,
            'titre'=>$titre,
            'price'=>$price,
            'photo'=>$photo,
            'tracker'=>$tracker,
            'region'=>$region,
      'departement'=>$departement,
            'postcode'=>$postcode,
            'longitude'=>$longitude,
            'latitude'=>$latitude,
            'city'=>$city,
            'manufacturer'=>$manufacturer,
            'street'=>$street,
            'horaire'=>$horaire,
            'description'=>$description,
            'number'=>$number,
            'date_debut_sortie'=>$date_debut_sortie,
            'valide'=>$valide
            )) or die('Problème lors de l\'insertion');
Ps j'ai enlevé aussi le s de département