erreur invalid parameter number

Freidch

Freidch Le 20 septembre 2021 à 12:46

Bonjour a tous, Je rencontre des problèmes lors de l'exécution de ma requête. J'essaye de faire le tuto qui porte sur envoyer des messages privés.

L'erreur suivante s'affiche due à la ligne 13 : Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Voici mon code :

<?php
session_start();
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) 
{
    if(isset($_POST['envoi_message'])) 
    {
        if(isset($_POST['destinataire'],$_POST['message']) AND !empty($_POST['destinataire']) AND !empty($_POST['message'])) 
        {
            $destinataire = htmlspecialchars($_POST['destinataire']);
            $message = htmlspecialchars($_POST['message']);
            $id_destinataire = $bdd->prepare('SELECT id FROM membres WHERE nom = ? AND prenom = ?');
            $id_destinataire->execute(array($destinataire));
            $dest_exist = $id_destinataire->rowCount();

            if($dest_exist == 1)
            {
                $id_destinataire = $id_destinataire->fetch();
                $id_destinataire = $id_destinataire['id'];
                $ins = $bdd->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message) VALUES (?,?,?)');
                $ins->execute(array($_SESSION['id'],$id_destinataire,$message));
                $error = "Votre message a bien été envoyé !";
            } 
            else 
            {
                $error = "Cet utilisateur n'existe pas...";
            }
        } 
        else 
        {
            $error = "Veuillez compléter tous les champs";
        }
   }
   $destinataires = $bdd->query('SELECT nom, prenom FROM membres ORDER BY nom');

if(isset($_GET['r']) AND !empty($_GET['r']))
{
    $r = htmlspecialchars($_GET['r']);
}

?>

   <!DOCTYPE html>
   <html>
   <head>
      <title>Envoi de message</title>
      <meta charset="utf-8" />
   </head>
   <body>
      <form method="POST">
         <label>Destinataire : </label>
         <select name="destinataire">
         <?php if(isset($r)) { echo 'value="salut"'; } ?>
            <?php while($d = $destinataires->fetch()) { ?>
            <option><?= $d['nom']; echo ' '; echo $d['prenom']; ?></option>
            <?php } ?>
         </select> 
         <br /><br />
         <textarea placeholder="Votre message" name="message"></textarea>
         <br /><br />
         <input type="submit" value="Envoyer" name="envoi_message" />
         <br /><br />
         <?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } ?>
      </form>
      <br />
      <a href="reception.php">Boîte de réception</a><br><br><br>
      <a href="profil.php?id=<?= $_SESSION['id']?>">Page de profil</a><br><br><br>
   </body>
   </html>
<?php
}
?>

Merci d'avance pour votre aide

Nooaah

Nooaah Le 21 septembre 2021 à 16:05 (Édité le 21 septembre 2021 à 16:05)

Bonjour,

Ta requête prepare possède 2 paramètre, mais tu n'en bindes qu'une seule.

$id_destinataire = $bdd->prepare('SELECT id FROM membres WHERE nom = ? AND prenom = ?');
$id_destinataire->execute(array($destinataire));

Doit donc être remplacé par :

$id_destinataire = $bdd->prepare('SELECT id FROM membres WHERE nom = ? AND prenom = ?');
$id_destinataire->execute(array($nom, $prenom));

Ou alors, si tu ne possèdes pas ces 2 variables, dans ce cas remplacer par :

$id_destinataire = $bdd->prepare('SELECT id FROM membres WHERE destinataire = ?');
$id_destinataire->execute(array($destinataire));

Bonne journée

Freidch

Freidch Le 1 octobre 2021 à 10:02

Salut Noah, Tout d'abord merci pour ta réponse. Lorsque je remplace mon array($destinataire) par array($nom, $prenom), ca me dit que $nom et $prenom sont inconnus. Lorsque j'essaye ta 2e proposition, il n'arrive pas a trouver les membres entrés dans la base de données. Aurais-tu une solution à me proposer ? Je te remercie pour ton aide :)

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte