Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
Dans le chapitre précédent j'ai évoqué les requêtes sélection (commencent par le mot clé SELECT) je vais dans ce chapitre évoquer les
requêtes action (ajout, modification et suppression).
Comme les requêtes sélection les requêtes action sont appelées au sein de pages PHP qui constituent l'interface d'administration de la base de données.
Les requêtes action modifient le contenu de la base de données. Elles doivent être mises à la disposition du visiteur avec un maximum de précaution.
Si, par exemple dans le cadre d'un forum, vous autorisez les internautes à ajouter des lignes dans une table, il faut empêcher l'injection d'instructions
HTML ou JS, par exemple des liens vers des sites ...
Une requête ajout permet d'insérer de nouveaux enregistrements dans une table.
Une requête ajout commence par le mot clé INSERT.
Dans un chapitre précédent je vous ai déjà communiqué deux exemples de requêtes ajout (à la table NEWS) mais je n'avais pas donné d'explication ..
Je rappelle ci-dessous leur code :
La première requête ajoute une ligne dans la table "news" ; le champ date_new est rempli avec la date courante ; les autres champs sont remplis avec des variables (données provenant d'un formulaire).
La deuxième requête ajoute quatre enregistrements dans la table "news".
Vous constatez que dans les deux cas on ne précise par la valeur affectée au champ ID qui pourtant ne peut rester vide puisque il est NOT NULL. Mais le champ ID a aussi l'attribut AUTO_INCREMENT donc le remplissage est automatique.
Il n'est pas obligatoire de préciser après le nom de la table la liste de tous les champs à remplir.
Rappel sur la liste des colonnes dans la table "membres" : id, nom, prenom, sexe, adresse1, adresse2, adresse3, tel1, tel2, bureau, date_naiss, mail.
Donc 12 champs !
Pour les champs relatifs au coordonnées (3 champs pour l'adresse, 2 champs pour les n° de téléphone, un champ pour l'adresse mail), NULL est autorisé.
Donc pour ajouter une ligne dans la table "membres" j'ai deux solutions :
Attention la deuxième solution paraît plus simple mais il faut prendre certaines précautions.
Après le mot clé VALUES il faut obligatoirement affecter une valeur à chaque champ et surtout il faut respecter l'ordre physique des champs.
Je vous rappelle la structure de la table "news" : 4 champs (id, date_new, titre, message).
Pour tous les champs NULL est interdit.
Donc pour ajouter trois enregistrements dans la table "news" je peux écrire tout simplement :
INSERT INTO news VALUES (21, curdate(),'', ''),(22, curdate(),'', ''),(23, curdate(),'', '');
Je peux remplir un champ à l'aide d'une fonction. Le champ "date_new" est de type date et la fonction SQL curdate() retourne la date courante.
Je remplis certains champs avec une chaîne vide ; une chaîne vide c'est différent de NULL !
Une requête de mise à jour commence par le mot clé UPDATE.
Elle contient une clause WHERE.
Exemple : modification des champs "titre" et "message" des nouvelles lignes dans la table "news".
Ainsi pour modifier l'enregistrement identifié 21 :
Je peux insérer des guillemets doubles dans une chaîne délimitée par des guillemets simples !
On veut que tous les champs "tel2" soient remplis par la chaîne : "00 00 00 00 00"
UPDATE membres SET tel2 ="00 00 00 00 00"
La requête UPDATE n'a alors pas de clause WHERE. Donc tous les enregistrements sont modifiées pour leur champ "tel2".
Elles commencent par le mot clé DELETE.
Pour vider la table "membres" il suffit d'écrire :
DELETE FROM membres ;
Attention cette requête vide la table (supprime tous les enregistrements) mais celle-ci subsiste ; elle est prête à recevoir de nouveaux enregistrements.
Pour vider une table on peut aussi utiliser TRUNCATE TABLE nomTable
La différence majeure étant que la commande TRUNCATE ré-initialise l’auto-incrémentation tandis que la commande DELETE ne ré-initialise pas
l’auto-incrémentation.
Pour détruire une table dans une base de données (contenu et structure) il faut utiliser la commande DROP TABLE nomTable
Pour supprimer seulement les lignes vérifiant une condition il suffit d'introduire dans la requête une clause WHERE.
Exemple : supprimer dans "news" les lignes dont l'ID est supérieur à 20.
DELETE FROM news WHERE id >20;
$bdd est la variable objet qui référence la connexion à la base de données.
Imaginons que l'utilisateur saisissent l'info du jour en guise de titre de la nouvelle new.
Le texte saisi comprend une apostrophe(donc un guillemet simple) non échappée donc il y aura erreur et la saisie ne sera pas ajoutée à la table.
Il aurait fallu que l'utilisateur saisisse la chaine : l\'info du jour ! Mais peut-on exiger cela de l'utilisateur ?
Mais il y a beaucoup plus grave.
Imaginons qu'un administrateur (voulant montrer sa science en informatique (ou ennuyer) le webmaster) saisisse dans le champ titre
un script JavaScript tel : <script> location.href =https://www.xvideos.com; </script >.
Le visiteur suivant, voulant consulter les dernières infos, va en fait se retrouver sur le pornographique !!!
L'internaute mal intentionné aurait pu aussi saisir une instruction HTML du genre
<a href ="https://www.xvideos.com"></a>
Donc le code PHP proposé a une grosse, très grosse faille de sécurité.
Le code HTML du formulaire ne change pas. Par contre dans le code PHP il faut rajouter certaines fonctions.
J'emploie des fonctions PHP htmlentities et addslashes.
La fonction addslashes permet d'échapper les guillemets simples et doubles c'est à dire de remplacer ' par \' et " par
\".
Ainsi l'utilisateur pourra saisir des guillemets dans le titre et le message sans qu'il y ait plantage.
La fonction htmlentities évite la faille de sécurité évoquée plus haut.
En effet grâce à cette fonction certains caractères et en particulier les chevrons sont remplacés par leur entité de caractère et donc
l'instruction saisie par l'internaute malveillant, n'est plus exécutable.
On affiche toutes les news. Puis l'utilisateur doit saisir l'ID de la new qu'il veut supprimer.
Attention en SQL l'égalité c'est = (et non pas ==) !
Le code de la page qui permet de modifier le titre et le message d'une new (extrait) suite à une erreur de saisie.
Pour ne pas trop complexifier le code, l'administrateur doit ici, resaisir le titre et le message.
Dans la réalité il faudrait imaginer une solution plus ergonomique ...