Page 1 sur 2

Erreur SQL : Integrity constraint violation

Posté : 08 févr. 2021, 18:58
par Beebeepc
BONJOUR tout le monde !
là franchement vraiment besoin d'aide!
j'ai fait , défait : rien à faire :(
voici mon message : SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'username' ne peut �tre vide (null)

Ba j'ai fait un var dump justement : $data n'est pas vide !
il n'est pas vide !!
j'ai une table Table (parent): avec ma function :
  public function create(array $data): int
    {
        $sqlFields = [];
        foreach ($data as $key => $value) {
            $sqlFields[] = "$key = :$key";
        }
        $query = $this->pdo->prepare("INSERT INTO {$this->table} SET " . implode(', ', $sqlFields));
        $ok = $query->execute($data);

        if ($ok === false) {
            throw new \Exception("Impossible de CREER l'enregistrement  dans la table {$this->table}");
        }
        return (int)$this->pdo->lastInsertId();
    }
mon erreur situe la ligne : $ok = $query->execute($data);
mon var dump : sur $data me donne:
^ array:3 [▼
"username" => null
"password" => null
"is_admin" => 1
et j ai rempli mon formulaire
mais maintenant du coup je peux meme plus retrouver ma page s'enregistrer !! et je suis pas allée changer ma route !
et j'avais ete voir il y avait mon array rempli sur mon $_POST

je suis completement perdue
j'ai check" les FAQ php et aussi ce genre de message mais ils sont tous sur synfomy
je cool je comprends plus :'
dans mon formulaire j'ai bien tous les champs label input type ! (je dis ca au cas ou)

je me permets de mettre mon fichier register au cas ou ! puisque c'est bien cette page qui veut plus s'ouvrir !
$user = new User();
$pdo = Connection::getPDO();
$table = new UserTable($pdo);
$table->createUser($user);
$user->getUsername($user);
//si la variable post n'est pas vide c'est que lesdonnees  ont bien ete postées
 $errors = array();

if (!empty($_POST)) {
    if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) {
        $errors['username']= "Votre pseudo ne correspond pas aux caractères valides";
    } } else {
    if ($u) {
    $errors['username'] = 'Pseudo déjà pris';
    }

    if (empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
        $errors['password']= "Votre mot de passe ne correspond pas";
    }
    // pour que mon alert n'apparaisse  que lorsque l'on clic sur envoyer !
    if (isset($_POST['envoyer'])) {
        echo '';
    }
    if (empty($errors)) {
        die('Compte enregistré');
        $_SESSION['auth'] = $u;
        header('Location: ' . $router->url('blog'));
        exit();
    }
j'sais pas je vois plus :-k |*() |*()

Re: Message erreur HELP !!!! help

Posté : 08 févr. 2021, 19:31
par or 1
"$data n'est pas vide"
ce n'est pas ce que dit le message d'erreur.
"username" => null
username vaut bien null, d'où le message d'erreur.

Re: Message erreur HELP !!!! help

Posté : 08 févr. 2021, 21:48
par two3d
j'avais même pas fait tilt!

Re: Message erreur HELP !!!! help

Posté : 08 févr. 2021, 23:07
par @rthur
Beebeepc, merci de mettre un titre explicite à tes demandes.
Un bon titre est un titre qui décrit le problème rencontré, en indiquant le message d'erreur ou ce que tu cherches à faire.
Ça ne sert strictement à rien de dire que tu as besoin d'aide, on le sait déjà puisque c'est le cas de tous ceux qui postent sur ce forum d'entraide :-D

"Message erreur HELP !!!! help" est donc un très mauvais titre que j'ai changé, mais merci de faire attention à l'avenir stp

Re: Erreur SQL : Integrity constraint violation

Posté : 09 févr. 2021, 15:47
par Beebeepc
ok c'est vrai !! je ferai attention la prochaine fois !!
mais je ne comprend pas la reponse : pour username ! username vaut bien null d'ou message erreur!!
username ne peut pas etre vide (null)
il l'est oui dans la reponse du var dump mais j'ai rempli le formulaire et mis un username et un password!

desolee je suis bouchée alors :(

Re: Erreur SQL : Integrity constraint violation

Posté : 09 févr. 2021, 17:33
par two3d
vérifie les noms des POST et ce que t'envois à "create()"

Re: Erreur SQL : Integrity constraint violation

Posté : 10 févr. 2021, 12:19
par Beebeepc
^ array:4 [▼
  "username" => ""
  "password" => ""
  "password_confirm" => ""
  "envoyer" => ""
]
voilà pour les noms dans POST
et ma function create :
public function createUser(User $user)
    {
        $id = $this->create([
      'username' => $user->getUsername(),
      'password' => $user->getPassword(),
      'is_admin' => 1,
    ]);
        $user->setId($id);
        if ($user) {
            $errors['username'] = 'Pseudo déjà pris';
        }
        return $user;
    }
donc je supprime mon code create mais bon je comprends pas pk ca marchait avant !! avant que j'esssai de decouper en poo mvc :(

si je comprend que cela veut dire : mon post recuperer: username, password et passwordconfirm alors que dans mon create :
username et password et is admin?
mais ces 3 proprietes sont mes colonnes de ma table !
:(
et effectivement mon $user (mon objet) quant à lui : a 3 champs : unsername, password et is_admin ( ce qui est dans mon create alors je sais pas comment faire ! faut il que je rajoute un attribut à ma class ? confirmpassword et aussi une colonne à ma table?

Re: Erreur SQL : Integrity constraint violation

Posté : 10 févr. 2021, 14:03
par two3d
débuguer petit à petit avec des var_dump() par exemple de tes POST, voir ce que t'envoi depuis ton formulaire si c'est bien transmit

Re: Erreur SQL : Integrity constraint violation

Posté : 12 févr. 2021, 10:16
par Beebeepc
Hello
j'ai fait debugger var dump de $_POST: ( fichier login_register.php) controller
^ array:4 [▼
  "username" => "toto"
  "password" => "7777"
  "password_confirm" => "7777"
  "envoyer" => ""
]
et mon var_dump de $user : meme fichier
^ App\Model\User {#11 ▼
  -id: null
  -username: null
  -password: null
  -is_admin: null
ca c'est mon fichier complet : controller

}
$user = new User($pdo);
$errors = array();

if (!empty($_POST)) {
  
 
    if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) {
        $errors['username']= "Votre pseudo ne correspond pas aux caractères valides";
    } } else {
    if ($user) {
    $errors['username'] = 'Pseudo déjà pris';
    }

    if (empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
        $errors['password']= "Votre mot de passe ne correspond pas";
    }
    // pour que mon alert n'apparaisse  que lorsque l'on clic sur envoyer !
    if (isset($_POST['envoyer'])) {
        echo '';
    }
    if (empty($errors)) {
        die('Compte enregistré');
        $_SESSION['auth'] = $user;
        header('Location: ' . $router->url('blog'));
        exit();
    }
}
et ma table user : userTable.php j'ai mis mes 2 requetes:
public function findByUsername(string $username)
{
    $query = $this->pdo->prepare("SELECT * FROM ' . $this->table . ' WHERE username = ?");
    $query->execute([$_POST['username']]);
    $query->setFetchMode(\PDO::FETCH_CLASS, $this->class);
    $result = $query->fetch();

    if ($result === false) {
        echo ' nous n\avons pas trouvé votre pseudo';

    }
    return $result;
}


public function createUser(User $user)
    {
        $id = $this->create([
      'username' => $user->getUsername(),
      'password' => $user->getPassword(),
      'is_admin' => 1,
    ]);
        $user->setId($id);
        if ($user) {
            $errors['username'] = 'Pseudo déjà pris';
        }
        return $user;
    }
avant mon code n'etait pas decoupé en mvc et ma requete fonctionnait : là impossible d'enregistrer rien ne marche
et j'arrive pas à debuger une requete !! je dois pas faire ce qu'il faut :(

pouvez vous m'aider? merci bcp

Re: Erreur SQL : Integrity constraint violation

Posté : 12 févr. 2021, 10:53
par two3d
que fait "new User($pdo);" ? colle la classe stp

Re: Erreur SQL : Integrity constraint violation

Posté : 12 févr. 2021, 11:34
par Beebeepc
voici mon modele / class User
class User
{
    private $id;

    private $username;
  
    private $password;

    private $is_admin;


    public function getUsername(): ?string
    {
        return $this->username;
    }


    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }


    public function getPassword(): ?string
    {
        return $this->password;
    }


    public function setPassword(string $password): self
    {
        $this->password = password_hash($password, PASSWORD_BCRYPT);
        return $this;
    }

    public function getCreateUser(): ?string
    {
        return $this->create_user;
    }

   public function setcreateUser(string $create_user): ?string
    {
        return $this->create_user;
    }

 

    public function getFindByUser(): string
    {
        return $this->find_by_user;
    }

    public function getId(): ?int
    {
        return $this->id;
    }


    public function setId(int $id): self
    {
        $this->id = $id;

        return $this;
    }

    public function getIsAdmin(): ?bool
    {
        return !! $this->is_admin;
    }


    public function setIsAdmin(bool $is_admin)
    {
        $this->is_admin = $is_admin;

        return $this;
    }
  
}

Re: Erreur SQL : Integrity constraint violation

Posté : 12 févr. 2021, 16:01
par or 1
pour qu'username ne vaille pas null, il faut que setUsername() soit appelé. dans le code donné, ce n'est jamais le cas.

Re: Erreur SQL : Integrity constraint violation

Posté : 12 févr. 2021, 19:28
par two3d
Je suis pas un expert en classes mais tu ne "construct" pas ta classe:

$user = new User($pdo); <- $pdo ?

puis tu demande "if ($user) {" ça serait plutôt: "if ($user->quelque chose) {"

Re: Erreur SQL : Integrity constraint violation

Posté : 13 févr. 2021, 18:38
par Beebeepc
pour qu'username ne vaille pas null, il faut que setUsername() soit appelé. dans le code donné, ce n'est jamais le cas.
hello mais bon je vais peut etre dire une anerie mais le ridicule ne tue pas :
ok je comprend qu'il faille appeler setusername pour pas null mais en initialisant $user = new users
j'utile alors ma class user et qui a setusername!! non?

Mes posts par exemples : dans mon code j'ai jamais de setPost mais je me sers de mon $post=new post
qui a mes getters et mes setters!
apres c'est une reflexion !!! moi je veux juste comprendre

merci

Re: Erreur SQL : Integrity constraint violation

Posté : 13 févr. 2021, 18:45
par Beebeepc
Je suis pas un expert en classes mais tu ne "construct" pas ta classe:

$user = new User($pdo); <- $pdo ?

puis tu demande "if ($user) {" ça serait plutôt: "if ($user->quelque chose) {"
euh moi pour
$user = new User();
soit je n'ajoute pas de parametre dans mes () ou alors je dis : je veux username et password

je sais pas!!!