SQLSTATE[23000]: Integrity constraint violation: 1048

Signaler
Messages postés
15
Date d'inscription
mardi 2 février 2021
Statut
Membre
Dernière intervention
14 février 2021
-
Messages postés
31467
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2021
-
Bonjour bonjour!! Oui j'ai vu d'autres sujets avec le meme titre mais helas soit j'ai pas compris soit ca ne m'a pas permis de faire sans devoir poser ma question.

Ce message me dit que mon champ "content" ne doit pas etre vide ! bon ok oui dans ma table j'ai NOT NULL. Je tiens à preciser que mon formulaire fonctionnait avant !! dans l etat ou presque donc!

mon formulaire:
<div class="card " id=form_comment>
  <div class="text-center">
    <h4>Ecrire un commentaire:</h4><br></div>
    <form action= "/blog/<?php echo e($post->getSlug()); ?>-<?php echo e($post->getId()); ?>/comments"
    onsubmit="alert('Merci pour votre commentaire, il va être validé')" method="POST">
  <div>
    <label for="name">Auteur:</label>
    <input type="text" id="author" name="author" required>
  </div>

  <div>
    <label for="msg"> Votre message : </label>
    <textarea id="msg" name="content" required></textarea>
  </div>
  <div class="d-flex justify-content-center mt-2 ">
    <input type="submit" class="btn btn-secondary " value="Envoyer"><br>
  </form>
</div>


mon fichier CommentValidator ( 2eme et 3 eme arguments sont maintenant grisés!CommentTable $table, ?int $postID = null)
namespace App\Validators;

use App\Table\CommentTable;

class CommentValidator extends AbstractValidator : 
{
    public function __construct(array $data, CommentTable $table, ?int $postID = null)
    {
        parent::__construct($data);
        $this->validator->rule('required', ['author', 'content']);
    }
}


j'ai une function:
  public function hydrateComments(array $comments)
    {
        foreach ($comments as $comment) {
            $comment->setComment([]);
        }
        $comments = $this->pdo
      ->query('SELECT content, post_id FROM comment WHERE post_id = ' . $comment->getPostId())
      ->fetchAll(PDO::FETCH_CLASS, $this->class);
    }


lorsque j'envoie mon formulaire remplis avec les 2 champs required :
j'ai bien avec mon var_dump:
^ array:2 [▼
  "author" => "malo"
  "content" => "test  essai"
]


donc rempli!
et si je fait un var dump de $comment :
^ App\Model\Comment {#12 ▼
  -id: null
  -content: null
  -created_at: "2021-02-14 07:18:25"
  -author: null
  -post_id: null
  -is_valid: null
  -is_no_valid: null
}

champs correspondant à ma function de mon fichier CommentTable pour creer mon comment:

 public function createComment(Comment $comment): void
    {
        $id = $this->create([
      'content' => $comment->getContent(),
      'created_at' => $comment->getCreatedAt()->format('Y-m-d H:i:s'),
      'author' => $comment->getAuthor(),
      'post_id' => $comment->getPostId()
    ]);
        $comment->setID($id);
    }


bon voilà j'ai tenté de faire au mieux pour vous exposer mon souci!! merci pour l'aide

bon dimanche

4 réponses

Messages postés
31467
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2021
3 279
Bonjour,

Déjà, tu travailles avec un framework. ... il aurait été bien d'indiquer lequel...

Ensuite, tu utilises dans ton fonction createComment
A quel moment fais tu appel à cette fonction ?
Qu'est-ce que tu lui passes comme paramètre ?
Tu sembles nous avoir montré uniquement du contenu venant de tes fichiers models... mais pas ton controller ...

PS: Lorsque tu postes du code, essaye au moins d'indiquer pour chaque morceau, le nom du fichier correspondant... car là ... c'est dur de s'y retrouver...
Ou sinon, tu postes le code du fichier complet ... et pas juste des petits morceaux...
Typiquement, là, on ne sait pas comment est organisé ton code... ce que vient faire là la fonction hydrateComments qui ne semble pas lié à la création de nouveau comment ...
Dans quel ordre sont appellées ces différentes fonctions ... à partir d'où .. avec quel(s) paramètre(s) ..




