Mis à jour le mardi 16 mai 2017
  • 30 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Ce cours existe en livre papier.

Ce cours existe en eBook.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Écrire des données

Connectez-vous ou inscrivez-vous pour bénéficier de toutes les fonctionnalités de ce cours !

Nous avons vu dans le chapitre précédent que l'on pouvait facilement récupérer des informations de notre base de données. Nous avons également pu constater que le langage SQL est très puissant car il propose de nombreux critères de sélection et de tri (WHERE,ORDER BY, etc.).

Il est maintenant temps de découvrir comment on peut ajouter et modifier des données dans la base. Pour cela, nous allons aborder de nouvelles requêtes SQL fondamentales et qu'il vous faut connaître :INSERT,UPDATEetDELETE.

INSERT : ajouter des données

Votre mission, si vous l'acceptez : ajouter une nouvelle entrée à la table « jeux_video » sur laquelle nous avons travaillé dans le chapitre précédent.

Mouahahahah, mais c'est facile. Tu utilises phpMyAdmin et hop ! c'est fait !
… Quoi, j'ai dit quelque chose de mal ?

Non, non.
C'est vrai que phpMyAdmin permet de rajouter de nouvelles entrées dans la table. Mais ce qui nous intéresse ici, c'est de le faire au moyen d'un script PHP et d'une requête SQL.

Tout d'abord, je vous rappelle à quoi ressemble la table « jeux_video » :

ID

nom

possesseur

console

prix

nbre_joueurs_max

commentaires

1

Super Mario Bros

Florent

NES

4

1

Un jeu d'anthologie !

2

Sonic

Patrick

Megadrive

2

1

Pour moi, le meilleur jeu au monde !

3

Zelda : ocarina of time

Florent

Nintendo 64

15

1

Un jeu grand, beau et complet comme on en voit rarement de nos jours

4

Mario Kart 64

Florent

Nintendo 64

25

4

Un excellent jeu de kart !

5

Super Smash Bros Melee

Michel

GameCube

55

4

Un jeu de baston délirant !

...

...

...

...

...

...

...

La requêteINSERT INTOpermet d'ajouter une entrée

Pour rajouter une entrée, vous aurez besoin de connaître la requête SQL. En voici une par exemple qui ajoute un jeu :

