Bonjour à tous, Je débute en PHP, vous allez vite vous en douter vu ma question.

Cela fait une semaine que je tourne en rond pour vérifier l'existance d'un 'id' afin d'eviter à l'utilisateur de tomber sur une page de mon site qui n'existe pas (si jamais ca à été indexé par un moteur de recherche et supprimer entre temps...) ou bien la modification par l'utilisateur du id= dans la barre d'url (ex: ....index.php?p=single&id=6).

j'ai codder le site en orienté objet et suivant une architecture MVC.


j'avais pour idée de verifier l'existance de l'article en BDD (doesArticleExist dans ArticleManager) et en fonction du résultat faire une redirection vers une page 404 si jamais la page n'existe plus.

L'erreur que j'obtien est la suivante:
Nom : setdate erreur.PNG
Affichages : 464
Taille : 16,3 Ko

visiblement setDatePost() est apellé avant ma verification, je ne sais pas comment m'y prendre j'ai certainement oublié pleins de choses...

n'hesitez pas à apporter votre aide ^^

merci d'avance à tous !


ArticleController.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php
 
class ArticleController extends Controller
{
  public function execute()
  {
      $doesArticleExist = $this->articleManager->doesArticleExist();
 
      if (!$doesArticleExist['id_exist'])
      {
        header("HTTP/1.1 404 Not Found");
      }
  }
 
}
Controller.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
<?php
 
class Controller
{
    protected $articleManager;
    protected $commentManager;
    protected $aboutManager;
    protected $AuthManager;
    private $db_host;
    private $db_name;
    private $db_user;
    private $db_pass;
 
 
    public function __construct()
    {
        $this->db_host = 'localhost';
        $this->db_name = 'cpm_dev_oc_p3';
        $this->db_user = 'root';
        $this->db_pass = '';
        $db = new PDO('mysql:host=' . $this->db_host . ';dbname=' . $this->db_name . ';charset=utf8', $this->db_user, $this->db_pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        $this->articleManager = new ArticleManager($db);
        $this->commentManager = new CommentManager($db);
        $this->aboutManager = new AboutManager($db);
        $this->AuthManager = new AuthManager($db);
 
    }
 
}

ArticleManager.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
 
<?php
 
/**
 * Classe servant de Manager à la classe Article
 */
class ArticleManager
{
 
    // Attribut nécessaire à la connexion avec la base de données.
    private $db;
 
    /**
     * Permet de se connecter à la base de données dès l'instanciation de l'objet.
     * @param PDO Object $db La base de données
     */
    public function __construct($db)
    {
        $this->db = $db;
    }
 
    /**
     * Compte le nombre d'articles dans la base de données.
     * @return int Le nombre d'articles
     */
    public function count()
    {
        $result = $this->db->query('SELECT COUNT(*) FROM articles')->fetchColumn();
        return $result;
    }
 
    /**
     * Ajoute un article dans la base de données.
     * @param Article $article L'article (object)
     */
    public function add(Article $article)
    {
        $req = $this->db->prepare('INSERT INTO articles(title, content, author, datePost) VALUES(:title, :content, :author, NOW())');
        $req->bindValue(':title', $article->getTitle());
        $req->bindValue(':content', $article->getContent());
        $req->bindValue(':author', $article->getAuthor());
        $req->execute();
    }
 
    /**
     * Met à jour les valeurs d'un article.
     * @param string $title Le titre
     * @param string $author L'auteur
     * @param string $content Le contenu
     * @param int $id L'id
     */
    public function update($title, $author, $content, $id)
    {
        $request = $this->db->prepare('UPDATE articles SET title = :title, author = :author, content = :content, dateEdit = NOW() WHERE id = :id');
        $request->bindValue(':title', $title);
        $request->bindValue(':author', $author);
        $request->bindValue(':content', $content);
        $request->bindValue(':id', (int)$id);
        $request->execute();
    }
 
    /**
     * Obtient la liste des articles.
     * @param int $firstArticle Le premier article
     * @param int $articlesPerPage Le nombre d'articles par page
     * @return Article objects La liste
     */
    public function getList($firstArticle = -1, $articlesPerPage = -1)
    {
        $sql = 'SELECT * FROM articles ORDER BY datePost DESC';
 
        // Vérification de la validité des données reçues.
        if ($firstArticle != -1 OR $articlesPerPage != -1) {
            $sql .= ' LIMIT ' . (int)$articlesPerPage . ' OFFSET ' . (int)$firstArticle;
        }
 
        $request = $this->db->query($sql);
        $request->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Article');
 
        $listOfArticles = $request->fetchAll();
 
        // On boucle sur la liste d'articles afin d'instancier des objets DateTime pour datePost et dateEdit.
        foreach ($listOfArticles as $article) {
            $article->setDatePost(new DateTime($article->getDatePost()));
            $article->setDateEdit(new DateTime($article->getDateEdit()));
        }
 
        $request->closeCursor();
 
        return $listOfArticles;
    }
 
    /**
     * Obtient la liste des 3 derniers articles.
     * @return Article Objects Les 3 derniers articles
     */
    public function getLastArticles()
    {
        $result = $this->db->query('SELECT * FROM articles ORDER BY datePost DESC LIMIT 0, 3');
        $lastArticles = $result->fetchAll(PDO::FETCH_CLASS, 'Article');
        foreach ($lastArticles as $article) {
            $article->setDatePost(new DateTime($article->getDatePost()));
            $article->setDateEdit(new DateTime($article->getDateEdit()));
        }
        $result->closeCursor();
        return $lastArticles;
    }
 
    /**
     * Obtient un article unique (pour la vue Single)
     * @param int $id L'id de l'article
     * @return Article Object L'article.
     */
    public function getUnique($id)
    {
        $request = $this->db->prepare('SELECT * FROM articles WHERE id = :id');
        $request->bindValue(':id', (int)$id);
        $request->execute();
        $request->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Article');
        $article = $request->fetch();
        $article->setDatePost(new DateTime($article->getDatePost()));
        $article->setDateEdit(new DateTime($article->getDateEdit()));
        return $article;
    }
 
    public function doesArticleExist($id)
    {
      $request = $this->db->prepare('SELECT * AS id_exist FROM articles WHERE id = ' . $_POST['id']);
      $request->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Article');
      $doesArticleExist = $request->fetch();
      return $doesArticleExist;
    }
 
    /**
     * Supprimer un article de la base de données.
     */
    public function deleteArticle()
    {
        $commentManager = new CommentManager($this->db);
        $commentManager->deleteAllWithArticle($_POST['id']);
        $this->db->exec('DELETE FROM articles WHERE id = ' . $_POST['id']);
    }
 
    /**
     * Supprime tous les articles de la base de données. Remet l'id de base à 0.
     */
    public function deleteAll()
    {
        $result = $this->db->exec('TRUNCATE TABLE articles');
        return $result;
    }
}