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