Update variable ko [Résolu]

Signaler
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021
-
Messages postés
32967
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2021
-
Bonjour,
le script plante sans arret malgré plusieurs modifs.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
session_start();
// connexion a la bdd
require_once 'config.php';
/* Initialisation de la variable du message de réponse*/
$err_inscription= null;
$avatar= "/avatars/0001.png";
$pdostat = $bdd->prepare('UPDATE membres SET avatar = :avatar WHERE pseudo = :yves');
$pdostat->bindValue(':avatar', $avatar, PDO::PARAM_STR);
//$pdostat->execute();
$pdostat->execute(array(
'avatar' => $avatar));
//if ($row = $pdostat->fetch(PDO::FETCH_ASSOC)) {
//$_SESSION['avatar'] == $row['avatar'];
$_SESSION['avatar'] == $avatar;

header('page_test.html');
exit;
//}
//else {
//$err_inscription[] = 'PROBLEME AVEC AVATAR';
//}
?>


le message d'erreur

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp64\www\register_av0001.php on line 15

Edit : correction des balises de code

8 réponses

Messages postés
3867
Date d'inscription
lundi 16 juillet 2007
Statut
Contributeur sécurité
Dernière intervention
13 juin 2021
1 391
Bonjour,

Comme indiqué dans le message d'erreur... "number of bound variables does not match number of tokens"
Vous avez bind
:avatar
mais vous n'avez pas bind
:yves
(d'ailleurs c'est sûrement une autre erreur, si le token a un nom logique alors vous devrez le nommer
:pseudo
).

Autre remarque, je suggère plutôt de faire la requête sur l'ID de l'utilisateur (la clé primaire que vous avez certainement mise en auto_increment). Vous ne voyez peut-être pas l'intérêt tout de suite, mais ça deviendra tout de suite indispensable si vous faites des jointures SQL.
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

le "yves" était placé ainsi pour tester en direct sans passer par une session.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
session_start();
// connexion a la bdd
require_once 'config.php';
/* Initialisation de la variable du message de réponse*/
$err_inscription= null;
$avatar= "/avatars/0001.png";
$pdostat = $bdd->prepare('UPDATE membres SET avatar = :avatar WHERE id = :id');
$pdostat->bindValue(':avatar', $avatar, PDO::PARAM_STR);
$pdostat->bindValue(':id', $id, PDO::PARAM_STR);
$pdostat->execute(array(
'avatar' => $avatar,
'id' => $id));
$_SESSION['avatar'] = $avatar;
header('page_test.html');
exit;
?>


Undefined variable: id in C:\wamp64\www\register_av0001.php on line 13
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

il ne trouve pas l'id, quand je mets pseudo dans la requète, il ne trouve pas non plus alors que étape précédente le pseudo (et id) ont bien été créé et sont en table.
Messages postés
32967
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2021
3 559 >
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

Bonjour,

Dans le code que tu nous montres ... il n'y a pas de trace de l'initialisation de ta variable $id .... ni de $pseudo ...

Ces données sont où ? En session peut être ??
Ou sinon .. comment tu arrives sur cette page ? Comment y passes tu l'id ? via l'url peut-être ?
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

Et bien oui, c'est exactement le problème; Je ne sais pas comment faire cette initialisation.
La page qui précède celle ci est l'étape "inscription" du membre....dont voici un bout

// INSERTION en bdd
$pdostat = $bdd->prepare("INSERT INTO membres (pseudo, password1, mail, sexe, date_inscription) VALUES(:pseudo, :password1, :mail, :sexe, NOW());");
$pdostat->bindvalue(':pseudo',$_POST['pseudo'],PDO::PARAM_STR);
$pdostat->bindvalue(':password1',password_hash($_POST["password1"],PASSWORD_DEFAULT ),PDO::PARAM_STR);
$pdostat->bindvalue(':mail',$_POST['mail'],PDO::PARAM_STR);
$pdostat->bindvalue(':sexe',$_POST['sexe'],PDO::PARAM_STR);
$pdostat->execute();
// Mise en SESSION
$_SESSION['id'] = $session_name['id'];
$_SESSION['pseudo'] = $_POST['pseudo'];
// on redirige vers l'espace avatar
header('Location:choix_avatar.php');
exit;
Messages postés
32967
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2021
3 559
Alors déjà ... quand tu postes du code sur le forum tu dois préciser le langage dans les balises...
Explications ( à lire ENTIEREMENT !! ) disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Ensuite, ben.. visiblement.. tu stockes l'id en SESSION ...

Donc sur ta page tu dois faire
<?php
session_start();

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// connexion a la bdd
require_once 'config.php';

$err_inscription= null;
$avatar= "/avatars/0001.png";
$id = !empty($_SESSION['id']) ? $_SESSION['id'] : NULL;
if($id){

   try{
     $pdostat = $bdd->prepare('UPDATE membres SET avatar = :avatar WHERE id = :id');
     $pdostat->bindValue(':avatar', $avatar, PDO::PARAM_STR);
     $pdostat->bindValue(':id', $id, PDO::PARAM_STR);
     $pdostat->execute();

      header('page_test.html');
      exit;
   }catch(Exception $e){
     echo "Erreur " . $e->getMessage();
   }

}


Et au passage, un peu de lecture pour tes prochains codes
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
et ça
https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

oups, désolé pour le code mal gaulé.
Il y a un mieux dans le script que tu m'a corrigé mais j'arrive sur une page blanche et aucune modif faite dans la table... je me demande si à la phase précédente (inscription) je n'ai pas un soucis au niveau de la mise en session? Notamment concernant l'id.
// INSERTION en bdd
			$pdostat =  $bdd->prepare("INSERT INTO membres (pseudo, password1, mail, sexe, date_inscription) VALUES(:pseudo, :password1, :mail, :sexe, NOW());");
$pdostat->bindvalue(':pseudo',$_POST['pseudo'],PDO::PARAM_STR);
$pdostat->bindvalue(':password1',password_hash($_POST["password1"],PASSWORD_DEFAULT ),PDO::PARAM_STR);
$pdostat->bindvalue(':mail',$_POST['mail'],PDO::PARAM_STR);
$pdostat->bindvalue(':sexe',$_POST['sexe'],PDO::PARAM_STR);
$pdostat->execute();
// Mise en SESSION
    	$_SESSION['id'] = $_SESSION['id'];
		$_SESSION['pseudo'] = $_POST['pseudo'];
			// on redirige vers l'espace avatar
			header('Location:choix_avatar.php');
			exit;
Messages postés
32967
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2021
3 559
Ben oui..

Tu ne trouves rien d'étrange dans ton code ??
$_SESSION['id'] = $_SESSION['id'];
	

Là, tu essayes de stocker le contenu de la variable de session id dans elle-même... Tu viens d'inventer le mouvement perpétuel ....en programmation....
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

Je me doutais bien que c'était incohérent...
Pour pseudo, c'est évident avec le "POST" puisque cela vient d'un formulaire.
Mais pour l'id, je ne sais pas comment faire.
Messages postés
32967
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2021
3 559
Fais une petite recherche sur internet avec les mots clés : pdo last insert id...
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

J'ai mis ceci après le execute

 $id = $bdd->lastInsertId();
Messages postés
32967
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2021
3 559
ça semble bien en effet...
Et donc ensuite.. tu as stocké ce $id en SESSION bien entendu.... ?!
Messages postés
73
Date d'inscription
dimanche 28 février 2021
Statut
Membre
Dernière intervention
6 mai 2021

$pdostat->execute();
	        $id = $bdd->lastInsertId();
			// Mise en SESSION
		$_SESSION['id'] = $id;