Modification des données en ligne

La beauté de la programmation Web, c'est qu'elle permet de créer un site Web qui affiche des données tirées d'une table, bien entendu, mais elle permet également de créer un site Web pouvant, pour un usager possédant les droits requis, modifier ces mêmes données.

Voici donc les grandes lignes des techniques à utiliser.

▼Publicité

Formulaire de saisie pour ajouter des données

Voici un exemple de formulaire de saisie de données :

Ex : <form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">

<p>

<label class="aligne" for="description">Description :</label>

<input class="boite" type="text" id="description" name="description" />

</p>

<p>

<label class="aligne" for="prix">Prix :</label>

<input class="boite prix" type="text" id="prix" name="prix" /> $

</p>

<p>

<input class="enregistrer" type="submit" value="Enregistrer" name="enregistrer" />

<input class="annuler" type="button" value="Annuler" onclick="document.location.href='...'" />

</p>

</form>

Le formulaire permettant de saisir les données à enregistrer ressemble en tout point à n'importe quel formulaire. C'est le traitement fait sur ce formulaire qui sera différent.

Liste déroulante pour relation maître-détail

Lorsque vous élaborez un formulaire HTML pour saisir des données, il est important de vous mettre dans la peau d'un usager. Le formulaire devra être monté de façon à être le plus convivial possible. Dans le cas où les données saisies doivent correspondre à des valeurs précises, une technique intéressante consiste à utiliser une liste déroulante pour présenter les options disponibles.

Prenons l'exemple d'un restaurant qui vend des sandwiches classés dans différentes catégories. Dans cet exemple, les catégories sont enregistrées dans une table. Chaque catégorie consiste en un identifiant, qui servira de clé étrangère dans la table des sandwiches, et d'une description.

Si on veut ajouter un sandwich dans la BD, le formulaire Web devra présenter une liste déroulante affichant la description des catégories disponibles et non leur identifiant.

Exemple de liste déroulante pour ajouter de l'information

La liste déroulante sera générée dynamiquement en utliisant les descriptions lues dans la table des catégories. À chaque catégorie, on associera son id.

Voici le code complet permettant de générer le formulaire précédent avec, en surbrillance, le code PHP générant dynamiquement la liste déroulante :

Ex : <form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">

<p>

<label class="aligne" for="description">Description :</label>

<input class="boite" type="text" id="description" name="description" />

</p>

<p>

<label class="aligne" for="prix">Prix :</label>

<input class="boite prix" type="text" id="prix" name="prix" /> $

</p>

<p>

<label class="aligne" for="categorie" >Catégorie :</label>

<?php

echo "<select name='categorie' id='categorie'>";

$requete = "SELECT cat_id, cat_description FROM categorie ORDER BY cat_description";
$resultat = mysql_query($requete);

if ($resultat) {

if (mysql_num_rows($resultat) != 0) {

while ($enreg = mysql_fetch_row($resultat)) {

        // chaque option de la liste déroulante affichera la description de la catégorie et retournera son id

        echo "<option value='$enreg[0]'>$enreg[1]</option>";

}

}

else {

echo "<option value='-1'>Aucune catégorie disponible</option>" ; 

// on devra rendre le bouton Enregistrer inactif

...

}

}

else {

echo "<option value='-1'>Un problème empêche de retrouver les catégories disponibles</option>" ; 

// on devra rendre le bouton Enregistrer inactif

...

}

echo "</select>";

?>

</p>

<p>

<input class="enregistrer" type="submit" value="Enregistrer" name="enregistrer" />

<input class="annuler" type="button" value="Annuler" onclick="document.location.href='...'" />

</p>

</form>

Attention : il est impératif que la valeur de chaque catégorie soit son identifiant (cat_id dans l'exemple précédent). Ceci permettra d'utiliser cette valeur comme clé étrangère dans la requête INSERT INTO.

Affichage du formulaire ou traitement des données ?

Le code permettant d'ajouter les données dans la base de données peut être placé dans la même page que le formulaire.

Le code PHP devra traiter deux cas :

  • Le formulaire doit être affiché en vue de permettre la saisie de données.
  • Le formulaire vient d'être envoyé (l'usager a cliqué sur « Enregistrer ») alors les requêtes permettant d'ajouter  des données dans la BD doivent être exécutées.

La structure du code ressemblera à ceci :

if (!isset($_POST['nomboutonsubmit'])) {

...   // afficher le formulaire de saisie de données

}

else {

...   // le formulaire vient d'être envoyé. Faire l'ajout de données puis afficher un message de confirmation.

}

Insertion des données dans la base de données

Ajout des données dans la BD à l'aide d'une requête SQL

