NoShade.net est en vente — Contactez nous si vous êtes intéressé
Le siteTutoriauxInterviews
icone RSS NoShade.net

Accueil » Tutoriaux » PHP » Chapitre 4.3 : Enregistrer dans une BDD

Les tutoriaux Php

4.3 Enregistrer dans une BDD


Un formulaire



Pour enregistrer de nouveaux livres dans notre base de données, comment faire?
Le plus simple, ne serait-il pas d'avoir un petit formulaire "Ajouter un livre", avec un champ de texte pour écrire le nom de l'éditeur, un pour le titre, etc ... ?
Hé bien c'est comme cela que nous allons procéder, tout simplement! :)

Commençons donc par créer, en html, un simple formulaire, nous permettant de renseigner les informations de toutes les informations de notre livre, un peu comme cela regardez :


Éditeur
Collection
Prêt
Titre
Genre
Prix
Notes


Voici le code html de ce simple formulaire :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>Mes bouquins - Ajouter un livre</title>
    </head>
    <body>
<h1>Ajouter un livre</h1>
<form id="ajout_livre" action="gestion_ajoutlivre_enregistrement.php" method="post" name="ajout_livre">
<table border="0" cellspacing="0" cellpadding="4">
    <tr>
        <td align="right" width="174">&Eacute;diteur</td>
        <td><input type="text" name="editeur" size="40"/></td>
    </tr>
    <tr>
        <td align="right" width="174">Collection</td>
        <td><input type="text" name="collection" size="40"/></td>
    </tr>
    <tr>
        <td align="right" width="174">Pr&ecirc;t</td>
        <td><input type="text" name="pret" size="40"/></td>
    </tr>
    <tr>
        <td align="right" width="174">Titre</td>
        <td><input type="text" name="titre" size="40"/></td>
    </tr>
    <tr>
        <td align="right" width="174">Genre</td>
        <td><select name="genre" size="1">
                <option value="BD">BD</option>
                <option value="Formation">Formation</option>
                <option value="Mangas">Mangas</option>
                <option value="Roman">Roman</option>
            </select></td>
    </tr>
    <tr>
        <td align="right" width="174">Prix</td>
        <td><input type="text" name="prix" value="00,00" size="11"/></td>
    </tr>
    <tr>
        <td align="right" width="174">Notes</td>
        <td><textarea name="notes" rows="4" cols="40"></textarea></td>
    </tr>
    <tr>
        <td align="right" width="174"></td>
        <td><input type="submit" name="ajout_livre" value="Ajouter ce livre"/></td>
    </tr>
</table>
</form>
    </body>
</html>


Enregistrez-le donc sous "gestion_ajoutlivre.php" dans votre dossier de travail. :)

Prenons une minute pour analyser un peu ce formulaire.
Nous avons donc :
- un champ pour entrer le nom de l'éditeur,
- le nom de la collection (si le livre fait partie d'une collection),
- un champ "prêt", où l'on notera à qui nous avons prêté le livre en question si jamais on le prête (celui-ci restera vide si on a bien le livre chez soi)
- un champ "titre", important me semble-t-il, :)
- un menu déroulant pour indiquer le genre de livre qu'il s'agit
- une petite zone de saisie pour le prix du livre, rempli de 00,00 euros par défaut
- une zone de texte pour ajouter des notes, tout simplement.

J'aimerais revenir simplement sur le menu déroulant.
Tout d'abord, "pourquoi" un menu déroulant, plutôt qu'un simple champ de texte? Il y a deux raisons à cela.