INSERT INTO jeux_video(ID, nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES('', 'Battlefield 1942', 'Patrick', 'PC', 45, 50, '2nde guerre mondiale')

Étudions un peu cette requête.

  • D'abord, vous devez commencer par les mots-clésINSERT INTOqui indiquent que vous voulez insérer une entrée.

  • Vous précisez ensuite le nom de la table (icijeux_video), puis listez entre parenthèses les noms des champs dans lesquels vous souhaitez placer des informations.

  • Enfin – et c'est là qu'il ne faut pas se tromper – vous inscrivezVALUESsuivi des valeurs à insérer dans le même ordre que les champs que vous avez indiqués.

Vous remarquerez que pour le premier champ (ID), j'ai laissé des apostrophes vides. C'est voulu : le champ a la propriétéauto_increment, MySQL mettra donc le numéro d'ID lui-même. On pourrait même se passer du champ ID dans la requête :

INSERT INTO jeux_video(nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES('Battlefield 1942', 'Patrick', 'PC', 45, 50, '2nde guerre mondiale')

C'est encore plus simple ! Le champ ID sera de toute façon automatiquement rempli par MySQL, il est donc inutile de le lister.

Application en PHP

Utilisons cette requête SQL au sein d'un script PHP. Cette fois, au lieu de faire appel àquery()(que l'on utilisait dans le chapitre précédent pour récupérer des données), on va utiliserexec()qui est prévue pour exécuter des modifications sur la base de données :

<?php
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// On ajoute une entrée dans la table jeux_video
$bdd->exec('INSERT INTO jeux_video(nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES(\'Battlefield 1942\', \'Patrick\', \'PC\', 45, 50, \'2nde guerre mondiale\')');

echo 'Le jeu a bien été ajouté !';
?>

Que fait ce code ? Il ajoute une entrée dans la BDD pour le jeu « Battlefield 1942 », appartenant à « Patrick », qui fonctionne sur « PC », qui coûte 45 euros, etc.

La présence de multiples apostrophes rend la requête un peu difficile à lire et à écrire à cause des antislashs\que l'on doit rajouter devant. De plus, cette requête insère toujours les mêmes données. Comme on l'a vu dans le chapitre précédent, si on veut rendre une partie de la requête variable, le plus rapide et le plus sûr est de faire appel aux requêtes préparées.

Insertion de données variables grâce à une requête préparée

Si on choisit d'utiliser une requête préparée (ce que je vous recommande si vous souhaitez insérer des variables), le fonctionnement est en fait exactement le même que dans le chapitre précédent :

<?php
$req = $bdd->prepare('INSERT INTO jeux_video(nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES(:nom, :possesseur, :console, :prix, :nbre_joueurs_max, :commentaires)');
$req->execute(array(
	'nom' => $nom,
	'possesseur' => $possesseur,
	'console' => $console,
	'prix' => $prix,
	'nbre_joueurs_max' => $nbre_joueurs_max,
	'commentaires' => $commentaires
	));

echo 'Le jeu a bien été ajouté !';
?>

Pour plus de clarté, j'ai utilisé ici des marqueurs nominatifs. Comme vous le voyez, j'ai créé l'array sur plusieurs lignes : c'est autorisé, et c'est surtout bien plus lisible.

Les variables telles que$nomet$possesseurdoivent avoir été définies précédemment. Généralement, on récupèrera des variables de$_POST(issues d'un formulaire) pour insérer une entrée dans la base de données. Nous découvrirons un cas pratique dans le TP suivant.

UPDATE : modifier des données

Vous venez de rajouter « Battlefield » dans la BDD et tout s'est bien passé.
Mais… vous vous rendez compte avec stupeur que « Battlefield » se joue en fait à 32 joueurs maximum (au lieu de 50) et qu'en plus son prix a baissé : on le trouve à 10 euros (au lieu de 45).

La requêteUPDATEpermet de modifier une entrée

No problemo amigo !
Avec une petite requête SQL, on peut arranger ça. En effet, en utilisantUPDATEvous allez pouvoir modifier l'entrée qui pose problème :

UPDATE jeux_video SET prix = 10, nbre_joueurs_max = 32 WHERE ID = 51

Comment ça marche ?

  • Tout d'abord, le mot-cléUPDATEpermet de dire qu'on va modifier une entrée.

  • Ensuite, le nom de la table (jeux_video).

  • Le mot-cléSET, qui sépare le nom de la table de la liste des champs à modifier.

  • Viennent ensuite les champs qu'il faut modifier, séparés par des virgules. Ici, on modifie le champ « prix », on lui affecte la valeur « 10 » (prix = 10), puis on fait de même pour le champnbre_joueurs_max. Les autres champs ne seront pas modifiés.

  • Enfin, le mot-cléWHEREest tout simplement indispensable. Il nous permet de dire à MySQL quelle entrée il doit modifier (sinon, toutes les entrées seraient affectées !). On se base très souvent sur le champ ID pour indiquer quelle entrée doit être modifiée. Ici, on suppose que « Battlefield » a été enregistré sous l'ID no 51.

Si vous voulez, vous pouvez vous baser sur le nom du jeu au lieu de l'ID pour effectuer votre sélection :

UPDATE jeux_video SET prix = '10', nbre_joueurs_max = '32' WHERE nom = 'Battlefield 1942'

Dernière minute ! Florent vient de racheter tous les jeux de Michel. Il va falloir modifier ça tout de suite.

Euh, il va falloir modifier chaque entrée une à une ?

Non ! Il n'est pas question de passer des heures à modifier chaque entrée une à une pour ça ! En réfléchissant environ 0,5 seconde, vous allez trouver tout seuls la requête SQL qui permet de faire ce qu'on souhaite.

C'est bon, vous avez trouvé ? Allez, je vous donne la réponse dans le mille :

UPDATE jeux_video SET possesseur = 'Florent' WHERE possesseur = 'Michel'

Traduction : « Dans la tablejeux_video, modifier toutes les entrées dont le champpossesseurest égal à Michel, et le remplacer par Florent. »

Qu'il y ait 1, 10, 100 ou 1 000 entrées, cette requête à elle seule suffit pour mettre à jour toute la table ! Si c'est pas beau, le SQL… ;-)

Application en PHP

De la même manière, en PHP on fait appel àexec()pour effectuer des modifications :

<?php
$bdd->exec('UPDATE jeux_video SET prix = 10, nbre_joueurs_max = 32 WHERE nom = \'Battlefield 1942\'');
?>

Notez que cet appel renvoie le nombre de lignes modifiées. Essayez de récupérer cette valeur dans une variable et de l'afficher, par exemple comme ceci :

<?php
$nb_modifs = $bdd->exec('UPDATE jeux_video SET possesseur = \'Florent\' WHERE possesseur = \'Michel\'');
echo $nb_modifs . ' entrées ont été modifiées !';
?>

Cela affichera quelque chose comme :13 entrées ont été modifiées !

Avec une requête préparée

Si vous insérez des données variables, par exemple envoyées par l'utilisateur, je vous recommande là encore de faire appel à une requête préparée :

<?php
$req = $bdd->prepare('UPDATE jeux_video SET prix = :nvprix, nbre_joueurs_max = :nv_nb_joueurs WHERE nom = :nom_jeu');
$req->execute(array(
	'nvprix' => $nvprix,
	'nv_nb_joueurs' => $nv_nb_joueurs,
	'nom_jeu' => $nom_jeu
	));
?>

DELETE : supprimer des données

Enfin, voilà une dernière requête qui pourra se révéler utile :DELETE. Rapide et simple à utiliser, elle est quand même un poil dangereuse : après suppression, il n'y a aucun moyen de récupérer les données, alors faites bien attention !

Voici comment on supprime par exemple l'entrée de « Battlefield » :

DELETE FROM jeux_video WHERE nom='Battlefield 1942'

Il n'y a rien de plus facile :

  • DELETE FROM : pour dire « supprimer dans » ;

  • jeux_video : le nom de la table ;

  • WHERE : indispensable pour indiquer quelle(s) entrée(s) doi(ven)t être supprimée(s).

Je vous laisse essayer cette requête en PHP. Vous pouvez là encore passer parexec()si vous voulez exécuter une requête bien précise, ou bien utiliser une requête préparée si votre requête dépend de variables.

Traiter les erreurs SQL

Comme vous le savez, le langage SQL est un langage à part entière dont on se sert en PHP. S'il peut y avoir des erreurs en PHP, il peut aussi y avoir des erreurs en SQL !
Il se peut par exemple que votre requête soit mal écrite, que la table que vous voulez ouvrir n'existe pas, etc. Bref, les erreurs possibles sont là encore nombreuses.

Toutefois, ce n'est pas MySQL qui vous dira qu'il y a une erreur, mais PHP, et ce dernier n'est pas très bavard en ce qui concerne les erreurs SQL. Nous allons donc voir :

  1. comment repérer une erreur SQL en PHP ;

  2. comment faire parler PHP pour qu'il nous donne l'erreur SQL (de gré, ou de force !).

Repérer l'erreur SQL en PHP

Lorsqu'il s'est produit une erreur SQL, la page affiche le plus souvent l'erreur suivante :

Fatal error: Call to a member function fetch() on a non-object

Cette erreur survient lorsque vous voulez afficher les résultats de votre requête, généralement dans la boucle  while ($donnees = $reponse->fetch()).

Quand vous avez cette erreur, il ne faut pas chercher plus loin, c'est la requête SQL qui précède qui n'a pas fonctionné. Il vous manque cependant des détails sur ce qui a posé problème dans la requête. Nous allons maintenant voir comment on peut remédier à cela. ;)

