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

Mammouth du PHP | 643 Messages

24 mars 2017, 18:18

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

Mammouth du PHP | 1967 Messages

24 mars 2017, 19:35

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

25 mars 2017, 16:09

?
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

Mammouth du PHP | 1967 Messages

25 mars 2017, 17:40

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');
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

25 mars 2017, 18:12

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');
			
       }
	}
?>

Mammouth du PHP | 1967 Messages

25 mars 2017, 19:42

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)");
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

25 mars 2017, 20:20

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');
			
       }
	}
?>

Mammouth du PHP | 1967 Messages

25 mars 2017, 21:26

tu as :region et :id_region pareil pour departement il faut harmoniser

et aussi mettre le : devant tes paramètres
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

26 mars 2017, 12:15

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

Mammouth du PHP | 1967 Messages

26 mars 2017, 18:37

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube