Accueil › Cours › PHP et MySQL
PHP et MySQL avec mysqli : lire, ajouter, modifier, supprimer
Relie une page PHP à une base MySQL avec MySQLi : lis des lignes et affiche-les, ajoute, modifie et supprime des lignes depuis un formulaire.
Les leçons de ce chapitre
- Se connecter et lire une table
- Ajouter, modifier, supprimer
- Un petit site complet
Leçon 32.1 : Se connecter et lire une table
Une page PHP parle à MySQL en trois temps : elle se connecte à la base, envoie une requête SQL, puis lit le résultat ligne par ligne.
<?php
$cnx = mysqli_connect("localhost", "root", "", "ecole");
$res = mysqli_query($cnx, "SELECT nom, prenom FROM eleve");
echo mysqli_num_rows($res) . " élèves";
while ($ligne = mysqli_fetch_array($res)) {
echo "<p>" . $ligne["prenom"] . " " . $ligne["nom"] . "</p>";
}
mysqli_close($cnx);
?>
mysqli_connect(serveur, utilisateur, mot de passe, base)rend la connexion, qu'on donne ensuite à chaque fonction.mysqli_query($cnx, $sql): pour unSELECT, elle rend un résultat ; pourINSERT,UPDATEouDELETE, elle rendtrue.mysqli_num_rows($res): le nombre de lignes du résultat.mysqli_fetch_array($res)rend la ligne suivante, puisnullquand il n'y en a plus : d'où la bouclewhile. On lit une colonne par son nom$ligne["nom"]ou son numéro$ligne[0].mysqli_fetch_rowne donne que les numéros.
Attention : Le résultat d'une requête n'est pas un tableau : echo $res["nom"] donne « Cannot use object of type mysqli_result as array ». Il faut d'abord lire une ligne avec mysqli_fetch_array.
En PHP
Lance le site : base.sql crée la base, puis index.php affiche les élèves dans un tableau. Change la requête pour ne garder que les élèves qui ont au moins 10.
<!DOCTYPE html>
<html lang="fr">
<head><meta charset="utf-8"><title>Élèves</title></head>
<body>
<h1>Les élèves</h1>
<?php
$cnx = mysqli_connect("localhost", "root", "", "ecole");
$res = mysqli_query($cnx, "SELECT nom, prenom, moyenne FROM eleve ORDER BY moyenne DESC");
echo "<p>" . mysqli_num_rows($res) . " élèves</p>";
echo "<table border='1'>";
while ($ligne = mysqli_fetch_array($res)) {
echo "<tr><td>" . $ligne["nom"] . "</td><td>" . $ligne["prenom"] . "</td><td>" . $ligne["moyenne"] . "</td></tr>";
}
echo "</table>";
mysqli_close($cnx);
?>
</body>
</html>
Leçon 32.2 : Ajouter, modifier, supprimer
<?php
$cnx = mysqli_connect("localhost", "root", "", "ecole");
$nom = $_POST["nom"];
$prenom = $_POST["prenom"];
mysqli_query($cnx, "INSERT INTO eleve (nom, prenom) VALUES ('$nom', '$prenom')");
echo mysqli_affected_rows($cnx) . " élève ajouté";
mysqli_close($cnx);
?>
- On construit la requête avec les valeurs du formulaire : les textes entre apostrophes dans le SQL.
mysqli_affected_rows($cnx): le nombre de lignes ajoutées, modifiées ou supprimées par la dernière requête (0 si rien n'a changé).- Pour modifier ou supprimer une ligne choisie, on passe son identifiant par un lien :
supprimer.php?id=3, puisDELETE FROM eleve WHERE id = 3.
Quand MySQL refuse
Si la requête est fausse (table inconnue, valeur interdite), PHP 8 s'arrête avec « Uncaught mysqli_sql_exception » et le message de MySQL. Avec mysqli_report(MYSQLI_REPORT_OFF); au début, mysqli_query rend false à la place, et mysqli_error($cnx) donne le message.
Astuce : Un nom avec une apostrophe (L'Aube) casse la requête : mysqli_real_escape_string($cnx, $titre) le protège. C'est aussi ce qui empêche un utilisateur malin de glisser son propre SQL (injection SQL).
En PHP
Lance le site, ajoute un élève avec le formulaire, puis supprime-le avec son lien « supprimer » : la liste se met à jour, car la base reste la même entre les pages.
<!DOCTYPE html>
<html lang="fr">
<head><meta charset="utf-8"><title>Élèves</title></head>
<body>
<form action="ajout.php" method="post">
Nom : <input type="text" name="nom"> Prénom : <input type="text" name="prenom">
<input type="submit" value="Ajouter">
</form>
<?php
$cnx = mysqli_connect("localhost", "root", "", "ecole");
$res = mysqli_query($cnx, "SELECT id, nom, prenom FROM eleve");
while ($l = mysqli_fetch_array($res)) {
echo "<p>" . $l["prenom"] . " " . $l["nom"] . " <a href='supprimer.php?id=" . $l["id"] . "'>supprimer</a></p>";
}
?>
</body>
</html>
Leçon 32.3 : Un petit site complet
Un site de bac pratique réunit tout : une page HTML avec un formulaire (vérifié en JavaScript), une page PHP qui l'enregistre dans la base, et une page qui liste ou cherche les données.
Chercher avec LIKE
<?php
$cnx = mysqli_connect("localhost", "root", "", "ecole");
$mot = $_POST["mot"];
$res = mysqli_query($cnx, "SELECT nom FROM eleve WHERE nom LIKE '%$mot%'");
if (mysqli_num_rows($res) == 0) {
echo "Aucun élève trouvé";
}
while ($l = mysqli_fetch_row($res)) {
echo $l[0] . "<br>";
}
?>
'%$mot%': la variable PHP est placée dans le motif SQL, entre les%.- Une requête avec
COUNT(*)ouAVG(...)rend une seule ligne : un seulmysqli_fetch_arraysuffit.
Attention : Ferme la connexion avec mysqli_close($cnx) seulement à la fin : une requête après la fermeture provoque une erreur.
En PHP
Lance le site et cherche Ben, puis a, puis un nom qui n'existe pas.
<?php
$cnx = mysqli_connect("localhost", "root", "", "ecole");
$mot = $_POST["mot"];
$res = mysqli_query($cnx, "SELECT nom FROM eleve WHERE nom LIKE '%$mot%'");
if (mysqli_num_rows($res) == 0) {
echo "Aucun élève trouvé";
}
while ($l = mysqli_fetch_row($res)) {
echo $l[0] . "<br>";
}
echo '<p><a href="index.html">Nouvelle recherche</a></p>';
mysqli_close($cnx);
?>
S'entraîner gratuitement
Chaque leçon a 3 exercices gratuits avec indices pour appliquer ce chapitre avec Hannibot.
← Chapitre précédent : PHP : les formulaires
Tous les chapitres · Voir les devoirs corrigés de 2ème TI
Cours écrit pour Mission Carthage d'après le programme officiel. Ton professeur reste la référence.