Allez ! Crache le morceau !

Comme visiblement PHP n'a pas envie de nous donner l'erreur renvoyée par MySQL, on va le lui demander d'une autre manière. Je vous avais d'ailleurs présenté cette méthode dans un des premiers chapitres sur MySQL.

Repérez la requête qui selon vous plante (certainement celle juste avant la boucle  while), et demandez d'afficher l'erreur s'il y en a une, comme ceci :

<?php
$reponse = $bdd->query('SELECT nom FROM jeux_video') or die(print_r($bdd->errorInfo()));

Si la requête fonctionne, aucune erreur ne sera affichée. Si en revanche la requête plante, PHP arrêtera de générer la page et vous affichera l'erreur donnée par MySQL…

À partir de là, il va falloir vous débrouiller tout seul, car les erreurs SQL sont assez nombreuses et je ne peux pas toutes les lister.

En général, MySQL vous dit « You have an error in your SQL syntax near 'XXX' ». À vous de bien relire votre requête SQL ; l'erreur se trouve généralement près de l'endroit où on vous l'indique.

En résumé

  • On utilise différents mots-clés en fonction du type de modification que l'on souhaite effectuer :

    • INSERT INTO : ajout d'une entrée ;

    • UPDATE : modification d'une ou plusieurs entrées ;

    • DELETE : suppression d'une ou plusieurs entrées.

  • Comme pour la sélection de données, on utilise les requêtes préparées pour personnaliser nos requêtes en fonction de variables.

  • Lorsqu'on utiliseUPDATEouDELETE, il faut penser à filtrer avec unWHEREsinon toute la table sera affectée par l'opération !

  • PHP indique si une erreur avec MySQL est intervenue.

Exemple de certificat de réussite
Exemple de certificat de réussite