Bonsoir à tous,
Je me permets de poster mon problème ici car je coince sur quelques classes en POO, en effet, j'ai suivi un cours sur la POO et j'ai tenté de porter le système de news sur le site en cours de développement sur lequel je bosse et je doit avouer que cela me dépasse, j'ai le bon code (enfin, apparemment non), mon serveur fonctionne et pourtant, rien ne fonctionne (d'où ma frustration), je poste donc ici dans l'espoir de trouver une solution.
Voici mon arborescence de fichiers :
Voici mes classes :
En premier DBFactory qui s'occupe de la connexion :
Puis NewsManager qui gère les news :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?php class DBFactory { public static function getMysqlConnexionWithPDO(){ $db = new PDO('mysql:host=localhost;dbname=jvn-network', 'root', ''); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); return $db; } public static function getMysqlConnexionWithMySQLi(){ return new MySQLi('localhost', 'root', '', 'jvn-network'); } }
Puis News qui représente une news :
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 <?php abstract class NewsManager { abstract protected function add(News $news); abstract protected function count(); abstract protected function delete($id); abstract protected function getList($debut = -1, $limite = -1); abstract protected function getUnique($id); public function save(News $news){ if($news->isValid()){ $news->isNews() ? $this->add($news) : $this->update($news); }else { throw new RuntimeException('La news doit être valide pour être enregistrée'); } } abstract protected function update(News $news); }
Puis NewsManagerMySqli qui utilise MySQL :
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 <?php class News { protected $erreurs = [], $id, $auteur, $titre, $contenu, $dateAjout, $dateModif; const AUTEUR_INVALIDE = 1; const TITRE_INVALIDE = 2; const CONTENU_INVALIDE = 3; public function __construct($valeurs = []){ if(!empty($valleurs)){ $this->hydrate($valeurs); } } public function hydrate($donnees) { foreach($donnees as $attribut => $valeur){ $methode = 'set' .ucfirst($attribut); if(is_callable([$this, $methode])){ $this->$methode($valeur); } } } public function isNew(){ return empty($this->id); } public function isValid(){ return !(empty($this->auteur) || empty($this->titre) || empty($this->contenu)); } public function setId($id){ $this->id = (int) $id; } public function setAuteur($auteur){ if(!is_string($auteur) || empty($auteur)){ $this->erreurs[] = self::AUTEUR_INVALIDE; }else { $this->auteur = $auteur; } } public function setTitre($titre){ if(!is_string($titre) || empty($titre)){ $this->erreurs[] = self::TITRE_INVALIDE; }else { $this->titre = $titre; } } public function setContenu($contenu){ if(!is_string($contenu) || empty($contenu)){ $this->erreurs[] = self::CONTENU_INVALIDE; }else { $this->contenu = $contenu; } } public function setDateAjout(DateTime $dateAjout){ $this->dateAjout = $dateAjout; } public function setDateModif(DateTime $dateModif){ $this->dateModif = $dateModif; } public function erreurs(){ return $this->erreurs; } public function id(){ return $this->id; } public function auteur(){ return $this->auteur; } public function titre(){ return $this->titre; } public function contenu(){ return $this->contenu; } public function dateAjout(){ return $this->dateAjout; } public function dateModif(){ return $this->dateModif; } }
Puis NewsMangerPDO qui utilise PDO :
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 <?php class NewsManagerMySQLi extends NewsManager{ protected $db; public function __construct(MySQLi $db) { $this->db = $db; } protected function add(News $news) { $requete = $this->db->prepare('INSERT INTO news SET auteur = ?, titre = ?, contenu = ?, dateAjout = NOW(), dateModif = NOW()'); $requete->bind_param('sss', $news->auteur(), $news->titre(), $news->contenu()); $requete->execute(); } public function count() { return $this->db->query('SELECT id FROM news')->num_rows; } public function delete($id) { $id = (int) $id; $requete = $this->db->prepare('DELETE FROM news WHERE id = ?'); $requete->bind_param('i', $id); $requete->execute(); } public function getList($debut = -1, $limite = -1) { $listeNews = []; $sql = 'SELECT id, auteur, titre, contenu, dateAjout, dateModif FROM news ORDER BY id DESC'; if ($debut != -1 || $limite != -1) { $sql .= ' LIMIT '.(int) $limite.' OFFSET '.(int) $debut; } $requete = $this->db->query($sql); while ($news = $requete->fetch_object('News')) { $news->setDateAjout(new DateTime($news->dateAjout())); $news->setDateModif(new DateTime($news->dateModif())); $listeNews[] = $news; } return $listeNews; } public function getUnique($id) { $id = (int) $id; $requete = $this->db->prepare('SELECT id, auteur, titre, contenu, dateAjout, dateModif FROM news WHERE id = ?'); $requete->bind_param('i', $id); $requete->execute(); $requete->bind_result($id, $auteur, $titre, $contenu, $dateAjout, $dateModif); $requete->fetch(); return new News([ 'id' => $id, 'auteur' => $auteur, 'titre' => $titre, 'contenu' => $contenu, 'dateAjout' => new DateTime($dateAjout), 'dateModif' => new DateTime($dateModif) ]); } protected function update(News $news) { $requete = $this->db->prepare('UPDATE news SET auteur = ?, titre = ?, contenu = ?, dateModif = NOW() WHERE id = ?'); $requete->bind_param('sssi', $news->auteur(), $news->titre(), $news->contenu(), $news->id()); $requete->execute(); } }
Puis mon autoloader :
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 <?php class NewsManagerPDO extends NewsManager{ protected $db; public function __construct(PDO $db){ $this->db = $db; } protected function add(News $news) { $requete = $this->db->prepare('INSERT INTO news SET auteur = :auteur, titre = :titre, contenu = :contenu, dateAjout = NOW(), dateModif = NOW()'); $requete->bindValue(':titre', $news->titre()); $requete->bindValue(':auteur', $news->auteur()); $requete->bindValue(':contenu', $news->contenu()); $requete->execute(); } public function count() { return $this->db->query('SELECT COUNT(*) FROM news')->fetchColumn(); } public function delete($id) { $this->db->exec('DELETE FROM news WHERE id = '.(int) $id); } public function getList($debut = -1, $limite = -1) { $sql = 'SELECT id, auteur, titre, contenu, dateAjout, dateModif FROM news ORDER BY id DESC'; if ($debut != -1 || $limite != -1){ $sql .= ' LIMIT '.(int) $limite.' OFFSET '.(int) $debut; } $requete = $this->db->query($sql); $requete->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'News'); $listeNews = $requete->fetchAll(); foreach ($listeNews as $news) { $news->setDateAjout(new DateTime($news->dateAjout())); $news->setDateModif(new DateTime($news->dateModif())); } $requete->closeCursor(); return $listeNews; } public function getUnique($id) { $requete = $this->db->prepare('SELECT id, auteur, titre, contenu, dateAjout, dateModif FROM news WHERE id = :id'); $requete->bindValue(':id', (int) $id, PDO::PARAM_INT); $requete->execute(); $requete->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'News'); $news = $requete->fetch(); $news->setDateAjout(new DateTime($news->dateAjout())); $news->setDateModif(new DateTime($news->dateModif())); return $news; } protected function update(News $news) { $requete = $this->db->prepare('UPDATE news SET auteur = :auteur, titre = :titre, contenu = :contenu, dateModif = NOW() WHERE id = :id'); $requete->bindValue(':titre', $news->titre()); $requete->bindValue(':auteur', $news->auteur()); $requete->bindValue(':contenu', $news->contenu()); $requete->bindValue(':id', $news->id(), PDO::PARAM_INT); $requete->execute(); } }
Et enfin mon fichier admin.php qui se situe dans Admin_priv et qui gère le tout via un menu et des formulaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?php function autoload($classname){ if(file_exists($file = __DIR__ . '/' . $classname . '.class.php')){ require $file; } } spl_autoload_register('autoload');
Ma table est crée dans MySQL et pourtant, lorsque je clique sur Ajouter, modifier ou supprimer, rien ne se fait, ma table reste vide et rien ne semble fonctionnait, j'ai tenté de regarder chaque ligne, de comprendre où pouvait se trouver l'erreur mais cela me dépasse, si quelqu'un trouve quelque chose, je lui en serait éternellement reconnaissant.
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 <?php require '../lib/autoload.class.php'; $db = DBFactory::getMysqlConnexionWithPDO(); $manager = new NewsManagerPDO($db); if (isset($_GET['modifier'])) { $news = $manager->getUnique((int) $_GET['modifier']); } if (isset($_GET['supprimer'])) { $manager->delete((int) $_GET['supprimer']); $message = 'La news a bien été supprimée !'; } if (isset($_POST['auteur'])) { $news = new News( [ 'auteur' => $_POST['auteur'], 'titre' => $_POST['titre'], 'contenu' => $_POST['contenu'] ] ); if (isset($_POST['id'])) { $news->setId($_POST['id']); } if ($news->isValid()) { $manager->save($news); $message = $news->isNew() ? 'La news a bien été ajoutée !' : 'La news a bien été modifiée !'; } else { $erreurs = $news->erreurs(); } } ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Administration</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../css/Bootstrap/bootstrap.css" /> </head> <body> <div class="container"> <div class="row"> <div class="col-lg-12"> <h3 class="text-center">Bienvenue sur la page d'administration</h3> <p class="text-center">Ici, vous pourrez administrer le blog de l'Equipe et ajouter les billets en temps réel, ce panneau de configuration est encore imparfait et sera amené à s'améliorer de par la suite, veuillez donc comprendre si certains soucis surviennent, vous pouvez nous contacter à cette adresse <em>equipe_support_technique@jvn-network.fr</em> à tout moment, précisez dans l'objet du mail ceci : "JVN-TEAM\\ Votre soucis || Date et Heure de l'erreur ou soucis //JVN-TEAM" afin que ces mails soient traités en priorités.</p> <p class="text-center">Vous pouvez ajouter, supprimer et modifier une news via ce panneau, soyez prudent durant chaque étape et vérifier chaque modification et suppresion avant de valider !</p> <p class="text-center">L'Equipe technique</p> <div class="text-center"><button class="btn"><a href="../Index.php">Accéder à l'accueil du site</a></button></div> <div class="container"> <br /> <div class="row"> <div class="col-lg-12"> <!-- Formulaire --> <form action="admin.php" method="post"> <?php if (isset($message)) { echo $message, '<br />'; } ?> <?php if (isset($erreurs) && in_array(News::AUTEUR_INVALIDE, $erreurs)) echo 'L\'auteur est invalide.<br />'; ?> Auteur : <input class="form-control" type="text" name="auteur" value="<?php if (isset($news)) echo $news->auteur(); ?>" /><br /> <?php if (isset($erreurs) && in_array(News::TITRE_INVALIDE, $erreurs)) echo 'Le titre est invalide.<br />'; ?> Titre : <input class="form-control" type="text" name="titre" value="<?php if (isset($news)) echo $news->titre(); ?>" /><br /> <?php if (isset($erreurs) && in_array(News::CONTENU_INVALIDE, $erreurs)) echo 'Le contenu est invalide.<br />'; ?> Contenu :<br /><textarea class="form-control" rows="8" cols="60" name="contenu"><?php if (isset($news)) echo $news->contenu(); ?></textarea><br /> <?php if(isset($news) && !$news->isNew()) { ?> <input type="hidden" name="id" value="<?= $news->id() ?>" /> <button class="btn btn-danger" type="submit" value="Modifier" name="modifier">Envoyer</button> <?php } else { ?> <button class="btn btn-danger" type="submit" value="Ajouter">Ajouter</button> <?php } ?> </form> </div> </div> </div> <p class="text-center">Il y a actuellement <?= $manager->count() ?> news. En voici la liste :</p> <table> <tr><th>Auteur</th><th>Titre</th><th>Date d'ajout</th><th>Dernière modification</th><th>Action</th></tr> <?php foreach ($manager->getList() as $news) { echo '<tr><td>', $news->auteur(), '</td><td>', $news->titre(), '</td><td>', $news->dateAjout()->format('d/m/Y à H\hi'), '</td><td>', ($news->dateAjout() == $news->dateModif() ? '-' : $news->dateModif()->format('d/m/Y à H\hi')), '</td><td><a href="?modifier=', $news->id(), '">Modifier</a> | <a href="?supprimer=', $news->id(), '">Supprimer</a></td></tr>', "\n"; } ?> </table> </div> </div> </div> </body> </html>
Merci par avance de votre aide.
Partager