Messages postés
15
Date d'inscription
mardi 2 février 2021
Statut
Membre
Dernière intervention
14 février 2021

Framework ! moi je sais juste que je suis entrain de faire un blog php MVC orienté objet avec mon IDE visual studio Code ou j'ai composer d'installé et d'autres bibliotheques ( inutiles dans ce contexte de demande, whoops, faker, pour ne pas les siter entre autres).

donc pour repondre : voici mon fichier (Controller)comment new.php:
<?php

use App\Validators\CommentValidator;
use App\Table\PostTable;
use App\Table\CommentTable;
use App\ObjectHelper;
use App\Model\Comment;
use App\HTML\Form;
use App\Connection;

$slug = $params['slug'];
$pdo = Connection::getPDO();
$id = (int)$params['id'];
$post = (new PostTable($pdo))->find($id);

$errors = [];
$comment = new Comment();
$pdo = Connection::getPDO();
$comments = (new CommentTable($pdo))->findByPostID($id);
$comment->setCreatedAt(date('Y-m-d H:i:s'));
dd($comment);
if (!empty($_POST)) {
    $commentTable = new CommentTable($pdo);
    $_POST['post_id'] = (int)$params['id'];
    $v = new CommentValidator($_POST, $commentTable, $comment->getID());
    ObjectHelper::hydrate($comment, $_POST, ['author', 'content', 'post_id',]);

    if ($v->validate()) {
        $commentId = $commentTable->createComment($comment);

        $url = $router->url('post', ['slug' => $slug, 'id' => $id]);
        http_response_code(301);
        header('Location: ' . $url);
        exit();
    } else {
        $errors = $v->errors();
    }
}
$form = new Form($comment, $errors);
require_once('../views/post/show.php');



ensuite j'ai mon Modèle comment : avec tous mes setters et mes getters entre autre!
<?php

namespace App\Model;

use \DateTime;

class Comment
{
    private $id;

    private $content;

    private $created_at;

    private $author;

    private $post_id;

    private $is_valid;

    private $is_no_valid;


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

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

        return $this;
    }

    public function getContent(): ?string
    {
        return $this->content;
    }


    public function setContent($content): self
    {
        $this->content = $content;

        return $this;
    }
    public function getComment(): ?string
    {
        return $this->comment;
    }


    public function setComment($comment): self
    {
        $this->comment = $comment;

        return $this;
    }



    public function getCreatedAt(): DateTime
    {
        return new DateTime($this->created_at);
    }

    public function setCreatedAt(string $date): self
    {
        $this->created_at = $date;

        return $this;
    }

    public function getAuthor(): ?string
    {
        return $this->author;
    }


    public function setAuthor(string $author): self
    {
        $this->author = $author;

        return $this;
    }

    public function setPostId(int $post_id): self
    {
        $this->post_id = $post_id;

        return $this;
    }
    public function findByPostID(): int
    {
        return $this->post_id;
    }

    public function addComment(comment $comment): void
    {
        $this->comment[] = $comment;
    }

    public function setPost(Post $post)
    {
        $this->post = $post;
    }

    public function getPostId()
    {
        return $this->post_id;
    }

    public function getIsValid()
    {
        return $this->is_valid;
    }

    public function getIsNoValid()
    {
        return $this->is_no_valid;
    }
}


ensuite mon fichier : dossier Table fichier CommentTable :
<?php

namespace App\Model;

use \DateTime;

class Comment
{
    private $id;

    private $content;

    private $created_at;

    private $author;

    private $post_id;

    private $is_valid;

    private $is_no_valid;


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

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

