Table des matières
Écrire des données
Retour d'un niveau
Retour à l'accueil
Il est temps de découvrir comment ajouter et modifier des données.
On va utiliser de nouvelle requêtes : INSERT INTO, UPDATE et DELETE
INSERT : ajouter des données
La requête INSERT INTO permet 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')
Les nombres (tels que 45 et 50 ici) n'ont pas besoin d'être entourés d'apostrophes. Seules les chaînes de caractères les nécessitent.
Étudions un peu cette requête.
- vous devez commencer par les mots-clés INSERT INTO qui indiquent que vous voulez insérer une entrée.
- vous précisez ensuite le nom de la table (ici jeux_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 inscrivez VALUES suivi 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.
Enfin, si vous le désirez, sachez que vous n'êtes pas obligés de lister les noms des champs en premier ;
cette requête marche tout aussi bien (mais elle est moins claire) :
INSERT INTO jeux_video VALUES('', 'Battlefield 1942', 'Patrick', 'PC', 45, 50, '2nde guerre mondiale')
Il faut lister les valeurs pour tous les champs sans exception (ID compris) dans le bon ordre.
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 utiliser exec() 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é !'; ?>
Désormais je ne mets plus l'étape de la connexion à MySQL avec PDO dans mes codes pour les simplifier. Bien entendu, il faut toujours se connecter au préalable si on veut que la requête fonctionne.
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 $nom et $possesseur doivent 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ête UPDATE permet de modifier une entrée
No problemo amigo !
Avec une petite requête SQL, on peut arranger ça.
En effet, en utilisant UPDATE vous 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 ?
- Liste numérotéeTout d'abord, le mot-clé UPDATE permet 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 champ nbre_joueurs_max. Les autres champs ne seront pas modifiés.
- Enfin, le mot-clé WHERE est 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 table jeux_video, modifier toutes les entrées dont le champ possesseur est é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).
Si vous oubliez le WHERE, toutes les entrées seront supprimées. Cela équivaut à vider la table.
Je vous laisse essayer cette requête en PHP. Vous pouvez là encore passer par exec() 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.
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 utilise UPDATE ou DELETE, il faut penser à filtrer avec un WHERE sinon toute la table sera affectée par l'opération !
