Update variable ko
Résolu
nestor94
Messages postés
74
Statut
Membre
-
jordane45 Messages postés 30426 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 30426 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
le script plante sans arret malgré plusieurs modifs.
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
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
-
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. -
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 -
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; -
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-poster-un-extrait-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://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
et ça
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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; -
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. -
J'ai mis ceci après le execute
$id = $bdd->lastInsertId();
-
$pdostat->execute(); $id = $bdd->lastInsertId(); // Mise en SESSION $_SESSION['id'] = $id;