Bonsoir,
Je développe en ce moment une petite application de gestion d'email en PHP orienté objet sans framework. Cette application est censée créer, lire, modifier et supprimer un mail. Or avec cette application, je peux bien créer, lire un mail, lire tous les mails de la base de données et supprimer un mail. Mais pour modifier un mail, j'arrive à le modifier dans la session mais pas dans la base de données. En effet, le problème vient de l'id. En faisant un var_dump de ma session, la session ne récupère pas l'id de l'email et j'en ai besoin afin de prendre dans ma requête SQL comme paramètre un champ non modifiable. Car l'id est auto incrémenté et génerer automatiquement par la base de données. Voici l'intégralité de mon code, d'abord ma page de formulaire de connexion :
<?php
//Mon formulaire de connextion au back-office
//Définition de l'espace de travail du projet
namespace app;
//Inclusion des script PHP nécessaire au bon déroulement du traitement
include('_entete.php');
include('../app/config/identifiantsbdd.php');
include('../app/config/DatabaseAccess.php');
include('../app/managers/EmailManager.php');
include('../app/entities/email.php');
?>
<form action="traitement.php" method="POST">
<div class="form-group">
<input type="hidden" class="form-control" name="id" id="exampleInputId1" aria-describedby="idHelp"
placeholder="C'est l'id">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Mon adresse email</label>
<input type="email" class="form-control" name="email" id="exampleInputEmail1" aria-describedby="emailHelp"
placeholder="Entrer votre adresse Email">
</div>
<div class=\"form-group\">
<label for="exampleInputPassword1">Mot de passe</label>
<input type="password" class="form-control" name="password" id="exampleInputPassword1"
placeholder="Entrer votre mot de passe">
</div>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1"></p>
<label class="form-check-label" for="exampleCheck1">Se souvenir de moi</label>
</div>
<button type="submit" name="envoyer" class="btn btn-primary btn-lg">Envoyer</button>
<div class="form-group">
<input type="hidden" name="id" value=""></p>
</div>
<!-- on cache ID mais on en a besoin pour récupérer les données -->
</form>
<br>
<a href='creation.php'>
<button type="button" class="btn btn-info btn-lg">Ajouter un Email</button>
</a>
</div>
</body>
<?php
include('_piedpage.php');
?>
Quand on est authentifié dans le système et que mon email me permettant de me connecter est présent dans la base, un message de bienvenue et l'email reconnu apparait. De plus, il y a un bouton modifier et supprimer à côté. Voici la page :
<?php
//Déclaration de l'espace de travail du projet
namespace app;
//Démarrage de la session
session_start();
//Condition qui doit vérifié si l'utilisateur est authentifié
/*
if (empty($_SESSION["email"])) {
header('location:formulaire.php');
exit();
}*/
//Inclusion des scripts nécessaire au traitement des données venant de la base de données
include("_entete.php");
include("../app/config/identifiantsbdd.php");
include("../app/config/DatabaseAccess.php");
include("../app/entities/email.php");
include("../app/managers/EmailManager.php");
//Activation des erreurs PDO
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//Création des objets pour l'email et leur traitement
$result = new EmailManager();
$mail = new email($_POST['email'], $_POST['password']);
//Récupération des valeurs passé dans le formulaire et affectation dans la session
$mailpersonne = $_POST["email"];
$pass = $_POST["password"];
$_SESSION["id"] = $_POST["id"];
?>
<table class="table">
<thead>
<tr>
<th scope="col">Session</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<?php
//var_dump($_SESSION["id"]);
//Condition stipulant que si on clique sur le bouton "envoyer" et que si le contenu des champs n'est pas vide, on affiche le "Bonjour $_SESSION"
if (isset($mailpersonne) && isset($pass) && isset($_POST["envoyer"])) {
//$mail = new email($_POST["id"], $_POST["email"], $_POST["password"]);
$_SESSION["email"] = $mailpersonne;
$_SESSION["password"] = $pass;
//$id = $_SESSION["id"];
var_dump($_SESSION);
var_dump($result->read($_SESSION["email"]));
//var_dump($id);
echo "<tr>";
echo "<td>";
echo "</td>";
if ($result->read($_SESSION["email"]) == true) {
$id = $mail->getId();
echo "<input type=\"hidden\" name=\"id\" value=\"" . $_SESSION["id"] . "\">" . "</p>";
echo "<td>" . "Bienvenue " . $_SESSION["email"] . '<br>' . "</li>";
echo "</td>";
echo "<td>";
echo "<a href='modification.php'><button type=\"button\" class=\"btn btn-success \">Modifier</button></a>";
echo "</td>";
echo "<td>";
echo "<a href='modification.php'.><button type=\"button\" class=\"btn btn-warning \" name=\"supprimer\">Supprimer</button></a>";
echo "</td>";
}
}
?>
</tbody>
</table>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Email</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<?php
$donnees = $result->readAll();
//Récupération des email venant de la base de données
foreach ($donnees as $donnee) {
echo "<tr>";
echo "<td>" . "<li name='id'>" . $donnee["idemail"] . "</li>";
echo "</td>";
echo "<td>" . "<li name='email'>" . $donnee["emailpersonne"] . "</li>";
echo "</td>";
echo "<td>";
echo "</td>";
echo "</tr>";
echo "</form>";
}
?>
</tbody>
</table>
<br>
<p>
<a href="index.php">
<button type="submit" name="envoyer" class="btn btn-primary btn-lg">Formulaire de connexion</button>
</a>
</p>
<a href='creation.php'>
<button type="button" class="btn btn-info btn-lg">Ajouter un Email</button>
</a>
</body>
<?php include('_piedpage.php'); ?>
Donc quand je clique sur "modifier", je tombe sur un formulaire de modification où s'affiche l'email et le mot de passe à modifier que voici :
<?php
//Mon formulaire de modification au back-office
//Définition de l'espace de travail du projet
namespace app;
session_start();
//Inclusion des script PHP nécessaire au bon déroulement du traitement
include('_entete.php');
include("../app/config/identifiantsbdd.php");
include('../app/config/DatabaseAccess.php');
include('../app/entities/email.php');
include("../app/managers/EmailManager.php");
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
$_POST["email"] = $_SESSION["email"];
$_POST["password"] = $_SESSION["password"];
$mail = new email($_POST["email"], $_POST["password"]);
?>
<form action="traitementmodif.php" method="POST">
<div class="form-group">
<input type="hidden" name="id" value="<?php echo $_SESSION["id"]; ?>" </p>
<!-- on cache ID mais on en a besoin pour récupérer les données -->
</div>
<div class="form-group">
<label for="exampleInputEmail1">Modification de adresse email</label>
<input type="email" class="form-control" name="email" id="exampleInputEmail1" aria-describedby=\"emailHelp"
value="<?php echo $_POST["email"]; ?> ">
<div class="form-group">
<label for="exampleInputPassword1">Mot de passe</label>
<input type="password" class="form-control" name="password" id="exampleInputPassword1"
value="<?php echo $_POST["password"]; ?>">
</div>
</div>
<button type="submit" name="renvoyer" class="btn btn-success">Renvoyer</button>
<button type="submit" name="supprimer" class="btn btn-warning">Supprimer</button>
</form>
<br>
<a href='creation.php'>
<button type="button" class="btn btn-info btn-lg">Ajouter un Email</button>
</a>
<?php include('_piedpage.php'); ?>
Ensuite en appuyant sur le bouton "renvoyer", il modifie dans la session mais pas dans la base de données comme je l'ai dis précédent. Car l'id n'est pas récupéré. Dans tous les cas, voici la page qui est redirigé après avoir cliqué sur "renvoyer" :
<?php
/**
* Created by PhpStorm.
* User: Honoré
* Date: 07/06/2018
* Time: 18:58
*/
//Mon formulaire de modification au back-office
//Définition de l'espace de travail du projet
namespace app;
//Inclusion des script PHP nécessaire au bon déroulement du traitement
include('_entete.php');
include("../app/config/identifiantsbdd.php");
include('../app/config/DatabaseAccess.php');
include('../app/entities/email.php');
include("../app/managers/EmailManager.php");
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
$result = new EmailManager();
$_SESSION["id"] = $_POST["id"];
$_SESSION["email"] = $_POST["email"];
$_SESSION["password"] = $_POST["password"];
if (isset($_POST["renvoyer"])) {
if (isset($_POST["email"]) && $_POST["password"]) {
$email = new email($_POST["email"], $_POST["password"]);
$email->setEmail(htmlspecialchars($_POST["email"]))->setPassword(htmlspecialchars($_POST["password"]));
var_dump($_SESSION);
$result->update($_POST["email"], $_POST["password"]);
if ($result->update($_POST["email"], $_POST["password"]) == true) {
echo "<div class=\"alert alert-success\" role=\"alert\">
L'email modifié avec succès et dévotion !
</div>";
} else {
echo "<div class=\"alert alert-warning\" role=\"alert\">
L'email n'a pas été modifié avec échec et déception !
</div>";
}
}
}
//Condition stipulant que si on clique sur le bouton "supprimer" et que si le contenu des champs n'est pas vide, on affiche les messages suivants :
if (isset($_POST["supprimer"])) {
var_dump($result->delete($_SESSION["email"]));
if ($result->delete($_SESSION["email"]) == true) {
echo "<div class=\"alert alert-success\" role=\"alert\">
L'email supprimé avec succès et dévotion !
</div>";
} else {
echo "<div class=\"alert alert-warning\" role=\"alert\">
L'email n'est pas supprimer avec échec et déception !
</div>";
}
}
?>
<table class="table">
<thead>
<tr>
<th scope="col">Session</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<?php
//Condition stipulant que si on clique sur le bouton "envoyer" et que si le contenu des champs n'est pas vide, on affiche le "Bonjour $_SESSION"
if (isset($_POST["renvoyer"])) {
if (isset($_POST["email"]) && isset($_POST["password"])) {
$_SESSION["email"] = $email->getEmail();
$result->read($_SESSION["email"]);
echo "<tr>";
echo "<td>";
echo "</td>";
echo "<input type=\"hidden\" name=\"id\" value=\"" . $_SESSION["id"] . "\">" . "</p>";
echo "<td>" . "Bienvenue " . $_SESSION["email"] . '<br>' . "</li>";
echo "</td>";
echo "<td>";
echo "<a href='modification.php'><button type=\"button\" class=\"btn btn-success \">Modifier</button></a>";
echo "</td>";
echo "<td>";
echo "<a href='modification.php'><button type=\"button\" class=\"btn btn-warning \" name=\"supprimer\">Supprimer</button></a>";
echo "</td>";
}
}
/*
//Condition stipulant que si on clique sur le bouton "supprimer" et que si le contenu des champs n'est pas vide, on affiche les messages suivants :
if (isset($_POST["supprimer"])) {
var_dump($result->delete($email));
if ($result->delete($email) == true) {
echo "<div class=\"alert alert-success\" role=\"alert\">
L'email supprimé avec succès et dévotion !
</div>";
} else {
echo "<div class=\"alert alert-warning\" role=\"alert\">
L'email n'est pas supprimer avec échec et déception !
</div>";
}
}*/
?>
</tbody>
</table>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Email</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<?php
$donnees = $result->readAll();
//Récupération des email venant de la base de données
foreach ($donnees as $donnee) {
echo "<tr>";
echo "<td>" . "<li name='id'>" . $donnee["idemail"] . "</li>";
echo "</td>";
echo "<td>" . "<li name='email'>" . $donnee["emailpersonne"] . "</li>";
echo "</td>";
echo "<td>";
//echo "<a href='modification.php?id=$id'><button type=\"button\" class=\"btn btn-success \">Modifier</button></a>";
echo "</td>";
echo "<td>";
echo "</a>";
echo "</td>";
echo "</tr>";
echo "</form>";
}
?>
</tbody>
</table>
<br>
<p>
<a href="index.php">
<button type="submit" name="envoyer" class="btn btn-primary btn-lg">Formulaire de connexion</button>
</a>
</p>
<a href='creation.php'>
<button type="button" class="btn btn-info btn-lg">Ajouter un Email</button>
</a>
</body>
<?php include('_piedpage.php'); ?>
D'ou ma demande aujourd'hui, modifier l'email à la fois dans la session et dans la base de données. Pour cela, j'ai crée un entité email faisant référence à ma table email que voici :
<?php
/**
* Created by PhpStorm.
* User: Honoré
* Date: 13/05/2018
* Time: 21:18
*/
//Class entité d'un Email faisant référence au colonne de la table Email
namespace app;
//include_once('../config/autoload.php');
class email
{
//Les colonnes de la table défini comme attribut de la classe
private $id;
private $email;
private $password;
/**
* email constructor.
* @param $id
* @param $email
* @param $password
*/
public function __construct($email, $password)
{
//$this->id = $id;
$this->email = $email;
$this->password = $password;
}
//Ensuite les assesseurs et mutateurs permettant de récuperer les enregistrements de la table
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}
/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* @return mixed
*/
public function getPassword()
{
return $this->password;
}
/**
* @param mixed $password
*/
public function setPassword($password)
{
$this->password = $password;
return $this;
}
}
Et voici mon manager effectuant mes requête en base de données. la méthode concerné par le problème est la méthode "update", les autres méthodes de mon EmailManager marchent bien et interagissent bien avec la base de données sauf la méthode "update". Voici mon EmailManager :
<?php
/**
* Created by PhpStorm.
* User: Honoré
* Date: 13/05/2018
* Time: 21:30
*/
//Controller éffectuant les CRUD en base de données pour la table E-mail
//Utilisation de l'espace de travail
namespace app;
//Utilisation de l'objet PDO pour interagir avec la base de données
use PDO;
//Class permettant d'effectuer les requêtes CRUD en base de données dans la table E-mail, elle hérite de la classe de connexion en base de données
class EmailManager extends DatabaseAccess
{
protected $sql;
//Constructeur faisant appel au constructeur mère à savoir DatabaseAccess
public function __construct()
{
parent::__construct();
}
//Methode de création d'un courriel
public function create()
{
$email = new email($_POST["email"], $_POST["password"]);
$sql = $this->pdo->prepare('INSERT INTO email (emailpersonne, password) VALUES (:emailpersonne, :password)');
$resultat = $sql->execute(array(":emailpersonne" => $email->getEmail(), ":password" => $email->getPassword()));
$sql->closeCursor();
return $resultat;
}
//Méthode permettant de sélectionner un courriel dans la base de données en fonction de ce qui est entré en base de données
public function read($emailpersonne)
{
$sql = $this->pdo->prepare('SELECT emailpersonne FROM email WHERE emailpersonne=:emailpersonne');
$sql->execute(array(":emailpersonne" => $emailpersonne));
$resultat = $sql->fetch();
$sql->closeCursor();
return $resultat;
}
//Méthode ayant comme signature le récupération de tous les email de la table
public function readAll()
{
$email = new email($_POST["email"], $_POST["password"]);
$sql = $this->pdo->prepare('SELECT idemail, emailpersonne, password FROM email ORDER BY idemail =:idemail');
$sql->execute(array(":idemail" => $email->getId()));
$resultat = $sql->fetchAll();
$sql->closeCursor();
return $resultat;
}
//Méthode permettant de mettre à jour un email
public function update($emailpersonne, $password)
{
$mail = new email($_POST["email"], $_POST["password"]);
$sql = $this->pdo->prepare('UPDATE email SET emailpersonne=:emailpersonne, password=:password WHERE idemail =:idemail');
$resultat = $sql->execute(array(":emailpersonne" => $emailpersonne, ":password" => $password, ":idemail"=>$mail->getId()));
$sql->closeCursor();
return $resultat;
}
//Méthode de suppression un email
public function delete($emailpersonne)
{
$sql = $this->pdo->prepare('DELETE FROM email WHERE emailpersonne =:emailpersonne LIMIT 1');
$resultat = $sql->execute(array(":emailpersonne" => $emailpersonne));
$sql->closeCursor();
return $resultat;
}
}
Ce manager étend une class DatabaseAccess effectuant une connexion à la base de données que voici :
<?php
/**
* Created by PhpStorm.
* User: Honoré
* Date: 13/05/2018
* Time: 20:28
*/
namespace app;
use PDO;
class DatabaseAccess
{
private $dbname = DBNAME;
private $dbhost = DBHOST;
private $dbuser = DBUSER;
private $dbpass = DBPASS;
protected $pdo;
public function __construct()
{
try {
$this->pdo = new \PDO("mysql:host=" . $this->dbhost . ";dbname=" . $this->dbname, $this->dbuser, $this->dbpass);
// Activation des erreurs PDO
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo 'La connexion a échouée : ' . $e->getMessage();
}
}
}
Et j'ai aussi un fichier déclarant des identifiants pour me connecter à ma base que voici :
<?php
/**
* Created by PhpStorm.
* User: Honoré
* Date: 14/05/2018
* Time: 21:28
*/
define('DBHOST', '127.0.0.1');
define('DBNAME', 'poo');
define('DBUSER', 'root');
define('DBPASS', '');
Pouvez-vous m'aider, ce serait cool ?
Cordialement