Dans les cas les plus simples, l'ajout de données peut être fait à l'aide d'une requête SQL.

Ex : $descriptionsecure = addslashes($description);

$prixsecure = (float)$prix;

$cat_idsecure = (int)$cat_id;

$requete = "INSERT INTO sandwiche(sand_description, sand_prix, sand_cat_id) VALUES ($descriptionsecure, $prixsecure, $cat_idsecure)";

$resultat = mysql_query($requete);

...

Le problème avec cette techique, c'est qu'en cas de problème, il est difficile de réagir de façon précise. Par exemple, si le prix contenait une virgule décimale plutôt que le point que MySQL attend, la requête planterait alors qu'il aurait été simple de récupérer le problème et de corriger la situation.

C'est une des raisons pour lesquelles nous préférerons utiliser une procédure stockée pour effectuer l'ajout de données.

Ajout des données dans la BD à l'aide d'une procédure stockée

Ainsi, la façon la plus efficace de contrôler l'ajout d'un nouvel enregistrement consiste à utiliser une procédure stockée. La procédure recevra un paramètre pour chaque valeur qu'elle doit utiliser lors de l'ajout puis elle fera un INSERT INTO.

Afin de permettre au programme PHP de savoir si l'ajout a bien fonctionné, la procédure stockée devra avoir un paramètre en sortie. Ce paramètre prendra la valeur 1 si l'ajout a eu lieu et la valeur 0 dans le cas contraire. L'utilisation d'un gestionnaire MySQL permettra à la procédure stockée de modifier la valeur de ce paramètre.

Lorsque votre code PHP appellera la procédure stockée, il devra faire les tests suivants :

  • Est-ce que la requête appelant la procédure stockée a fonctionné ? Si non, affichera un message ressemblant à ceci :

    echo "<p>Nous sommes désolés, un problème technique empêche l'ajout des données.</p>";

    echo_debug( mysql_error() );  // voir la fiche « Déboguer un programme PHP sans débogueur »

    Vous apprécierez l'ajout du message affiché par mysql_error() pour déboguer votre programme. Attention : ne jamais laisser un tel message affiché à l'écran quand le site sera en production car il ouvre une importante porte de sécurité.

  • Est-ce que le paramètre retourné par la procédure stockée indique que l'ajout a été réussi ?
    • Si oui, affichera un message indiquant que l'ajout a été effectué avec succès.
    • Si non, affichera un message indiquant que l'ajout n'a pas été fait.

Dans votre procédure stockée, n'hésitez pas à utiliser une technique comme le journal des erreurs pour vous aider à cibler le problème qui a empêché l'ajout des données.

Lorsque vous ajoutez des données dans une base de données à l'aide d'un formulaire HTML, gardez toujours en tête que l'usager doit être bien informé de ce qui s'est passé.

Retrouver le code autoincrémenté d'un enregistrement qui vient d'être créé

Prenons le cas où  vous travaillez avec une base de données contenant des modules dans lesquels on peut insérer des fiches. Disons que vous voudriez ajouter une nouvelle fiche pour un module. Si les identifiants de fiches sont générés automatiquement par MySQL, comment faire alors pour rattacher la nouvelle fiche au module ?

Dans une procédure ou fonction stockée, MySQL vous permettra de retrouver la valeur du dernier identifiant automatiquement généré à l'aide des variables suivantes :

  • LAST_INSERT_ID
  • @@IDENTITY

Vous pouvez utiliser l'une ou l'autre indifféremment.

Ex : CREATE PROCEDURE NouvelleFiche(IN p_mod_id INT(11))
BEGIN
DECLARE fiche_id INT(11);
INSERT INTO fiche(fiche_titre) VALUES('Nouvelle fiche');
SET fiche_id = @@IDENTITY;

INSERT INTO modulefiche(mc_mod_id, mc_fiche_id, mc_ordre)
VALUES (p_mod_id,fiche_id, ProchainOrdreFiche(p_mod_id));
END

Certains programmeurs pourraient être tentés de coder une telle procédure comme suit :

Ex : CREATE PROCEDURE NouvelleFiche(IN p_mod_id INT(11))
BEGIN
DECLARE fiche_id INT(11);
INSERT INTO fiche(fiche_titre) VALUES('Nouvelle fiche');
SELECT MAX(fiche_id) INTO fiche_id FROM fiche;

INSERT INTO modulefiche(mc_mod_id, mc_fiche_id, mc_ordre)
VALUES (p_mod_id,fiche_id, ProchainOrdreFiche(p_mod_id));
END

Cette dernière technique n'est pas acceptable dans un environnement multi-usager.

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories