[RESOLU] Erreur SQL : Integrity constraint violation

Avatar du membre
Mammouth du PHP | 1609 Messages

13 févr. 2021, 19:03

Salut Beepbeepc,

En fait ton problème de départ est que tu fournis à UserTable::createUser(User $user) un $user tout juste initialisé ($user = new User();) avec des propriétés qui sont donc égales à null.
Tu dois définir les valeurs de ces propriétés à l'aide des setters avant de faire appel à la méthode createUser.

PS : tu vas avoir d'autres erreurs derrière. Par exemple le if ($user) dans le createUser, étant donné que tu fournis un User en paramètre de la méthode, la condition sera toujours true.
Si tu veux savoir si le username est déjà pris, il faut bien qu'à un moment tu fasses un select sur la table pour voir si il te retourne une ligne.
Théoriquement à la vue de ton code, tu devrais mettre ce test dans la méthode createUser avant l'appel du create.
Développeur web depuis + de 20 ans

Eléphant du PHP | 88 Messages

14 févr. 2021, 08:57

Salut à tous
salut Saian

merci pour ces infos : donc (bon je suis pas douée) ca veux dire que je dois instancier mon objet avant et ensuite
je mets mes setters (existant dans ma class user) pour dire voilà je veux que tu affectes une valeur username et password?
mais dans ce cas là ou je comprend pas la logique c'est donc pourquoi dans la fonction creation là on la fait avec les getters , qui eux ne font que lire? il faut bien affecter la valeur avant? desolee je veux juste comprendre
public function createUser(User $user)
    {
        $id = $this->create([
    'username' => $user->getUsername(),
    'password' => $user->getPassword(),
    'is_admin' => 0,]);
        $user->setId($id);
        if ($user) {
            $errors['username']= 'psuedo exist';
est ce que tes explications veulent bien m'expliquer que je dois rajouter les setters comme cela?
$user = new User();
$user->setCreateUser($username);
$user->setPassword($password);
je prefere passer une une ignorante et apprendre ,, car l ignorante apres sera savante :)
merci bcp en tout cas ! j'ai vraiment envie d'arriver

Mammouth du PHP | 2703 Messages

14 févr. 2021, 13:35

dans un script, pour afficher un formulaire permettant de la création :
$user = new User();
$user->printHtmlForm(); // va afficher un formulaire permettant de modifier les données d'un user vide

script d'écriture :
$user = new User();
$user->populateFromPost(); // va appeler les différents setter à partir des données du formulaire
$user->save(); // teste si l'objet a un id, si ce n'est pas le cas, exécute une requete sql insert, récupère l'id, dans tous les cas, éxécute une requête sql update

dans un autre script, en lecture :
$user = new User();
$user->populateFromDb($iduser); // va appeler les différents setter à partir du contenu de la bdd
echo $user->getUsername(); // afficher l'username
$user->printHtmlForm(); // va afficher un formulaire permettant de modifier les données d'un user

// à nouveau le script d'écriture

Avatar du membre
Mammouth du PHP | 1609 Messages

14 févr. 2021, 18:02

Bonjour beepbeepc,

Alors je dirai que oui, l'idée c'est d'instancier un nouveau user ($user = new User()), d'affecter les valeurs aux propriétés à partir des données du formulaires ($user->setUsername($_POST['username']), etc) puis de donner l'instance du user "hydraté" à la classe UserTable qui sert à faire l'interface entre ta représentation objet du user et la base de données. Il est donc logique que dans le createUser tu fasses appel aux getters de l'objet.

Après pourquoi faire comme ceci ou comme cela, c'est plus une question de comment tu architectures et structures tes classes et ton code. On pourrait dire qu'il y a autant de manières de faire qu'il y a de développeurs bien qu'il y ait tout de même des bonnes pratiques et des mauvaises pratiques.

PS :

Pour compléter, tu pourrais imaginer devoir transmettre toutes les colonnes obligatoires pour pouvoir persister ton utilisateur à son constructeur (new User($username, $password); ou encore new User(['username' => $username, 'password' => $password])). Pas sur que ce soit forcément géniale, à réfléchir. Tu pourrais aussi passer les données au createUser au lieu de lui passer un User. Comme je disais au dessus, y a pas qu'une manière de faire, le tout c'est de bien réfléchir à ce que tu veux faire, de bien définir le rôle de chacune des classes pour éviter de terminer avec un code mal organisé difficile à maintenir et faire évoluer.

Étant donnée que tu as une classe UserTable qui donc en toute logique devrait s'occuper de l'interface entre la représentation objet des données et la table dans la base de données, tu devrais avoir sur ta classe UserTable les méthodes permettant de mettre à jour une ligne, supprimer une ligne et récupérer une ligne. Les méthodes de création, modification et suppression vont en toute logique travailler avec des objets déjà hydratés tandis que la méthode de récupération va elle récupérer les données, créer une instance et l'hydrater pour retourner la représentation objet de la ligne.
Ca ne reste que des conseils, à toi de voir avec quelle structure de code et de classes tu es à l'aise.
Développeur web depuis + de 20 ans

Eléphant du PHP | 88 Messages

14 févr. 2021, 20:03

Wouah genial !! merci !! en fait tout parait plus evident quand la personne qui explique on sent qu'elle a envie d'expliquer et qu'elle est sympa!!

Ici sur ce FORUM vous etes TOUS hyper sympa hyper comprehensif et vous voulez pas faire passer les debutants pour des debiles !!
BRAVO ET MERCI car franchement c'est pas le cas partout ! Les DEV oublient souvent d'ou ils viennent ou alors ils sont peut etre nés dedans :) je mets pas justement tous dans le meme panier ;)

Je vais essayer tout cela MERCI BEAUCOUP
Je dis à bientot car forcée de constater que les problemes c'est mon actualités en ce moment ;)
merci Saian je vais essayer