Aller au menu - Aller au contenu

Icône Ecrire des données

Mise à jour : 03/04/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
133 390 visites depuis 7 jours, dont 3 616 sur ce chapitre classé 2/786
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 aussi pu constater que le langage SQL était 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 à connaître : INSERT, UPDATE et DELETE.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

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 ? :euh:


Non non. :p
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 via un script PHP et une requête SQL !

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

IDnompossesseurconsoleprixnbre_joueurs_maxcommentaires
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ê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 rajoute une entrée :

Code : SQL
1
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.


Etudions un peu cette requête :

  • D'abord, vous devez commencer par les mots-clé 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 :

Code : SQL
1
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 d'abord, cette requête marche tout aussi bien (mais elle est moins claire) :

Code : SQL
1
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 :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
    
    // 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é !';
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>


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 antislash (\) 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 :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?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é !';
?>


Je ne mets plus désormais 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 surtout c'est 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, 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 que 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 ! :D
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 :

Code : SQL
1
UPDATE jeux_video SET prix = 10, nbre_joueurs_max = 32 WHERE ID = 51


Comment ça marche ?

  • Tout 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), et 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 n°51.


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

Code : SQL
1
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 !

Heu, il va falloir modifier chaque entrée une à une ? :euh:


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 tous 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 :

Code : SQL
1
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 1000 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 :

Code : PHP
1
2
3
<?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 :

Code : PHP
1
2
3
4
<?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 :

Code : PHP
1
2
3
4
5
6
7
8
<?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 :

Code : SQL
1
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) doivent ê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.

Q.C.M.

Quel(s) mot(s)-clé permettent de dire en SQL qu'on veut ajouter une entrée ?
Que signifie cette requête ?Code : SQL
1
DELETE FROM jeux_video WHERE console = 'Megadrive' AND possesseur = 'Patrick'
Qu'est-ce qui ne va pas dans cette requête ?Code : SQL
1
DELETE * FROM jeux_video
Je m'appelle Florent et je veux changer les commentaires de tous mes jeux qui coûtent moins de 10 euros. Je veux mettre à la place : "En promo, pas cher mon fils"
Comment je peux faire ça en une requête ?
Pourquoi on ne précise pas la valeur du champ ID quand on ajoute une entrée avec INSERT INTO ?
Quel est l'effet de cette requête dans la table jeux_video ?Code : SQL
1
INSERT INTO jeux_video VALUES('Dark age of camelot', 'François', 'PC', 30, 1000, 'MMORPG')

Statistiques de réponses au QCM

Vous êtes maintenant capables de lire, ajouter, modifier et supprimer des informations dans une base de données. Ce sont toutes les opérations de base. On les résume parfois sous le nom CRUD (Create, Read, Update, Delete).

En théorie, une découverte minimale du langage SQL pourrait (déjà) s'arrêter là. Cependant, c'est un langage bien plus riche que ça : nous aurons l'occasion de découvrir d'autres fonctionnalités du SQL dans les prochains chapitres. Mais avant cela, un petit TP va nous permettre de nous exercer avec ce que nous avons appris. :)
Chapitre précédent Sommaire Chapitre suivant

Partager

91 commentaires pour "Ecrire des données"
Note moyenne : 3.61 / 4 (2518 votes)
Pseudo Commentaire
Hors ligne jeanrem # Posté le 01/04/2012 à 12:04:46

Bonjour à tous, je rencontre un problème a l'insertion d'une donnée dans ma table, voici mon code... Merci de me dire si il y a une erreur :)

<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=mysql51-58.perso;dbname=********', '********', '**************', $pdo_options);

$req = $bdd->exec('INSERT INTO article(titre, intro, article, quand) VALUES(:titre, :intro, :article, NOW())');
$req->execute(array(
'titre' => $_POST['titre'],
'intro' => $_POST['intro'],
'article' => $_POST['article'],
));

echo 'L\'article a bien été ajouté !';
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>

Si votre sujet est résolu, pensez à nous le faire savoir grâce au bouton Image utilisateur situé en bas de la page! Merci.
 
Hors ligne Hellium # Posté le 08/04/2012 à 16:01:59
Avatar

Citation : jeanrem
Bonjour à tous, je rencontre un problème a l'insertion d'une donnée dans ma table, voici mon code... Merci de me dire si il y a une erreur :)
Secret (cliquez pour afficher)

<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=mysql51-58.perso;dbname=********', '********', '**************', $pdo_options);

$req = $bdd->exec('INSERT INTO article(titre, intro, article, quand) VALUES(:titre, :intro, :article, NOW())');
$req->execute(array(
'titre' => $_POST['titre'],
'intro' => $_POST['intro'],
'article' => $_POST['article'],
));

echo 'L\'article a bien été ajouté !';
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>

Je ne sais pas si tu as résolu ton problème Jeanrem, mais il s'agit de ta première "déclaration" de la variable $req. Il faut mettre "prepare" et nom "exec" si tu utilises le système de requêtes préparées ! ;)

EDIT : J'en profite aussi pour poser une petite question avec les requêtes préparées, j'essaye d'enregistrer un numéro de téléphone ci celui-ci a été indiqué dans le formulaire, voici le code :

Code : PHP
1
2
3
4
5
6
7
8
if (!empty( $_POST['Domicile'])) {																				
	$exe2 = $bdd -> prepare('INSERT INTO formulaire (Domicile) VALUES (:Domicile) WHERE Nom=:Nom AND Prenom=:Prenom AND Naissance=:Naissance ');
	$exe2 -> execute(array(
		'Domicile' => $_POST['Domicile'],
		'Nom' => $_POST['Nom'],
		'Prenom' => $_POST['Prenom']
		'Naissance' => $Naiss
	));


J'aurais donc une erreur dans ma requête de préparation au niveau du mot clé "WHERE ..." mais je ne vois vraiment pas >< Qu'ai-je oublié ? =/

Image utilisateur
Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne Lynda Ait Ali # Posté le 09/04/2012 à 15:12:15

Avis : Très bon

Bien résumé !
Hors ligne webmaniac # Posté le 11/05/2012 à 01:00:47
Avatar

Avis : Très bon

@hellium j’espère que ton problème est résolu sinon je ne crois pas au'on puisse utiliser une condition WHERE sur un INSERT.

"tu fais un insert d'une ligne qui n'existe pas encore donc le where n'a aucune raison d'être, tu l'utilises sur un update si tu veux mais pas dans un insert qui sert à créer une nouvelle ligne dans ta table..."
Hors ligne yok8k # Posté le 21/05/2012 à 11:30:43

Avis : Très bon

J'ai rien compris à: Insertion de données variables grâce à une requête préparée
c'est mal expliquer voir carrément aucune info qui nous dit ça sert à quoi


pareil ligne:
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

nvprix nv_nb_joueurs , nom_jeu Là tu nous mets direct des champs qui n'existe pas comme si elle existe depuis le début personnellement je suis tout depuis le début mais là les 2 paragraphes je m'y perds complètement

html 5 , 47 effets en action 47 Amazing CSS3 Animation Demos
 

Voir tous les commentaires