Skip to content

CRUD

On va maintenant ajouter les opérations de base Create, Read, Update, Delete

  • Avant la liste des articles ajouter un lien vers la page de création (create.php)

    <a href="create.php">Créer un nouvel article</a>
  • Créer le fichier create.php et ajouter le formulaire de création (garder le template habituel header/footer)

  • Dans admin_data.php entre la connexion à la base et la récupération des articles, gérer l’insertion en base

  • Pour savoir si nous devions faire une insertion, dans le premier exemple dans la partie formulaire nous testions si la méthode était en POST:

    if ($_SERVER["REQUEST_METHOD"] == "POST") {

    Nous allons peut être devoir gérer l’arrivée d’information de plusieurs formulaires (Update?), il est intéressant dans ce cas de plutôt vérifié si c’est un ajout que l’on souhaite faire. Dans le formulaire sur l’input «submit» on peut ajouter un name="ajout_article"

    <input type="submit" value="Publier" name="ajout_article">

    Puis notre test devient

    if (isset($_POST['ajout_article'])) {
Voir la correction
blog.php
<?php include 'admin_data.php'; ?>
<?php include 'header.php'; ?>
<h1>Mini-Blog</h1>
<a href="create.php">Créer un nouvel article</a>
<?php
echo "<h2>Articles publiés</h2>";
foreach ($articles as $article) {
echo "<article>";
echo "<h3>" . htmlspecialchars($article->titre) . "</h3>";
echo "<p>" . nl2br(htmlspecialchars($article->contenu)) . "</p>";
echo "</article>";
}
?>
<?php include 'footer.php'; ?>
create.php
<?php include 'header.php'; ?>
<h1>Mini-Blog - Créer un nouvel article</h1>
<form method="post" action="blog.php">
<input type="text" name="titre" placeholder="Titre de l'article" required><br>
<textarea name="contenu" placeholder="Contenu de l'article" required></textarea><br>
<input type="submit" value="Publier" name="ajout_article">
</form>
<?php include 'footer.php'; ?>
admin_data.php
<?php
//une variable PHP de type tableau pour stocker les articles que l'on va récupérer dans la BDD
$articles = [];
//Base de données
try {
// Connextion à la base de données SQLite
$pdo = new \PDO('sqlite:' . realpath("./database.sqlite"));
//Si le formulaire HTML d'ajout d'article a été rempli
if (isset($_POST['ajout_article'])) {
$query = $pdo->prepare("INSERT INTO articles (titre, contenu) VALUES (?,?)"); //préparation d'une requête SQL d'insertion d'un article
$query->execute([$_POST['titre'], $_POST['contenu']]); //execution de la requête en injectant les valeurs à la place des ? ci-dessus
}
//Récupération des données de la table articles
$query = $pdo->prepare('SELECT * FROM articles');
$query->execute();
$articles = $query->fetchAll(PDO::FETCH_CLASS);
//echo "<pre>".print_r($articles,true)."</pre>";die; //décommenter pour voir le condtenu du tableau articles
} catch (Exception $e) { //le bloc try / catch permet de capturer les erreurs
print "Erreur base de données : " . $e->getMessage() . "<br/>";
die();
}
?>

https://github.com/nn-teach/PHP-intro/tree/CRUD---Create

On va créer une page pour chaque article

  • Sur le titre de chaque article ajouté un lien vers read.php en ajoutant l’id de l’article en paramètre GET
  • Créer le fichier read.php
  • Dans le fichier read.php récuperer l’id de l’article en get
  • Récupérer l’article en base de donnée
  • Afficher l’article
Voir la correction
blog.php
<?php include 'admin_data.php'; ?>
<?php include 'header.php'; ?>
<h1>Mini-Blog</h1>
<a href="create.php">Créer un nouvel article</a>
<?php
echo "<h2>Articles publiés</h2>";
foreach ($articles as $article) {
echo "<article>";
echo "<h3><a href=read.php?articleId=". $article->id. ">" . htmlspecialchars($article->titre) . "</a></h3>";
echo "<p>" . nl2br(htmlspecialchars($article->contenu)) . "</p>";
echo "</article>";
}
?>
<?php include 'footer.php'; ?>
read.php
<?php include 'admin_data.php'; ?>
<?php include 'header.php'; ?>
<h1>Mini-Blog</h1>
<?php
if (isset($_GET['articleId'])) {
$query = $pdo->prepare('SELECT * FROM articles WHERE id =' . $_GET['articleId']);
$query->execute();
$article = $query->fetch(PDO::FETCH_OBJ);
echo '<h2>'.$article->titre.'</h2>';
echo "<p>" . nl2br(htmlspecialchars($article->contenu)) . "</p>";
} else {
echo "<p>Aucun article sélectionné</p>";
}
?>
<?php include 'footer.php'; ?>

https://github.com/nn-teach/PHP-intro/tree/CRUD---Read

  • Ajouter un lien vers une page update.php qui contient l’id de l’article
  • Créer le fichier update.php avec un formulaire comme pour la création et pré-remplisser le formulaire avec les informations de l’article
  • Gérer l’edition dans admin_data
Voir la correction
blog.php
<?php include 'admin_data.php'; ?>
<?php include 'header.php'; ?>
<h1>Mini-Blog</h1>
<a href="create.php">Créer un nouvel article</a>
<?php
foreach ($articles as $article) {
echo "<h3><a href=read.php?articleId=". $article->id. ">" . htmlspecialchars($article->titre) . "</a></h3>";
echo "<p>" . nl2br(htmlspecialchars($article->contenu)) . "</p>";
echo "<p><a href=update.php?articleId=". $article->id.">modifier</a></p>";
}
?>
<?php include 'footer.php'; ?>
update.php
<?php include 'admin_data.php'; ?>
<?php include 'header.php'; ?>
<h1>Mini-Blog</h1>
<?php
if (isset($_GET['articleId'])) {
$query = $pdo->prepare('SELECT * FROM articles WHERE id =' . $_GET['articleId']);
$query->execute();
$article = $query->fetch(PDO::FETCH_OBJ);
echo '<h2>'.$article->titre.'</h2>';
echo "<p>" . nl2br(htmlspecialchars($article->contenu)) . "</p>";
?>
<form method="post" action="blog.php">
<input type="hidden" name="articleId" value="<?php echo $article->id; ?>">
<input type="text" name="titre" value="<?php echo $article->titre; ?>" required><br>
<textarea name="contenu" required><?php echo $article->contenu; ?></textarea><br>
<input type="submit" value="Modifier" name="modifier_article">
<?php
} else {
echo "<p>Aucun article sélectionné</p>";
}
?>
<?php include 'footer.php'; ?>
admin_data.php
<?php
//une variable PHP de type tableau pour stocker les articles que l'on va récupérer dans la BDD
$articles = [];
//Base de données
try {
// Connextion à la base de données SQLite
$pdo = new \PDO('sqlite:' . realpath("./database.sqlite"));
//Si le formulaire HTML d'ajout d'article a été rempli
if (isset($_POST['ajout_article'])) {
$query = $pdo->prepare('INSERT INTO articles ("titre", "contenu") VALUES (?,?)'); //préparation d'une requête SQL d'insertion d'un article
$query->execute([$_POST['titre'], $_POST['contenu']]); //execution de la requête en injectant les valeurs à la place des ? ci-dessus
}
//Si le formulaire HTML d'edition d'article a été rempli
if (isset($_POST['modifier_article'])) {
//préparation d'une requête SQL d'update d'un article
$query = $pdo->prepare('UPDATE articles SET titre = ?, contenu = ? WHERE id = ?');
$query->execute([$_POST['titre'], $_POST['contenu'], $_POST['articleId']]); //execution de la requête en injectant les valeurs à la place des ? ci-dessus
}
//Récupération des données de la table articles
$query = $pdo->prepare('SELECT * FROM articles');
$query->execute();
$articles = $query->fetchAll(PDO::FETCH_CLASS);
//echo "<pre>".print_r($articles,true)."</pre>";die; //décommenter pour voir le condtenu du tableau articles
} catch (Exception $e) { //le bloc try / catch permet de capturer les erreurs
print "Erreur base de données : " . $e->getMessage() . "<br/>";
die();
}
?>

https://github.com/nn-teach/PHP-intro/tree/CRUD---Update

  • A coté du lien d’édition ajouter un formulaire avec un bouton supprimer
  • Gérer la suppression dans admin_data.php
Voir la correction
blog.php
<?php include 'admin_data.php'; ?>
<?php include 'header.php'; ?>
<h1>Mini-Blog</h1>
<a href="create.php">Créer un nouvel article</a>
<?php
echo "<h2>Articles publiés</h2>";
foreach ($articles as $article) {
echo "<article>";
echo "<h3><a href=read.php?articleId=". $article->id. ">" . htmlspecialchars($article->titre) . "</a></h3>";
echo "<p>" . nl2br(htmlspecialchars($article->contenu)) . "</p>";
echo "<div>";
echo "<a href=update.php?articleId=". $article->id.">modifier</a>";
echo '<form method="post" action="blog.php">
<input type="hidden" name="articleId" value="'.$article->id.'">
<input type="submit" value="Supprimer" name="supprimer_article">';
echo "</div>";
echo "</article>";
}
?>
<?php include 'footer.php'; ?>
admin_data.php
<?php
//une variable PHP de type tableau pour stocker les articles que l'on va récupérer dans la BDD
$articles = [];
//Base de données
try {
// Connextion à la base de données SQLite
$pdo = new \PDO('sqlite:' . realpath("./database.sqlite"));
//Si le formulaire HTML d'ajout d'article a été rempli
if (isset($_POST['ajout_article'])) {
$query = $pdo->prepare('INSERT INTO articles ("titre", "contenu") VALUES (?,?)'); //préparation d'une requête SQL d'insertion d'un article
$query->execute([$_POST['titre'], $_POST['contenu']]); //execution de la requête en injectant les valeurs à la place des ? ci-dessus
}
//Si le formulaire HTML d'edition d'article a été rempli
if (isset($_POST['modifier_article'])) {
//préparation d'une requête SQL d'update d'un article
$query = $pdo->prepare('UPDATE articles SET titre = ?, contenu = ? WHERE id = ?');
$query->execute([$_POST['titre'], $_POST['contenu'], $_POST['articleId']]); //execution de la requête en injectant les valeurs à la place des ? ci-dessus
}
//Si le formulaire HTML de suppression d'article a été rempli
if (isset($_POST['supprimer_article'])) {
//préparation d'une requête SQL de suppression d'un article
$query = $pdo->prepare('DELETE FROM articles WHERE id = ?');
$query->execute([$_POST['articleId']]); //execution de la requête en injectant les valeurs à la place des ? ci-dessus
}
//Récupération des données de la table articles
$query = $pdo->prepare('SELECT * FROM articles');
$query->execute();
$articles = $query->fetchAll(PDO::FETCH_CLASS);
//echo "<pre>".print_r($articles,true)."</pre>";die; //décommenter pour voir le condtenu du tableau articles
} catch (Exception $e) { //le bloc try / catch permet de capturer les erreurs
print "Erreur base de données : " . $e->getMessage() . "<br/>";
die();
}
?>

https://github.com/nn-teach/PHP-intro/tree/CRUD---Delete

Quelques styles supplémentaires

https://github.com/nn-teach/PHP-intro/tree/CRUD---Final