SQLSTATE[HY093]: Invalid parameter number: parameter was not de

Résolu/Fermé
chabinot Messages postés 322 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 27 août 2024 - 17 déc. 2017 à 09:50
chabinot Messages postés 322 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 27 août 2024 - 17 déc. 2017 à 10:31
Bonjour,
Voici les sources :
1 - profile.php
// Traitement du formulaire soumis
if (isset($_POST['update'])) {
 // Tous les champs ont été remplis ?
  if (not_empty(['name', 'city', 'country', 'sex', ])) {
    extract($_POST);
    $req = $bdd->prepare(
      "UPDATE users
              SET name = :name, city = :city, country = :country,
              sex = :sex, twitter = :twitter, github = :github,
              available_for_hiring = :available_for_hiring, bio = :bio
              WHERE id = :id",
      ['name' => $name, 'city' => $city, 'country => $country',
       'sex'  => $sex, 'twitter' => $twitter, 'github' => $github,
        'available_for_hiring' => !empty($available_for_hiring) ? '1' : '0',
        'bio' => $bio, 'id' => get_session('user_id')
      ]);

    set_flash("Votre profil a été mis à jour", "success");
  } else {
    $error = $errors->setError("Veuillez remplir tous les champs marqués d'un (*).");
    save_input_data();
  }
}

2 - Source du formulaire :
<form data-parsley-validate method="post" autocomplete="off">
              <div class="row">
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="name">Nom <span class="text-danger">*</span></label>
                    <input type="text" name="name" id="name" class="form-control" placeholder="Votre nom" required="required">
                  </div>
                </div>
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="city">Ville <span class="text-danger">*</span></label>
                    <input type="text" name="city" id="city" class="form-control" placeholder="Ville" required="required">
                  </div>
                </div>
              </div>
              <div class="row">
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="country">Pays <span class="text-danger">*</span></label>
                    <input type="text" name="country" id="country" class="form-control" placeholder="Pays" required="required">
                  </div>
                </div>
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="sex">Genre <span class="text-danger">*</span></label>
                    <select name="sex" id="sex" class="form-control" required="required">
                      <option value="H">Homme</option>
                      <option value="F">Femme</option>
                    </select>
                  </div>
                </div>
              </div>
              <div class="row">
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="twitter">Twitter</label>
                    <input type="text" name="twitter" id="twitter" class="form-control">
                  </div>
                </div>
                <div class="col-md-6">
                  <div class="form-group">
                    <label for="github">Github</label>
                    <input type="text" name="github" id="github" class="form-control">
                  </div>
                </div>
              </div>
              <div class="row">
                <div class="col-md-12">
                  <div class="form-group">
                    <label for="available_for_hiring"></label>
                    <input type="checkbox" name="available_for_hiring" id="available_for_hiring">
                    Disponible pour emploi?
                  </div>
                </div>
              </div>
              <div class="row">
                <div class="col-md-12">
                  <div class="form-group">
                    <label for="bio">Biographie <span class="text-danger">*</span></label>
                    <textarea name="bio" id="bio" cols="30" rows="10" class="form-control" placeholder="Je suis amoureux de la programmation..." required="required"></textarea>
                  </div>
                </div>
              </div>
              <input type="submit" class="btn btn-primary" value="Valider" name="update">
            </form>

3 - Source de la classe Database.php
<?php

class Database
{
  private $db_host        = 'localhost';
  private $db_name        = 'boom'; 
  private $db_port        = 3309;
  private $db_charset     = 'utf8';
  private $db_user        = 'root';
  private $db_password    = '';
  private $dsn;
  private $pdo;
  private $error;

  public function __construct()
  {
    $this->dsn = "mysql:host={$this->db_host};dbname={$this->db_name};port={$this->db_port};charset={$this->db_charset}";
    try {
      $this->pdo = new PDO($this->dsn, $this->db_user, $this->db_password);
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
      echo $this->error = 'Erreur: ' . $e->getMessage();
    }
  }

  public function prepare(String $stmt, Array $fields = []) {
    $req = $this->pdo->prepare($stmt);
    var_dump($fields);
    $req->execute($fields);

    return $req;
  }

  public function is_already_in_use(String $field, String $value, String $table):bool
  {
    $req = $this->pdo->prepare("SELECT id FROM $table WHERE $field = ?");
    $req->execute([$value]);
    $count = $req->rowCount();
    $req->closeCursor();

    return $count;
  }

}

Image de la table users

Et enfin le message que j'ai quand je lance le formulaire :
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in D:\serveur\www\boom\class\Database.php:29 Stack trace: #0 D:\serveur\www\boom\class\Database.php(29): PDOStatement->execute(Array) #1 D:\serveur\www\boom\profile.php(46): Database->prepare('UPDATE users\r\n ...', Array) #2 {main} thrown in D:\serveur\www\boom\class\Database.php on line 29
J'ai beau retourné le problème dans tous les sens, je ne trouve pas l'erreur que j'ai pu faire.
Si vous avez une idée ?
Cordialement

2 réponses

yg_be Messages postés 23348 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 novembre 2024 Ambassadeur 1 554
Modifié le 17 déc. 2017 à 10:03
bonjour,
'country => $country'

me semble incorrect

par ailleurs, je ne comprends pas pourquoi tu testes ceci:
if (not_empty(['name', 'city', 'country', 'sex', ]))


et il est recommandé de ne pas faire
extract($_POST);
car cela permet à des utilisateurs malveillants de pirater ton site.
0