Bonjour, voilà j'ai un petit problème pour jeudi à résoudre j'utilise le php objet, la structure mvc, et l'interface DAO. J'ai une liste d'utilisateurs avec 2 liens (éditer et supprimer) à coté des utilisateurs et j'ai mes fonctions php:
Le problème c'est que je sais pas comment faire pour créer le code qui va supprimer et éditer dans le lien, je sais que la suppréssion et l'édite dois se faire en fonction de l'id de l'enfant mais je sais pas comment le rédiger dans mon controleur et dans ma vue.
Pour l'instant dans mon controleur j'ai rien je sais pas quoi mettre :
le controleur :
<?php
require '../class/Eleve.class.php';
require_once '../modele/EleveModele.php';
// le code
?>
la view
(listeeleve.php)
require '../class/Eleve.class.php';
require_once '../modele/EleveModele.php';
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
$eleveModele=new EleveModele();
$listeEleves=$eleveModele->read();
foreach ($listeEleves as $listeEleve)
{
?>
<tr>
<td> <?php echo $listeEleve->getIdEnfant();?></td>
<td> <?php echo $listeEleve->getPrenom();?></td>
<td><?php echo $listeEleve->getNom();?></td>
<td><?php echo $listeEleve->getDate();?></td>
<td><?php echo $listeEleve->getSection();?></td>
<td> <a href="">Supprimer</a></td>
<td><a href="">Editer</a></td>
</tr>
<?php
}
?>
et le modele :
require_once 'DAO.php'; // implemente le DAO
require_once 'DataBaseManager.php';
class EleveModele implements DAO
{
private static $db; //Instance de la PDO
function __construct()
{
// $instance = ::self DataBaseManager->getInstance();
self::$db=DataBaseManager::getInstance();
}
public function wrapper($row)
{
$eleve = new Eleve();
$eleve->setIdEnfant($row["idEnfant"]);
$eleve->setPrenom($row["prenom"]);
$eleve->setNom($row["nom"]);
$eleve->setDate($row["date"]);
$eleve->setSection($row["section"]);
return $eleve;
}
public function get($idEnfant)
{
$stmt=self::$db->queryBDD("SELECT * FROM enfant WHERE idEnfant=?",array($idEnfant));
//wrapper
$eleve=$this->wrapper($stmt->fetch());
return $eleve;
}
public function read(){
$listeEleve=array();
$stmt=self::$db->queryBDD("SELECT * FROM enfant ORDER BY nom DESC",null);
//retourner la liste sous forme d'objets FETCH_LAZY
while ($row = $stmt->fetch(PDO::FETCH_LAZY)) {
$eleve=$this->wrapper($row);
$listeEleve[]=$eleve;
}
return $listeEleve;
}
public function create($eleve)
{
$sql = "INSERT INTO enfant(nom,prenom,section,date) VALUES(:nom, :prenom, :section, :date)";
$var = array(":nom" => $eleve->getNom(),":prenom" => $eleve->getPrenom(),":section" => $eleve->getSection(), ":date" => $eleve->getDate());
self::$db->queryBDD($sql, $var);
}
public function update ($eleve)
{
$sql = "UPDATE enfant SET nom=:nom, prenom=:prenom WHERE idEnfant=:idEnfant";
$var = array(":nom" => $eleve->getNom(),
":prenom" => $eleve->getPrenom(),
":idEnfant"=>$eleve->getIdEnfant());
self::$db->queryBDD($sql, $var);
}
public function delete($idEnfant)
{
$sql = "DELETE FROM enfant WHERE idEnfant=:idEnfant";
$var = array(":idEnfant" => $idEnfant);
self::$db->queryBDD($sql, $var);
}
}
?>
et ma classe :
class Eleve {
private $idEnfant;
private $nom;
private $prenom;
private $date;
private $section;
function __construct() {
}
function getIdEnfant() {
return $this->idEnfant;
}
function getNom() {
return $this->nom;
}
function getPrenom() {
return $this->prenom;
}
function getDate() {
return $this->date;
}
function getSection() {
return $this->section;
}
function setIdEnfant($idEnfant) {
$this->idEnfant = $idEnfant;
}
function setNom($nom) {
$this->nom = $nom;
}
function setPrenom($prenom) {
$this->prenom = $prenom;
}
function setDate($date) {
$this->date = $date;
}
function setSection($section) {
$this->section = $section;
}
}
?>
Essaye de d'abord implémenter le controller. Ne pense pas qu'on va te donner un code tout fait sachant qu'on ne connais pas ton architecture du code
Le problème c'est que c'est pas un bouton, c'est un lien ou l'utilisateur va cliquer sur supprimer, donc le if(isset($_GET['lebouton'])) { } c'est mort.
J'ai compris ce qu'il faut faire, supprimer en fonction de l'id de l'enfant le problème étant je sais pas comment appelé ma méthode delete dans mon url.. Si c'étais du php sans objet j'ai déjà fais et ça fonctionne. Mais comme c'est de l'objet ici je sais pas comment appelé la méthode delete en fonction de l'id et tout cela dans l'url <a href="listEleve.php&ici">Supprimer</a>
Bonsoir,
L'url Brandon-xprodeur te l'a laissé plus haut !!
Pour la suppression c'est un peu pareil.
Tu passe une url comme ceci = http://monsite.fr/users/profil/?delete=35 et tu fais dans ta condition une requette DELETE.
Du coup je capte pas ce qui t'empeche de générer ton lien ?
<a href="http://monsite.fr/users/profil/?delete=35" class="button">Supprimer</a>
Maintenant que tu as ton lien ou tu récupère l'id tu as plus qu'a appelé ta méthode !
J'ai fais, dans ma vue (listEleve.php) :
<meta charset="UTF-8">
<title></title>
<style>
table
{
border-collapse: collapse; /* Les bordures du tableau seront collées (plus joli) */
}
td
{
border: 1px solid black;
}
</style>
</head>
<table>
<tr>
<td>ID </td>
<td>PRENOM </td>
<td>NOM </td>
<td>NAISSANCE </td>
<td>SECTION </td>
<td>SUPPRIMER </td>
<td>EDITER </td>
</tr>
<?php
require '../class/Eleve.class.php';
require_once '../modele/EleveModele.php';
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
$eleveModele=new EleveModele();
$listeEleves=$eleveModele->read();
foreach ($listeEleves as $listeEleve)
{
?>
<tr>
<td> <?php echo $listeEleve->getIdEnfant();?></td>
<td> <?php echo $listeEleve->getPrenom();?></td>
<td><?php echo $listeEleve->getNom();?></td>
<td><?php echo $listeEleve->getDate();?></td>
<td><?php echo $listeEleve->getSection();?></td>
<td><a href="listEleve.php?delete=<?php echo $listeEleve->getIdEnfant();?>">Supprimer</a></td>
<td><a href="">Editer</a></td>
</tr>
<?php
}
?></table>
J'ai bien l'id qui apparaît quand je clique sur le lien supprimer, mais ça supprime pas.
Sur mon controleur j'ai ajouté :
EleveController.php
<?php
require '../class/Eleve.class.php';
require_once '../modele/EleveModele.php';
if(isset($_GET['delete']))
{
$eleveModele=new EleveModele();
$eleveModele->delete();
}
// INSRUCTION POUR LE FORMULAIRE D'AJOUT DES ENFANTS
if (isset($_POST['submit'])) //Si l'utilisateur clique sur le bouton
{
$nom = htmlspecialchars($_POST['nom']); // Declaration des variables
$prenom = htmlspecialchars($_POST['prenom']); // Declaration des variables
$section = htmlspecialchars($_POST['section']); // Declaration des variables
$date = htmlspecialchars($_POST['date']); // Déclaration des variables
if (empty($prenom)) {
$errors[] = "Veuillez saisir un prenom"; //Teste si le champs prenom est vide
}
if (empty($nom)) {
$errors[] = "Veuillez saisir un nom"; //Teste si le champs nom est vide
}
if (empty($section)) {
$errors[] = "Veuillez saisir une section "; // Teste si l'utilisateurs ne rentre pas de section
}
if (empty($date)) {
$errors[] = "Veuillez saisir une date "; // Teste si l'utilisateur ne rentre pas de date
}
// Teste si l'utilisateurs ajoutes des caractères spéciaux dans le champs prenom
if (!preg_match('#^[A-Za-z\-\_]{3,15}$#Usi', $_POST['prenom'])) {
$errors[] = "<p>Votre prenom doit se composer de 3 à 15 lettres, il ne doit pas contenir de caractères spéciaux.</p>";
}
// Teste si l'utilisateurs ajoutes des caractères spéciaux dans le champs nom
if (!preg_match('#^[A-Za-z\-\_]{3,15}$#Usi', $_POST['nom'])) {
$errors[] = "<p>Votre nom doit se composer de 3 à 15 lettres, il ne doit pas contenir de caractères spéciaux.</p>";
}
if (!empty($errors)) {
foreach ($errors as $error) //Boucle qui va parcourir les erreurs si il y a une erreur alors on l'affiche et on continue pas.
{
echo "<div class='error'>" . $error . "</div>";
}
}
// Si il y a aucune valeur alors on affiche :
else {
$eleveModele=new EleveModele();
$eleve=$eleveModele->wrapper($_POST);
$eleveModele->create($eleve);
die("Vous venez de definir vos choix, pour voir la liste des enfants <a href='afficher.php'> cliquer ici </a>");
}
}
// FIN DE L'INSTRUCTION DE l'AJOUT DU FORMULAIRE D'ENFANT
?>
Et en sachant que mes fonctions EleveModele.php sont dans le modele :
<?php
require_once 'DAO.php'; // implemente le DAO
require_once 'DataBaseManager.php';
class EleveModele implements DAO
{
private static $db; //Instance de la PDO
function __construct()
{
// $instance = ::self DataBaseManager->getInstance();
self::$db=DataBaseManager::getInstance();
}
public function wrapper($row)
{
$eleve = new Eleve();
$eleve->setIdEnfant($row["idEnfant"]);
$eleve->setPrenom($row["prenom"]);
$eleve->setNom($row["nom"]);
$eleve->setDate($row["date"]);
$eleve->setSection($row["section"]);
return $eleve;
}
public function get($idEnfant)
{
$stmt=self::$db->queryBDD("SELECT * FROM enfant WHERE idEnfant=?",array($idEnfant));
//wrapper
$eleve=$this->wrapper($stmt->fetch());
return $eleve;
}
public function read(){
$listeEleve=array();
$stmt=self::$db->queryBDD("SELECT * FROM enfant ORDER BY nom DESC",null);
//retourner la liste sous forme d'objets FETCH_LAZY
while ($row = $stmt->fetch(PDO::FETCH_LAZY)) {
$eleve=$this->wrapper($row);
$listeEleve[]=$eleve;
}
return $listeEleve;
}
public function create($eleve)
{
$sql = "INSERT INTO enfant(nom,prenom,section,date) VALUES(:nom, :prenom, :section, :date)";
$var = array(":nom" => $eleve->getNom(),":prenom" => $eleve->getPrenom(),":section" => $eleve->getSection(), ":date" => $eleve->getDate());
self::$db->queryBDD($sql, $var);
}
public function update ($eleve)
{
$sql = "UPDATE enfant SET nom=:nom, prenom=:prenom WHERE idEnfant=:idEnfant";
$var = array(":nom" => $eleve->getNom(),
":prenom" => $eleve->getPrenom(),
":idEnfant"=>$eleve->getIdEnfant());
self::$db->queryBDD($sql, $var);
}
public function delete($idEnfant)
{
$sql = "DELETE FROM enfant WHERE idEnfant=:idEnfant";
$var = array(":idEnfant" => $idEnfant);
self::$db->queryBDD($sql, $var);
}
}
?>
Du coup je comprend pas la avec le controleur.
+1 effectivement si tu ne lui envoi pas l'id qu'elle attend en paramètre, ta méthode sert à rien !!
J'ai ajouté, mais ça fonctionne toujours pas, j'avais déjà testé avant de mettre le delete.
if(isset($_GET['idEnfant']))
{
$eleveModele=new EleveModele();
$eleveModele->delete();
}
Mais quand je vais dans mon URL et que je clique sur supprimer j'ai bien :
http://localhost/tpphpmvc2/vue/listEleve.php?delete=28
par exemple, c'est juste que il le supprime pas et je sais pas pourquoi vu que j'ai déjà mis mes requires etc.. en haut
tu l'a fait la ?
parce qu'on s'attend plus à ça :
$eleveModele->delete(id que tu récupère dans ton url);
if(isset($_GET['delete']))
{
$eleveModele=new EleveModele();
$eleveModele->delete($idEnfant);
}
fonctionne pas.
Ask tu essaie des trucs sans même savoir ce que tu fais ...
ici $idEnfant c'est quoi ? je t'ai dit que c'est un paramètre qu'attend ta méthode.
Tu le récupère quand ? comment ?
La c'est du php basic on est plus dans l'objet !
j'ose suppose que c'est ton get :
$_GET['delete']
Si c'est le cas tu devrait pas faire ça ?
if(isset($_GET['delete']))
{
$eleveModele=new EleveModele();
$eleveModele->delete($_GET['delete']);
}
Testes voir ce que j'ai écris ça devrait passer si tu récupère bien l'id dans ton get delete ! :)
master il me sort :
string 'DELETE FROM enfant WHERE idEnfant=28' (length=36)
lol
Si j'ajoute
public function delete($idEnfant)
{
$sql = "DELETE FROM enfant WHERE idEnfant=$idEnfant";
var_dump($sql); die('lol');
$var = array(":idEnfant" => $idEnfant);
self::$db->queryBDD($sql, $var);
}
et dans une autre page que mon controleur
$eleveModele=new EleveModele();
$eleveModele->delete(28);
Bah j'ai enlevé le
var_dump($sql); die('lol');
Il me le supprime bien si j'ajoute dans mon index .php :
$eleveModele=new EleveModele();
$e= $eleveModele->get(30);
$eleveModele->delete(30);
print_r($e);
Le problème là c'est mon controleur
Mais c'est bizarre même si j'ajoute rien et que je clique sur supprimer j'ai pas mon écho qui s'affiche alors que j'ai bien l'id de l'éleve dans l'url
if(isset($_GET['delete']))
{
echo "fds";
}
else
{
echo "fsdfs";
}
J'ai résolu le problème, j'ai ajouté un require et c'est bon il le supprime maintenant en fonction de l'id, maintenant je dois fairel'edit.
J'ai bien le : vue/editerEleve.php?edit=74 avec le formulaire quand je clique sur éditer, et quand je clic sur OK il me dit que les moficiations sont faite, je regarde ma liste et les modifs ne sont pas effectué ... Pourquoi ?
donc j'ai fais :
modele :
require_once 'DAO.php'; // implemente le DAO
require_once 'DataBaseManager.php';
class EleveModele implements DAO
{
private static $db; //Instance de la PDO
function __construct()
{
// $instance = ::self DataBaseManager->getInstance();
self::$db=DataBaseManager::getInstance();
}
public function wrapper($row)
{
$eleve = new Eleve();
$eleve->setIdEnfant($row["idEnfant"]);
$eleve->setPrenom($row["prenom"]);
$eleve->setNom($row["nom"]);
$eleve->setDate($row["date"]);
$eleve->setSection($row["section"]);
return $eleve;
}
public function get($idEnfant)
{
$stmt=self::$db->queryBDD("SELECT * FROM enfant WHERE idEnfant=?",array($idEnfant));
//wrapper
$eleve=$this->wrapper($stmt->fetch());
return $eleve;
}
public function read(){
$listeEleve=array();
$stmt=self::$db->queryBDD("SELECT * FROM enfant ORDER BY nom DESC",null);
//retourner la liste sous forme d'objets FETCH_LAZY
while ($row = $stmt->fetch(PDO::FETCH_LAZY)) {
$eleve=$this->wrapper($row);
$listeEleve[]=$eleve;
}
return $listeEleve;
}
public function create($eleve)
{
$sql = "INSERT INTO enfant(nom,prenom,section,date) VALUES(:nom, :prenom, :section, :date)";
$var = array(":nom" => $eleve->getNom(),":prenom" => $eleve->getPrenom(),":section" => $eleve->getSection(), ":date" => $eleve->getDate());
self::$db->queryBDD($sql, $var);
}
public function update ($eleve)
{
$sql = "UPDATE enfant SET nom=:nom, prenom=:prenom WHERE idEnfant=:idEnfant";
$var = array(":nom" => $eleve->getNom(),
":prenom" => $eleve->getPrenom(),
":idEnfant"=>$eleve->getIdEnfant());
self::$db->queryBDD($sql, $var);
}
public function delete($idEnfant)
{
$sql = "DELETE FROM enfant WHERE idEnfant=:idEnfant";
$var = array(":idEnfant" => $idEnfant);
self::$db->queryBDD($sql, $var);
}
}
?>
la vue la page qui edit : (editerEleve.php)
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="style.css">
<title></title>
</head>
<body>
<div class="contour">
<form action="../controleur/EleveController.php" method="post">
<label for="nom">Nom :</label> <input type="text" name="nom"/><br/><br/>
<label for="prenom">Prenom :</label> <input type="text" name="prenom"/><br/><br/>
<label for="date">Age :</label> <input type="date" name="date" /><br/><br/>
<label for="Section">Section :</label> <input type="text" name="section"/><br/><br/>
<input type="submit" name="subed" value="OK"/>
</form>
</div>
</body>
</html>
la vue la page qui liste (listEleve.php)
<head>
<meta charset="UTF-8">
<title></title>
<style>
table
{
border-collapse: collapse; /* Les bordures du tableau seront collées (plus joli) */
}
td
{
border: 1px solid black;
}
</style>
</head>
<table>
<tr>
<td>ID </td>
<td>PRENOM </td>
<td>NOM </td>
<td>NAISSANCE </td>
<td>SECTION </td>
<td>SUPPRIMER </td>
<td>EDITER </td>
</tr>
<?php
require_once '../class/Eleve.class.php';
require_once '../modele/EleveModele.php';
require '../controleur/EleveController.php';
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
$eleveModele=new EleveModele();
$listeEleves=$eleveModele->read();
foreach ($listeEleves as $listeEleve)
{
?>
<tr>
<td> <?php echo $listeEleve->getIdEnfant();?></td>
<td> <?php echo $listeEleve->getPrenom();?></td>
<td><?php echo $listeEleve->getNom();?></td>
<td><?php echo $listeEleve->getDate();?></td>
<td><?php echo $listeEleve->getSection();?></td>
<td><a href="listeleve.php?delete=<?php echo $listeEleve->getIdEnfant();?>">Supprimer</a></td>
<td><a href="editerEleve.php?edit=<?php echo $listeEleve->getIdEnfant(); ?>">Editer</a></td>
</tr>
<?php
}
?></table>
le controleur :
```<?php
require_once '../class/Eleve.class.php';
require_once '../modele/EleveModele.php';
if(isset($_GET['delete']))
{
$eleveModele=new EleveModele();
$eleveModele->delete($_GET['delete']);
}
// INSRUCTION POUR LE FORMULAIRE D'AJOUT DES ENFANTS
if (isset($_POST['submit'])) //Si l'utilisateur clique sur le bouton
{
$nom = htmlspecialchars($_POST['nom']); // Declaration des variables
$prenom = htmlspecialchars($_POST['prenom']); // Declaration des variables
$section = htmlspecialchars($_POST['section']); // Declaration des variables
$date = htmlspecialchars($_POST['date']); // Déclaration des variables
if (empty($prenom)) {
$errors[] = "Veuillez saisir un prenom"; //Teste si le champs prenom est vide
}
if (empty($nom)) {
$errors[] = "Veuillez saisir un nom"; //Teste si le champs nom est vide
}
if (empty($section)) {
$errors[] = "Veuillez saisir une section "; // Teste si l'utilisateurs ne rentre pas de section
}
if (empty($date)) {
$errors[] = "Veuillez saisir une date "; // Teste si l'utilisateur ne rentre pas de date
}
// Teste si l'utilisateurs ajoutes des caractères spéciaux dans le champs prenom
if (!preg_match('#^[A-Za-z\-\_]{3,15}$#Usi', $_POST['prenom'])) {
$errors[] = "<p>Votre prenom doit se composer de 3 à 15 lettres, il ne doit pas contenir de caractères spéciaux.</p>";
}
// Teste si l'utilisateurs ajoutes des caractères spéciaux dans le champs nom
if (!preg_match('#^[A-Za-z\-\_]{3,15}$#Usi', $_POST['nom'])) {
$errors[] = "<p>Votre nom doit se composer de 3 à 15 lettres, il ne doit pas contenir de caractères spéciaux.</p>";
}
if (!empty($errors)) {
foreach ($errors as $error) //Boucle qui va parcourir les erreurs si il y a une erreur alors on l'affiche et on continue pas.
{
echo "<div class='error'>" . $error . "</div>";
}
}
// Si il y a aucune valeur alors on affiche :
else {
$eleveModele=new EleveModele();
$eleve=$eleveModele->wrapper($_POST);
$eleveModele->create($eleve);
die("Vous venez de definir vos choix, pour voir la liste des enfants <a href='afficher.php'> cliquer ici </a>");
}
}
// FIN DE L'INSTRUCTION DE l'AJOUT DU FORMULAIRE D'ENFANT
// INSRUCTION POUR LE FORMULAIRE D'AJOUT DES ENFANTS
if (isset($_POST['subed'])) //Si l'utilisateur clique sur le bouton
{
$nom = htmlspecialchars($_POST['nom']); // Declaration des variables
$prenom = htmlspecialchars($_POST['prenom']); // Declaration des variables
$section = htmlspecialchars($_POST['section']); // Declaration des variables
$date = htmlspecialchars($_POST['date']); // Déclaration des variables
if (empty($prenom)) {
$errors[] = "Veuillez saisir un prenom"; //Teste si le champs prenom est vide
}
if (empty($nom)) {
$errors[] = "Veuillez saisir un nom"; //Teste si le champs nom est vide
}
if (empty($section)) {
$errors[] = "Veuillez saisir une section "; // Teste si l'utilisateurs ne rentre pas de section
}
if (empty($date)) {
$errors[] = "Veuillez saisir une date "; // Teste si l'utilisateur ne rentre pas de date
}
// Teste si l'utilisateurs ajoutes des caractères spéciaux dans le champs prenom
if (!preg_match('#^[A-Za-z\-\_]{3,15}$#Usi', $_POST['prenom'])) {
$errors[] = "<p>Votre prenom doit se composer de 3 à 15 lettres, il ne doit pas contenir de caractères spéciaux.</p>";
}
// Teste si l'utilisateurs ajoutes des caractères spéciaux dans le champs nom
if (!preg_match('#^[A-Za-z\-\_]{3,15}$#Usi', $_POST['nom'])) {
$errors[] = "<p>Votre nom doit se composer de 3 à 15 lettres, il ne doit pas contenir de caractères spéciaux.</p>";
}
if (!empty($errors)) {
foreach ($errors as $error) //Boucle qui va parcourir les erreurs si il y a une erreur alors on l'affiche et on continue pas.
{
echo "<div class='error'>" . $error . "</div>";
}
}
// Si il y a aucune valeur alors on affiche :
else {
$eleveModele=new EleveModele();
$eleve=$eleveModele->wrapper($_POST);
$eleveModele->update($eleve);
die("La modification à bien ete effectué");
}
}
// FIN DE L'INSTRUCTION DE l'AJOUT DU FORMULAIRE D'ENFANT
?>