        return $this;
    }

    public function getContent(): ?string
    {
        return $this->content;
    }


    public function setContent($content): self
    {
        $this->content = $content;

        return $this;
    }
    public function getComment(): ?string
    {
        return $this->comment;
    }


    public function setComment($comment): self
    {
        $this->comment = $comment;

        return $this;
    }



    public function getCreatedAt(): DateTime
    {
        return new DateTime($this->created_at);
    }

    public function setCreatedAt(string $date): self
    {
        $this->created_at = $date;

        return $this;
    }

    public function getAuthor(): ?string
    {
        return $this->author;
    }


    public function setAuthor(string $author): self
    {
        $this->author = $author;

        return $this;
    }

    public function setPostId(int $post_id): self
    {
        $this->post_id = $post_id;

        return $this;
    }
    public function findByPostID(): int
    {
        return $this->post_id;
    }

    public function addComment(comment $comment): void
    {
        $this->comment[] = $comment;
    }

    public function setPost(Post $post)
    {
        $this->post = $post;
    }

    public function getPostId()
    {
        return $this->post_id;
    }

    public function getIsValid()
    {
        return $this->is_valid;
    }

    public function getIsNoValid()
    {
        return $this->is_no_valid;
    }
}


est ce que ca repond à ton retour?
Messages postés
31467
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2021
3 279
Tu fais appel à la fonction
ObjectHelper::hydrate($comment, $_POST, ['author', 'content', 'post_id',]);

En lui passant en paramètres un objet $comment , un second paramètre qui est la variable $_POST et en troisième paramètre un array contenant trois string ( author, content, post_id )

Sauf que cette fonction .. n'attend qu'un seul paramètre
 public function hydrateComments(array $comments)

paramètre qui serait un array de comments ...

Donc : a quoi te servent les deux paramètres suplémentaires que tu lui passe sachant que tu ne les utilise pas ?
Pourquoi, ne fais tu pas comme pour la date ...
$comment->setCreatedAt(date('Y-m-d H:i:s'));

pour y mettre les données provenant de ta variable $_POST ?
par exemple
$content = !empty($_POST['content']) ? $_POST['content'] : "";
$comment->setContent($content);
Messages postés
15
Date d'inscription
mardi 2 février 2021
Statut
Membre
Dernière intervention
14 février 2021

oui c'est vrai mais si je fais comme cela mon erreur reapparait evidemment avec tous les champs de ma table comment
^ array:4 [▼
  "content" => "test"
  "created_at" => "2021-02-14 14:07:47"
  "author" => null
  "post_id" => null
]


mais c'est vrai j'aurai du faire comme ca car pour un debutant c'est bcp comprehensible !
sauf que là et tu vas dire ah bah il fallait me dire tout :) mais bon je fais pas expres : j'essaie de comprendre au fur et à mesure et plus on m'expliquer et plus je comprend!!!
mais dans ma table comment j'ai une function createComment
<?php

namespace App\Table;

use App\Model\Comment;
use App\PaginatedQuery;
use \PDO;

final class CommentTable extends Table
{
    protected $table = "comment";
    protected $class = Comment::class;

    public function createComment(Comment $comment): void
    {
        $id = $this->create([
      'content' => $comment->getContent(),
      'created_at' => $comment->getCreatedAt()->format('Y-m-d H:i:s'),
      'author' => $comment->getAuthor(),
      'post_id' => $comment->getPostId()
    ]);
        $comment->setID($id);
    }

    public function updateComment(Comment $comment): void
    {
        $this->update([
      'content' => $comment->getContent(),
      'created_at' => $comment->getCreatedAt()->format('Y-m-d H:i:s'),
      'author' => $comment->getAuthor(),
    ], $comment->getID());
    }

    public function addComment(int $id, array $comments)
    {
        $query = $this->pdo->prepare("INSERT INTO comment SET 'author', 'content', 'post_id' VALUES");
        $query->execute(['author', 'content', 'post_id']);
        $result = $query->fetchAll();


        if ($result === true) {
            echo 'Vos données ont bien eté enregistrees';
        } else {
            echo 'merci de recommencer';
        }

        return $result;
    }


