SQLSTATE[HY093]: Invalid parameter number: parameter was not de [Résolu/Fermé]

Signaler
Messages postés
255
Date d'inscription
mardi 10 novembre 2015
Statut
Membre
Dernière intervention
17 mai 2020
-
Messages postés
255
Date d'inscription
mardi 10 novembre 2015
Statut
Membre
Dernière intervention
17 mai 2020
-
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

Messages postés
11520
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
11 juillet 2020
659
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.
Messages postés
255
Date d'inscription
mardi 10 novembre 2015
Statut
Membre
Dernière intervention
17 mai 2020
10
Merci beaucoup, je n'ai plus d'erreur.
Pour
extract($_POST)

J'ai la fonction :
if (!function_exists('e')) {
  function e(String $string):string
  {
    if ($string) {
      $string = strip_tags($string);
      return htmlspecialchars($string);
    }
  }
}