mise à jour d'un enregistrement dans une table en poo avec pdo

a marqué ce sujet comme résolu.

Bonjour, voici mon code :

class/clientManager.php


class clientManager {

    private $_db;

    public function __construct(PDO $db) {

        $this->setDb($db);
    }

    public function setDb($dbh) {

        $this->_db = $dbh;
    }

    // Fonction qui a pour rôle de récupérer les emails de la base pour vérifier si un mail existe ou pas lors de l'inscription.

    public function getMail($email) {

        $sql = 'SELECT COUNT(id), email FROM client WHERE email = :email';

        $stmnt = $this->_db->prepare($sql);

        $stmnt->execute(array(':email' => $email));

        if($stmnt->fetchColumn() > 0) {

            return false;
        }
        else {

            return true;
        }
    }

    // Fonction qui a pour rôle d'insérer le client dans la table client si mail n'existe pas.

    public function addClient(Client $client) {

        $sql = 'INSERT INTO client (name, email) VALUES(:name, :email)';

        $name = htmlspecialchars($client->getName());
        $email = htmlspecialchars($client->getEmail());

        $stmnt = $this->_db->prepare($sql);

        $stmnt->bindParam(':name', $name);
        $stmnt->bindParam(':email', $email);

        if($stmnt->execute()) {

            return true;
        }
        else {

            return false;
        }
    }

    // Fonction qui a pour rôle de vérifier si le client existe ou pas lors de l'authentification (page login.php).

    public function getClient($name, $email) {

        $sql = 'SELECT COUNT(id), name, email FROM client WHERE name = :name AND email = :email';

        $stmnt = $this->_db->prepare($sql);

        $stmnt->execute(array(

            ':name' => $name,
            ':email' => $email
        ));

        if($stmnt->fetchColumn() > 0) {

            return true;
        }
        else {

            return false;
        }
    }

    public function getUserName($name) {

        $sql = 'SELECT name FROM client WHERE name = :name';

        $stmnt = $this->_db->prepare($sql);

        $stmnt->execute(array(':name' => $name));

        $row = $stmnt->fetch();

        return $row;
    }

    public function updateMail(Client $client) {

        $sql = 'UPDATE client SET email = :email WHERE email = :email';

        $email = htmlspecialchars($client->getEmail());

        $stmnt = $this->_db->prepare($sql);

        $stmnt->bindParam(':email', $email);

        if($stmnt->execute()) {

            return true;
        }
        else {

            return false;
        }
    }

class/Client.php


class Client {

    protected $id;
    protected $name;
    protected $email;

    protected static $error;
    
    const MSG_ERROR_ID = 'ID doit être un entier.';
    const MSG_ERROR_NAME = 'NOM doit être une chaîne de caractères.';
    const MSG_ERROR_EMAIL = 'EMAIL doit être une chaîne de caractères.';
    const MSG_ERROR_OBJET = 'L\'objet ne peut pas être crée.';

    public function __construct(array $data) {

        $this->setId($data['id']);
        $this->setName($data['name']);
        $this->setEmail($data['email']);

        if(!empty(self::$error)) {

            throw new Exception(self::$error . self::MSG_ERROR_OBJET);
        }
    }

    public function setError($msg) {

        self::$error = $msg;
    }

    public function getError() {

        return self::$error;
    }

    public function setId($id) {

        if((is_int($id)) AND ($id > 0)) {

            $this->id = $id;
        }
        else {

            $this->setError(self::MSG_ERROR_ID);
        }
    }

    public function setName($name) {

        if(is_string($name)) {

            $this->name = $name;
        }
        else {

            $this->setError(self::MSG_ERROR_NAME);
        }
    }

    public function setEmail($email) {

        if(is_string($email)) {

            $this->email = $email;
        }
        else {

            $this->setError(self::MSG_ERROR_EMAIL);
        }
    }

    public function getId() {

        return $this->id;
    }

    public function getName() {

        return $this->name;
    }

    public function getEmail() {

        return $this->email;
    }
}

includes/inc_connexion.php


try {

    $db = new PDO('mysql:host=localhost;dbname=hotels', 'root', '10111110');
}

catch(PDOException $e) {

    echo 'Erreur de connexion ' . $e->getMessage();
}

process/process_profil.php

require('../class/Client.php');
require('../includes/inc_connexion.php');
//require('../class/clientManager.php');

if(isset($_POST['submit_form'])) {

    if(isset($_POST['usermail_form'])) {

        $usermail_form = trim($_POST['usermail_form']);

        $new_mail = array(
            
            'id' => 1,
            'name' => $username_form,
            'email' => $usermail_form
        );

        $mail = new Client($new_mail);

        $manager = new clientManager($db);

        if(!$manager->getMail($usermail_form)) {

            $message = '<p class="error">C\'est Email est déjà pris !</p>';
        }
        else {

            $email = $manager->updateMail($mail);
            var_dump($email);
        }
    }
}

J’ai aucun message d’erreur, malgré ça l’email n’a pas été modifié.

Merci d’avance.

Salut,

Le soucis vient de ta fonction qui met à jour l’adresse de courriel.

    public function updateMail(Client $client) {
        $sql = 'UPDATE client SET email = :email WHERE email = :email';
        $email = htmlspecialchars($client->getEmail());
        $stmnt = $this->_db->prepare($sql);
        $stmnt->bindParam(':email', $email);
        if($stmnt->execute()) {
            return true;
        }
        else {
            return false;
        }
    }

Tu utilises un seul placeholder pour le courriel, alors que tu devrais en utiliser deux : un pour l’ancien courriel, et un pour le nouveau. Comme ta fonction n’a par ailleurs aucunement accès à l’ancienne adresse, elle ne peut sélectionner les enregistrements correspondant pour les mettre à jour : l’adresse n’est jamais modifiée.

Il faudrait que tu sélectionnes (clause WHERE) avec l’ancienne adresse de courriel, ou éventuellement avec un autre critère (tel qu’un identifiant unique).

P.-S. Quand tu demandes de l’aide sur un forum, je te conseille fortement de préférer spécifier précisément où est le problème, ce que tu as tenté de faire pour le corriger, ta démarche, etc., plutôt que de présenter des pavés de code sans aucune explication ou si peu (d’où les pouces rouges ;) ). Enfin, je dis ça pour toi =)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte