Aujourd’hui on va voir comment faire un crud en php : Le crud est le diminutif pour designer les opérations : create, read, update, delete, qui sont les opérations courantes d’interactions entre un site (admin) et sa base de données.
Tout administrateur doit pouvoir supprimer rajouter, mettre à jour des utilisateurs ou des produits sur son site. Ces quelques pages de code peuvent donc servir de base à un début de backoffice: pas de système de connection ici, mais des interfaces avec les opérations nécéssaires pour interagir avec la base de donnée.
Nous allons donc créer une base de donnée
Pour le rendu visuel des pages, on va importer bootstrap et inclure les dossiers à la racine de notre petit projet:
On va créer un fichier contenant les informations de connection à la base, puis 4 fichiers pour nos opérations CRUD.
l’index:
La page read
La page édition
et au clic sur ‘delete’ une page de confirmation:
1-La base de donnée
Dans PhpMyAdmin, je crée une base, je la nomme testphp.Dedans, en prévision d’un formulaire d’ajout bien rempli, je crée tous mes champs :
Normalement pour un petit crud on met juste un name et un mail, mais ici je tenais à montrer le maximum d’exemple d’input (mail, select, radio, checkbox) pour voir justement comment les traiter.
Erratum: comme me le signale un lecteur en commentaire plus bas, le numéro de tel peut etre mis de préférence dans un champ texte, soit de type « varchar » dan la base de donnée et non « int « !
2- L’Arborescence
Une fois la base crée, on peut créer notre projet sur notre serveur (wamp/www).On crée un dossier que l’on nomme comme on veut (crud ici pour l’exemple).A l’intérieur on y place les trois fichiers bootstrap js, css et img, comme ceci:
Dans ce dossier, comme sur l’image et pour prendre de l’avance, on va créer tous nos fichiers crud:
add.php
delete.php
edit.php
read.php
et index.php.
Contrairement à de nombreux tutos qui placent le code de connection dans chaque fichier, ici on va placer le notre dans un fichier à part qu’on va appeler database.php, et qui contiendra uniquement le code de connection à notre base testphp…c’est parti!!!
On commence donc par le fichier principal, database.php
<?php class Database { private static $dbName = 'testphp' ; private static $dbHost = 'localhost' ; private static $dbUsername = 'root'; private static $dbUserPassword = ''; private static $cont = null; public function __construct() { die('Init function is not allowed'); } public static function connect() { if ( null == self::$cont ) { try { self::$cont = new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword); } catch(PDOException $e) { die($e->getMessage());
}
}
return self::$cont;
}
public static function disconnect()
{
self::$cont = null;
}
}
?>
Ce fichier contient une classe qu’on va appeler « database » et qui contient les informations de connection à notre base de donnée .On instancie l’objet PDO qui nous permet le lien à la base.
Reportez vous à la doc pour en savoir plus sur l’objet PDO.
Pour aller plus vite, et permettre à tous de beaux copier coller(: ) ) je vais lister les fichiers un à un :
index.php
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Crud en php</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/responsive.css" rel="stylesheet">
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22js%2Fbootstrap.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" />
</head>
<body>
<br />
<div class="container">
<br />
<div class="row">
<br />
<h2>Crud en Php</h2>
<p>
</div>
<p>
<br />
<div class="row">
<a href="add.php" class="btn btn-success">Ajouter un user</a>
<br />
<div class="table-responsive">
<br />
<table class="table table-hover table-bordered">
<br />
<thead>
<th>Name</th>
<p>
<th>Firstname</th>
<p>
<th>Age</th>
<p>
<th>Tel</th>
<p>
<th>Pays</th>
<p>
<th>Email</th>
<p>
<th>Comment</th>
<p>
<th>metier</th>
<p>
<th>Url</th>
<p>
<th>Edition</th>
<p>
</thead>
<p>
<br />
<tbody>
<?php include 'database.php'; //on inclut notre fichier de connection $pdo = Database::connect(); //on se connecte à la base $sql = 'SELECT * FROM user ORDER BY id DESC'; //on formule notre requete foreach ($pdo->query($sql) as $row) { //on cree les lignes du tableau avec chaque valeur retournée
echo '
<br />
<tr>';
echo'
<td>' . $row['name'] . '</td>
<p>
';
echo'
<td>' . $row['firstname'] . '</td>
<p>
';
echo'
<td>' . $row['age'] . '</td>
<p>
';
echo'
<td>' . $row['tel'] . '</td>
<p>
';
echo'
<td>' . $row['email'] . '</td>
<p>
';
echo'
<td>' . $row['pays'] . '</td>
<p>
';
echo'
<td>' . $row['comment'] . '</td>
<p>
';
echo'
<td>' . $row['metier'] . '</td>
<p>
';
echo'
<td>' . $row['url'] . '</td>
<p>
';
echo '
<td>';
echo '<a class="btn" href="edit.php?id=' . $row['id'] . '">Read</a>';// un autre td pour le bouton d'edition
echo '</td>
<p>
';
echo '
<td>';
echo '<a class="btn btn-success" href="update.php?id=' . $row['id'] . '">Update</a>';// un autre td pour le bouton d'update
echo '</td>
<p>
';
echo'
<td>';
echo '<a class="btn btn-danger" href="delete.php?id=' . $row['id'] . ' ">Delete</a>';// un autre td pour le bouton de suppression
echo '</td>
<p>
';
echo '</tr>
<p>
';
}
Database::disconnect(); //on se deconnecte de la base
;
?>
</tbody>
<p>
</table>
<p>
</div>
<p>
</div>
<p>
</div>
<p>
</body>
</html>
Comme on le voit ici, je crée d’abord ma partie html, mon tableau contenant tous les champ.
Je définis les différents titres de mon tableau (th) ,
puis de manière dynamique, je ramène dans chaque case(td) les valeurs trouvées dans la base : l’objet PDO est deja instancié dans le fichier database.php , ici j’appelle ce fichier grace au include ‘database.php‘;
Je me connecte à la base,
je formule ma requete SQL,
et pour chaque ligne retournée, je renseigne la valeur trouvée
enfin je crée mes trois liens sous forme de boutton, vers les pages update, delete et edit.
Pour l’instant on a pas rempli notre base, donc ce fichier ne retourne rien.Il va falloir ajouter manuellement les éléments, via notre page add.php
Add.php
Première chose à faire dans chaque fichier desormais, c’est l’appel à la base :
require 'database.php';
Ensuite, dans ce fichier on va demander à l’utilisateur d’insérer des données, il va donc falloir traiter et sécuriser les données.
On commence par traiter la méthode de notre formulaire puis s’il a été soumis.Alors, dans ce cas on teste un a un les inputs :
On assigne une variable d’erreur
$nameError = null;
On récupère notre valeur
$name = htmlentities(trim($_POST['name']));
On crée notre message d’erreur
$valid = true;
if (empty($name)) {
$nameError = 'Please enter Name';
$valid = false;
}
On se connecte à la base, on formule notre requete, puis on passe au formulaire:
Voici le fichier en entier avec tous les champs input.Dans la vérification des champs on inclut la vérif par expressions régulières pour le nom, le mail, le tel, l’url.
La page edit.php est sans doute la plus simple, ici pas d’opération complexe, mais juste la lecture d’un élément du tableau.
On inclut notre fichier de connection
On initialise une variable $id,
si on a bien un id envoyé dans l’url ($_GET), on le récupère.( le lien crée en index.php « href=« delete.php?id=‘ . $row[‘id’] . ‘ » attend cet id en paramètre)
s’il n’y pas d’id, on redirige vers l’index.
Autrement, on se connecte à la base et avec une requete Select toute simple sur l’id, on affiche simplement chaque élément retourné.
Quand on est sur une ligne du tableau et qu’on veut supprimer ou mettre à jour, on renvoie vers un lien contenant l’id de la ligne à supprimer.Ce sont nos liens dans la page index.php
Ces quelque lignes en début de fichier sont donc la pour tester qu’on a bien un Id passé en paramètre dans notre url, via notre lien:
$id = null;
if ( !empty($_GET['id'])) {
$id = $_REQUEST['id'];
}
if ( null==$id ) {
header("Location: index.php");
}
dans ce fichier on va modifier et insérer des données dans la base, on enchaine donc avec toutes les vérif nécessaires.
Puis on se connecte à la base, on a ici deux requetes, une pour l’affichage des données, puis une pour l’UPDATE des données.Sans la première on se retrouverait avec un tableau vide.Les deux requetes sont donc necessaires.
Supprimer
Dans notre tableau d’index, on a enfin un dernier bouton, « delete ».Ce lien renvoie vers notre fichier delete.php qui est beaucoup plus simple, une petite interface qui demande à l’utilisateur la confirmation de suppression.A l’intérieur de ce fichier, une requete de suppression et le petit formulaire de confirmation
<?php require 'database.php'; $id=0; if(!empty($_GET['id'])){ $id=$_REQUEST['id']; } if(!empty($_POST)){ $id= $_POST['id']; $pdo=Database::connect(); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "DELETE FROM user WHERE id = ?";
$q = $pdo->prepare($sql);
$q->execute(array($id));
Database::disconnect();
header("Location: index.php");
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22js%2Fbootstrap.min.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" />
</head>
<body>
<br />
<div class="container">
<br />
<div class="span10 offset1">
<br />
<div class="row">
<br />
<h3>Delete a user</h3>
<p>
</div>
<p>
<br />
<form class="form-horizontal" action="delete.php" method="post">
<input type="hidden" name="id" value="<?php echo $id;?>"/>
Are you sure to delete ?
<br />
<div class="form-actions">
<button type="submit" class="btn btn-danger">Yes</button>
<a class="btn" href="index.php">No</a>
</div>
<p>
</form>
<p>
</div>
<p>
</div>
<p>
<!-- /container -->
</body>
</html>
Et voila, on a ici notre petite appli qui fonctionne, on peut rajouter des users dans la base via notre fichier add.php, et ensuite les mettre à jour les supprimer ou les lire tout simplement.
Dans le prochain tuto, on verra comment rajouter la un espace de connexion.
Bonjour, serait-il possible d’avoir les fichiers .css et .js si possible?
Merci d’avance
yuyazz
Bonjour, en fait les fichiers css et js sont ceux de bootstrap tout simplement à télécharger sur leur site directement
Abdel
Bonjour,
après avoir exécuté le code, j’ai l’erreur suivante : (could not find driver), est-ce que vous avez une idée de comment la corriger ?
yuyazz
Bonjour et désolé pour ce retard, dans ce cas il faut installer le module pdo_mysql sur le serveur, il manque peut etre ta version de php dans la variable d’environnement dans le path, si tu tapes « could not find driver Crud » dans google tu aura plein de pistes pour régler ce problème!
MeikoNi
Hello !
Dans un premier temps merci beaucoup pour ton tuto !
Et dans un second temps je ne sais pas si tu as remarqué mais pour les numéros de téléphone le 0 du début (ex: 06 16 ** ** **) disparait.
Je pense que ceci est expliqué par le fait que dans ta base de données le type de “tel” est un int. Et sauf erreur de ma part un varchar est plus adapté pour un numéro.
( ! ) Notice: Undefined variable: row in C:\wamp64\www\CRUD\index.php on line 105
J’ai cette erreur en allant sur la page d’index
Laurent
Bonjour,
Merci pour votre tuto, je le trouve très instructif
Comme je suis totalement débutant en php et mysql, je rencontre une erreur lorsque je fichier index.php est chargé.
Celui ci renvoi une erreur que je ne sais pas résoudre, pourriez vous m’aider svp ?
voici le lien vers ma page :
s529471052.onlinehome.fr/bs3/gpio/index_bs.php
Merci beaucoup,
john
Bonjour,
J’ai l’erreur suivante quand je démarrer index.php
Parse error: syntax error, unexpected ‘}’ in C:\wamp\www\crud\index.php on line 172
Bonjour, désolé pour le temps de réponse. Ce la signifie qu’il y a soit dans le code fourni, soit dans le copier coller un ‘}’ en trop ou une autre erreur avant cette ligne..Il faudrait que je reteste le code.. merci pour le signalement !
Eddy Omarion
Bonjour, je travaille actuellement sur un projet typique et j’avoue je ne suis pas doué en PHP. Quelqu’un de plus avisé pourrait bien m’aider en DM? Je laisse mon mail au cas ou. eddyomariond@gmail.com
Bonjour, serait-il possible d’avoir les fichiers .css et .js si possible?
Merci d’avance
Bonjour, en fait les fichiers css et js sont ceux de bootstrap tout simplement à télécharger sur leur site directement
Bonjour,
après avoir exécuté le code, j’ai l’erreur suivante : (could not find driver), est-ce que vous avez une idée de comment la corriger ?
Bonjour et désolé pour ce retard, dans ce cas il faut installer le module pdo_mysql sur le serveur, il manque peut etre ta version de php dans la variable d’environnement dans le path, si tu tapes « could not find driver Crud » dans google tu aura plein de pistes pour régler ce problème!
Hello !
Dans un premier temps merci beaucoup pour ton tuto !
Et dans un second temps je ne sais pas si tu as remarqué mais pour les numéros de téléphone le 0 du début (ex: 06 16 ** ** **) disparait.
Je pense que ceci est expliqué par le fait que dans ta base de données le type de “tel” est un int. Et sauf erreur de ma part un varchar est plus adapté pour un numéro.
Voila !
Et encore merci.
Yes! bien vu merci à toi
Je cherche encore le crud ….
????
( ! ) Notice: Undefined variable: row in C:\wamp64\www\CRUD\index.php on line 105
J’ai cette erreur en allant sur la page d’index
Bonjour,
Merci pour votre tuto, je le trouve très instructif
Comme je suis totalement débutant en php et mysql, je rencontre une erreur lorsque je fichier index.php est chargé.
Celui ci renvoi une erreur que je ne sais pas résoudre, pourriez vous m’aider svp ?
voici le lien vers ma page :
s529471052.onlinehome.fr/bs3/gpio/index_bs.php
Merci beaucoup,
Bonjour,
J’ai l’erreur suivante quand je démarrer index.php
Parse error: syntax error, unexpected ‘}’ in C:\wamp\www\crud\index.php on line 172
Bonjour, désolé pour le temps de réponse. Ce la signifie qu’il y a soit dans le code fourni, soit dans le copier coller un ‘}’ en trop ou une autre erreur avant cette ligne..Il faudrait que je reteste le code.. merci pour le signalement !
Bonjour, je travaille actuellement sur un projet typique et j’avoue je ne suis pas doué en PHP. Quelqu’un de plus avisé pourrait bien m’aider en DM? Je laisse mon mail au cas ou. eddyomariond@gmail.com