Trackin
php014
Nous allons maintenant voir comment faire pour insérer des données dans les tables de votre base de données.Comme pour le tutorial précédent, nous allons le faire en se basant sur l'exemple pris lors du tutorial faisant une introduction sur les bases de données.
Et tout comme dans le tutorial précédent, nous allons tout d'abord voir comment faire ces insertions en SQL, puis nous verrons comment les faire directement à partir de vos pages WEB.
Pour vous remettre les idées au clair, je vous que l'on avait alors deux tables, dont la structure ressemble à :
La table liste_proprietaire :
N. du propriétaire | Propriétaire | N. tél |
1 | LA GLOBULE | 06-48-85-20-54 |
2 | Jeremy | 06-85-98-78-12 |
3 | Benoît | 06-47-01-59-36 |
La table liste_disque :
N. du propriétaire | Auteur | Titre |
1 | Cassius | Au rêve |
1 | Daft Punk | Discovery |
2 | Cassius | Au rêve |
2 | Télépopmusik | Genetic world |
3 | Clamaran | Release yourself |
2 | Bob Sinclar | Paradise |
Supposons alors que l'on décide d'ajouter un nouveau propriétaire de disques : tibo par exemple.
Pour insérer ce nouveau propriétaire, il faut fournir au SGBD les informations lui permettant d'insérer ce nouveau tuple dans la table liste_proprietaire. Ces informations sont :
- le numéro du nouveau propriétaire
- le nom du nouveau propriétaire
- son numéro de téléphone
Bref, vous le voyez par vous-même, il s'agit en fit de fournir tous les attributs de la table afin de produire un nouveau tuple.
En revanche, comme nous allons le voir, il n'est pas nécessaire de fournir au SGBD le numéro du nouveau propriétaire car cet attribut à été déclaré AUTO_INCREMENT lors de la création de la table. Ceci implique que le SGBD sait, lors d'une nouvelle insertion, qu'il faut qu'il prenne dans la table liste_proprietaire le numéro le plus grand et qu'il l'augmente de un, et ce nouveau numéro (augmente de un) correspondra au numéro de notre nouveau propriétaire.
On aura alors :
On remarque tout de suite que la syntaxe pour une insertion est relativement simple.
En effet, étudions ce code :
On insére où ? --> dans la table liste_proprietaire
On insérer quoi ? --> la valeur des différents attributs, c'est-à-dire une première valeur qui correspond à l'attribut numero (qui je vous le rappelle est AUTO_INCREMENT, on n'a donc pas l'utilité de préciser sa valeur, le SGBD sachant quoi mettre), puis on insère la valeur tibo pour l'attribut nom, et enfin la valeur 06-98-42-01-36 pour l'attribut telephone.
Simple, non ?
Passons tout de suite à l'insertion d'un nouveau tuple, et ce, à partir d'une page WEB.
Supposons que l'on désire insérer exactement le même tuple que dans l'exemple précédent (c'est-à-dire que tibo fait tellement partie de nos amis, qu'on a envie de partager nos disques avec lui).
On aura alors :
exemple1
- <?php
- // on se connecte à notre base
- $base = mysql_connect ('serveur', 'login', 'pass');
- mysql_select_db ('ma_base', $base) ;
- ?>
- <html>
- <head>
- <title>Insertion de tibo dans la base</title>
- </head>
- <body>
- <?php
- // lancement de la requete
- $sql = 'INSERT INTO liste_proprietaire VALUES ("", "tibo", "06-98-42-01-36")';
- // on insere le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
- mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
- // on ferme la connexion à la base
- mysql_close();
- ?>
- Tibo vient d'être inseré dans la base.
- </body>
- </html>
Imaginons, alors que l'on désire alors ajouter à la base un disque grâce à la contribution de tibo.
Dans l'absolu, réfléchissons une minute sur ce que nous avons besoin :
- il s'agit d'un nouveau disque (soit son auteur et son titre).
- mais aussi, nous avons besoin du numéro qu'a pris le propriétaire tibo dans la table liste_proprietaire.
Comment qu'on fait donc ce truc ? En effet, on voit bien que si l'on insère directement un nouveau disque, la jointure entre les deux tables risque de ne pas se faire.
En fait, il faudrait tout d'abord sélectionner le numéro qu'a pris tibo dans la table_proprietaire (par le biais d'un requete SQL de type SELECT, je vous renvoies au tutorial précèdent pour revoir la récupération des données d'une base).
Cependant, imaginons que nous n'avons pas encore inséré le propriétaire tibo dans notre base de données, et que l'on désire directement insérer ce nouveau propriétaire ainsi qu'un disque lui appartenant. Nous allons voir comment récupérer simplement le nouveau numero qui vient d'être inséré (donc celui de tibo) et ainsi l'utiliser pour insérer notre disque.
On a :
exemple2
- <?php
- // on se connecte à notre base
- $base = mysql_connect ('serveur', 'login', 'pass');
- mysql_select_db ('ma_base', $base) ;
- ?>
- <html>
- <head>
- <title>Insertion de tibo et d'un nouveau disque dans la base</title>
- </head>
- <body>
- <?php
- // on prépare la requête
- $sql = 'INSERT INTO liste_proprietaire VALUES("", "tibo", "06-98-42-01-36")';
- // on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
- mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
- // on récupère le dernier numéro inséré, soit le numéro de tibo
- $numero_insere = mysql_insert_id();
- // on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
- $sql = 'INSERT INTO liste_disque VALUES ("'.$numero_insere.'", "The supermen lovers", "The player")';
- // on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
- mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
- // on ferme la connexion à la base
- mysql_close();
- ?>
- Tibo vient d'être inseré dans la base, ainsi que son nouveau disque : The player des Supermen lovers.
- </body>
- </html>
Que faire en plus ?
Et bien, tout comme dans le tutorial précédent, vous pouvez rendre vos insertions vraiment dynamiques en effectuant tout simplement vos insertions à partir des valeurs fournies par un formulaire.
Imaginons que l'on désire insérer des nouveaux disques. Supposons que l'on dispose d'une page html contenant un formulaire permettant de saisir le nom du propriétaire, et que ce formulaire vous demande également le titre d'un album ainsi que son interprète (on suppose également que le champ action de notre formulaire correspond au nom de la page PHP qui traite les données, soit la page contenant le code ci-dessous).
On suppose enfin, que le champ du formulaire contenant le nom du propriétaire porte le nom proprio (on pourra alors utiliser la variable $_POST['proprio'] dans notre page PHP, tout en supposant de notre formulaire à une méthode POST et npn GET), que le champ contenant l'interprète porte le nom interprete et que le champ contenant le titre porte le nom titre.
On aura alors :
exemple3
- <?php
- // on se connecte à notre base
- $base = mysql_connect ('serveur', 'login', 'pass');
- mysql_select_db ('ma_base', $base) ;
- ?>
- <html>
- <head>
- <title>Insertion de nouveaux disques dans la base</title>
- </head>
- <body>
- <?php
- // on teste si les variables du formulaire sont bien déclarées
- if (isset($_POST['proprio']) && isset($_POST['interprete']) && isset($_POST['titre'])) {
- // on prépare la requête pour récupérer le numero du propriétaire
- $sql = 'SELECT numero FROM liste_proprietaire WHERE nom = "'.$_POST['proprio'].'"';
- // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
- $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
- // on récupère le résultat sous forme d'un tableau
- $data = mysql_fetch_array($req);
- // on libère l'espace mémoire alloué pour cette interrogation de la base
- mysql_free_result ($req);
- // on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
- $sql = 'INSERT INTO liste_disque VALUES("'.$data['numero'].'", "'.$_POST['interprete'].'", "'.$_POST['titre'].'")';
- // on insère le tuple (mysql_query) et au cas où, on écrira un petit message d'erreur si la requête ne se passe pas bien (or die)
- mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
- // on ferme la connexion à la base
- mysql_close();
- echo 'Nous venons d'insérer un nouveau disque : '.$_POST['titre'].' de '.$_POST['interprete'].' appartenant à '.$_POST['proprio'];
- }
- else {
- echo 'Les variables du formulaire ne sont pas déclarées';
- }
- ?>
- </body>
- </html>