La première, il s'agira d'organisation. Si vous mettez un champ de texte, livre à vous d'écrire donc "Mangas", "Manga", "manga", ou encore "mengah" un douloureux soir de fatigue! :)
L'inconvénient? Si l'on commence à faire une liste de nos "Mangas" (SELECT * FROM bouquins WHERE genre="Mangas"), un livre dont le genre serait "Mengah" ne serait alors pas listé dans celle-ci.
Ca parait très bête et pas grand chose, mais je préfère vous faire prendre de bonnes habitudes au possible (du moins, j'y travaille hein...).

La deuxième raison, plus intéressante, serait la possibilité de gérer cette liste via la base de données.
Quoi!?
Hé bien, nous pourrions par exemple lister tous les genres voulus dans une table "bouquins_genres", et ensuite demander à les afficher avec une boucle while.
Nous écririons alors dans cette boucle :

echo '<option value="' $donnees['genre'] . '">' $donnees['genre'] . '</option>';


Vous vous dites sûrement que c'est un peu farfelu, que c'est se compliquer la vie que de procéder ainsi... Je vous comprends. :)
Maintenant, imaginez un autre cas, par exemple des jeux vidéos, des films, de la musique... Quelque chose où, des genres, vous en auriez alors des dizaines, et souvent des nouveaux qui arrivent d'ailleurs.
Vous seriez alors forcés de mettre à jour le fichier de la page sur votre disque dur, de le renvoyer en ftp... Oh non alors, ce n'est pas le but, on est là pour apprendre PHP, c'est pour ensuite s'en servir! :)

En codant un peu tout ça, nous pourrions donc ajouter de manière dynamique des genres à cette liste, en supprimer, ... tout depuis notre interface de gestion, pratique, non? :)


Enregistrement



Nous avons notre formulaire dans la page "gestion_ajoutlivre.php", créons maintenant une page "gestion_ajoutlivre_enregistrement.php" (comme indiqué dans le code du formulaire).
C'est dans cette page que nous allons enregistrer les données dans la base de donnée MySQL.

Comme nous l'avons demandé, notre formulaire envoie donc les données sous forme de variables $_POST.
Nous allons donc récupérer les informations fournies dans cette deuxième page, pour les insérer dans une requête d'enregistrement MySQL.

Sur cette deuxième page, commençons donc par mettre dans des variables simples les données reçues depuis le formulaire.
Nous en profiterons pour appliquer deux nouvelles fonctions à toutes nos variables $_POST :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>  
    <head>  
        <title>Mes bouquins - Enregistrement du livre</title>  
    </head>  
    <body>  
<h1>Enregistrement du livre</h1>  

<?php  
    $editeur    
htmlentities(addslashes($_POST['editeur']));  
    
$collection htmlentities(addslashes($_POST['collection']));  
    
$pret       htmlentities(addslashes($_POST['pret']));  
    
$titre      htmlentities(addslashes($_POST['titre']));  
    
$genre      htmlentities(addslashes($_POST['genre']));  
    
$prix       htmlentities(addslashes($_POST['prix']));  
    
$notes      htmlentities(addslashes($_POST['notes']));  
?>  

    </body>  
</html>


addslashes(), qu'est-ce que ça encore?
Cette fonction à pour simple (très simple, même) but d'ajouter des antislashes ( ) devant les apostrophes et guillemets, si nous en avons entrés dans les champs de texte.
Si nous avions ajouté donc le livre "La momie d'Egypte", grâce à cette fonction, PHP ajoutera donc des anti-slashes devant le guillemet, et nous retournera "La momie d'Egypte".

Pourquoi cela? :-o
C'est très simple!
Lors de notre enregistrement, si un guillemet ou apostrophe vient perturber le code, nous allons avoir une jolie petite erreur de la part de PHP, et MySQL n'enregistrera pas notre livre dans la base de données.
Si vous avez bien retenu le chapitre sur la fonction echo, au tout début du cours, vous comprendrez aisément cela... Je pense qu'à ce niveau du cours PHP, vous avez bien retenu ça! ;)

Et htmlentities(), c'est quoi ça?
Cette fonction la va convertir les caractères spéciaux en caractères HTML. Un guillemet ( " ), sera donc converti en son équivalent HTML, soit &quot;.

Et... quel intérêt à faire ça? :-o
C'est tout bêtement une question de sécurité dans la plus-part des cas!
Le risque, c'est qu'un visiteur, dans un champ de formulaire, écrive une requête MySQL au lieu de l'utiliser normalement, et puisse tirer certaines informations de votre base de données, ou tout simplement effacer celle-ci. Coup dur, hein!?
Heureusement, dans ce cas d'utilisation ou notre petit logiciel de gestion de bouquins restera uniquement hébergé sur notre ordinateur, il ne devrais pas y avoir de problème, à moins que l'idée vous prenne de vous auto-pirater. :D
Nous n'appliquerons donc pas cette fonction sur le reste de ce chapitre, mais y reviendrons plus tard pour que vous l'utilisiez quand même.

Maintenant, si vous voulez vous rassurer quand à la transmission des données d'une page à l'autre, ajouter simplement un echo d'une ou deux de nos variables simples, vous verrez par ailleurs que, si vous écrivez quelque chose avec une apostrophe dans un champ de texte, celui-ci sera maintenant précédé d'un anti-slash! :)

Voyons le code de la page d'enregistrement :

<?php
    
include('connexion.inc.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>Mes bouquins - Enregistrement du livre</title>
    </head>
    <body>
<h1>Enregistrement du livre</h1>

<?php
    
// Mise en variables simples des valeurs du formulaire
    
$editeur    addslashes($_POST['editeur']);
    
$collection addslashes($_POST['collection']);
    
$pret       addslashes($_POST['pret']);
    
$titre      addslashes($_POST['titre']);
    
$genre      addslashes($_POST['genre']);
    
$prix       addslashes($_POST['prix']);
    
$notes      addslashes($_POST['notes']);

    
// On vérifie qu'il y a bien eu un envoi de données.
    // Pour cela, on vérifie que le champ "titre" à bien été rempli
    
if(isset($_POST['titre']))
    {
        
// Enregistrement dans la base de donnees
        
mysql_query("INSERT INTO `bouquins` VALUES ('', '" . $editeur . "', '" . $collection . "', '" . $pret "', '" . $titre "', '" . $genre . "', '" $prix "', '" . $notes . "')");

        echo 
'<center><p>Le livre a bien été ajouté à la liste!</p>
                <p><a href="gestion_ajoutlivre.php">Ajouter un nouveau livre</a></p>
                <p><a href="index.php">Voir ma liste de bouquins</a></p></center>'
;
    }
    else
    {
        echo 
'Aucun livre ajouté';
    }
?>

    </body>
</html>
<?php
    mysql_close
();
?>


Compliquée, au premier abord, cette ligne d'enregistrement hein?
Prenez le temps de la déchiffrer, en fait, ce qui la rend "complexe", c'est simplement la concaténation, puisque nous sonnes obligés d'entourer les variables avec des apostrophes dans la requête mysql pour que celle-ci soit valide, sinon, ça ne marchera pas, c'est aussi simple que cela.
Nous alternons donc des apostrophes, guillemets, points, ...

Vous verrez qu'on s'y fait très vite, et que la requête que vous verrez pour modifier le contenu d'une base de donnée (pour éditer la fiche d'un livre par exemple) est quand-même elle un peu plus complexe.
Ne vous découragez surtout pas, n'hésitez pas à faire du "bête" copier/coller au début, ce n'est pas un drame, vous chercherez de vous même à apprendre par coeur ces requêtes par la suite, vous verrez. :)

Voilà, l'enregistrement de nouveaux livres marche! Fabuleux, non? ;)
Vous pouvez maintenant, sur la page "index.php", rajouter un petit menu tout en haut, pour créer un lien "Ajouter un livre" menant à la page "gestion_ajoutlivre.php". Pratique! :D

Nous allons maintenant voir comment modifier le contenu d'une fiche de livre, pour modifier une erreur, ou plus simplement pour marquer un livre comme prêté / retourné par exemple.
Nous verrons ensuite comment faire pour supprimer un livre dans notre liste, chose très simple, qui nous permettra de nous relâcher un peu après tous ces efforts! :D

Par : Legibe, le 29 septembre 2006

Sommaire du cours PHP

» Sommaire
» 1.1 Avant propos
» 1.2 Que faut'il pour faire du php?
» 2.1 Écrire du texte en PHP
» 2.2 Les commentaires, les variables et les calculs
» 2.3 Les conditions
» 2.4 La concaténation + Évaluation
» 3.1 Transmission de données
» 3.2 Les fonctions + Dates et heures
» 3.3 Les Arrays (tableaux) + les boucles
» 4.1 Les bases de données
» 4.2 Lecture dans une BDD
» 4.3 Enregistrer dans une BDD
» 4.4 Modifier le contenu d'une table
» 4.5 Supprimer du contenu dans une BDD
» 4.6 Statistiques
» 5.1 Les sessions et cookies
» 5.2 Exercice : Un système de login multi-membres