    public function hydrateComments(array $comments)
    {
        foreach ($comments as $comment) {
            $comment->setComment([]);
        }
        $comments = $this->pdo
      ->query('SELECT content, post_id FROM comment WHERE post_id = ' . $comment->getPostId())
      ->fetchAll(PDO::FETCH_CLASS, $this->class);
    }

    public function findPaginated()
    {
        $paginatedQuery = new PaginatedQuery(
            "SELECT * FROM {$this->table} ORDER BY created_at DESC",
            "SELECT COUNT(id) FROM {$this->table}",
      $this->pdo
        );
        $comments = $paginatedQuery->getItems(Comment::class);

        (new CommentTable($this->pdo))->hydrateComments($comments);
        return [$comments, $paginatedQuery];
    }

    public function findByPostID($post_id, $is_valid = true)
    {
        $query = $this->pdo->prepare('SELECT * FROM ' . $this->table  .  ' WHERE post_id = :post_id and is_valid= :is_valid');
        $query->execute(['post_id' => $post_id, 'is_valid' => $is_valid]);
        $query->setFetchMode(PDO::FETCH_CLASS, $this->class);
        $result = $query->fetchAll();


        return $result;
    }

    public function approve(Comment $comment): void
    {
        $this->update(['is_valid' => 1], $comment->getID());
    }


    public function findByID($comment_id)
    {
        $query = $this->pdo->prepare('SELECT * FROM ' . $this->table  .  ' WHERE id= :id');
        $query->execute(['id' => $comment_id]);
        $query->setFetchMode(PDO::FETCH_CLASS, $this->class);
        $result = $query->fetch();

        return $result;
    }
}


et le pire donc : dans ma tableTable (la parente) c'est ca qui me perturbe :
j'ai une autre fonction create et c'est pk tout le reste est construit comme ca

voici ma table table :
<?php

namespace App\Table;

use  App\Table\Exception\NotFoundException;
use \PDO;

abstract class Table
{
    protected $pdo;
    protected $table = null;
    protected $class = null;


    public function __construct(PDO $pdo)
    {
        if ($this->table === null) {
            throw new \Exception("La class " . get_class($this) . "n'a pas de propriété \$table");
        }
        if ($this->class === null) {
            throw new \Exception("La class " . get_class($this) . "n'a pas de propriété \$class");
        }
        $this->pdo = $pdo;
    }

    public function find(int $id)
    {
        $query = $this->pdo->prepare('SELECT * FROM ' . $this->table . ' WHERE id = :id');
        $query->execute(['id' => $id]);
        $query->setFetchMode(PDO::FETCH_CLASS, $this->class);
        $result = $query->fetch();

        if ($result === false) {
            throw new NotFoundException($this->table, $id);
        }
        return $result;
    }

    /** verifie valeur si existe bdd
     * @params string $field champs à chercher
     */

    public function exists(string $field, $value, ?int $except = null): bool
    {
        $sql = "SELECT COUNT(id) FROM {$this->table} WHERE $field = ?";
        $params = [$value];
        if ($except !== null) {
            $sql .= "AND id != ?";
            $params[] = $except;
        }
        $query = $this->pdo->prepare($sql);
        $query->execute($params);
        return (int)$query->fetch(PDO::FETCH_NUM)[0]  > 0;
    }

    public function all(): array
    {
        $sql = "SELECT * FROM {$this->table}";
        return $this->pdo->query($sql, PDO::FETCH_CLASS, $this->class)->fetchAll();
    }

    public function delete(int $id)
    {
        $query = $this->pdo->prepare("DELETE FROM {$this->table} WHERE id = ?");
        $ok = $query->execute([$id]);
        if ($ok === false) {
            throw new \Exception("Impossible de supprimer l'enregistrement $id dans la table {$this->table}");
        }
    }

    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();
    }

    public function update(array $data, int $id)
    {
        $sqlFields = [];
        foreach ($data as $key => $value) {
            $sqlFields[] = "$key = :$key";
        }
        $query = $this->pdo->prepare("UPDATE {$this->table} SET " . implode(', ', $sqlFields) . " WHERE id = :id");
        $ok = $query->execute(array_merge($data, ['id' => $id]));
        if ($ok === false) {
            throw new \Exception("Impossible de modifier l'enregistrement  dans la table {$this->table}");
        }
    }

    public function queryAndFetchAll(string $sql): array
    {
        return $this->pdo->query($sql, PDO::FETCH_CLASS, $this->class)->fetchAll();
    }
}


un var_dump($data); me renvoi:
^ array:4 [▼
  "content" => "test"
  "created_at" => "2021-02-14 14:07:47"
  "author" => null
  "post_id" => null
]

et c'est l'argument $data que j'ai dans la function create.

donc du coup j'aurai encore 2 fois le meme message d'erreur : pour auteur et mon post id!!

mais ce qui me destabilise c'est que ca marchait !!! et en plus ca s'enregistrait bien dans ma bdd
je patauge mais je suis au forum qu'il faut !!! enfin j'espere !! les erreurs font avancer !! :)

mais je me dis : mon formulaire je n'ai que 2 champs à remplir : author et texte
ma table bdd elle , elle a les memes colonnes que mon modele au dessus alors!!
je suis un peu perdueee ! quand je saurais plus de chose ca c'est sur je dirai ou ferai moins d'erreur

bon merci en tout cas
Messages postés
31467
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2021
3 279
J'ai un peu de mal à piger...
Tu dis toi-même que tu es débutante...sauf que le code qui est ici a été réalisé par des personnes ayant de bonnes connaissances et dans le PHP et dans l'architecture MVC...
j'en conclu donc que tu copies colle bêtement du code trouver çà et là sur des tutos sans en comprendre le fonctionnement exact.

Alors oui, tu es en train d'apprendre mais le problème c'est que tu essayes de faire un 100 m haies sans avoir appris à marcher....

si tu veux apprendre à faire du MVC commence par te former sur un framework tel que laravel ou symphony ou encore codeigniter...
Messages postés
15
Date d'inscription
mardi 2 février 2021
Statut
Membre
Dernière intervention
14 février 2021

exactement tout à fait !! je vais eviter de rentrer dans le detail PERSO ici!! mais oui en effet cecode reflete la lecon du gars hyper sympa de grafikart sur les lecons php !! c'est mon prof qui helas m'avait demandé de proceder comme cela et justement ca me pose souci aujourdhui car cafait un peu commesi on prenait un livre par la fin !!! mais comme je cherche et apprends ,, j'arrive à comprendre bcp mieux mais pas tout car son code est en effet bien poussé!!! voilà ce que je peux ecrire ,, si ca peut t'orienter !! j'ai pas pour habitude de raconter des inepties et c etait evident qu'une personne qui connait tres bien le php s'en rende compte !! donc si j'avais du dire n'importe quoi je serais vraiment bien bete !!
j'y arrive de mieux en mieux mais comme j'ai des surprises sur des trucs qui marchaient et qui marchent plus : oui je prefere demander de l'aide !! merci pour l'aide et toutes les infos que tu as bien voulu me donner MERCI ,, j'en conclu que je ne posterai plus de demande ici puisque je copie colle betement !
mais ca c'est toi qui le dit ca n'engage que toi!
Messages postés
31467
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2021
3 279

mais ca c'est toi qui le dit ca n'engage que toi!

Ben tu le dis aussi visiblement si on relis ton texte précédent...

Mais c'e nétait pas une insulte ce que je te disais... C'était juste un constat qui montre les limites d'apprendre de cette façon....

enfin bon, je te souhaite bonne continuation dans ton apprentissage et bon courage..