Cours PHP mysqli :
Insertion dans une base de données.
Réponse AJAX

Connexion à la base de données

Pour pouvoir exécuter des requêtes SQL, il faut que votre script PHP soit connecté à une base de données : voir le TP mysqli - connexion aux bases de données.

Insérer dans une table à partir de PHP

Les requêtes suivantes sont basées sur cette table SQL, permettant de stocker des utilisateurs :

Et voici un code PHP qui effectue une insertion :

Quelques explications :

Ajouter une gestion d'erreur

La gestion d'erreur que l'on va rajouter permet d'afficher une éventuelle erreur dans la requête SQL. On parle bien d'erreur SQL et non pas d'erreurs PHP, qui normalement sont déjà prises en charge.

Très souvent vous aurez des erreurs à cause de vos requêtes SQL. Si vous ne rajoutez pas la gestion d'erreur, vous passerez un temps énorme à diagnostiquer des erreurs SQL, même évidentes.

Voici le même code que ci-dessus, avec une gestion d'erreur qui interrompt le script PHP :

Une gestion d'erreur prise en charge par le développeur :

En général c'est bien de réafficher la requête pour trouver l'erreur (sauf si elle contient des infos confidentielles comme un mot de passe). Voici donc la version ultime :

Insertion de données provenant d'un formulaire

La plupart du temps on a besoin d'insérer dans les tables des données que l'internaute a saisies dans un formulaire HTML.

Voici un exemple de formulaire adaptée à la table présentée au début de ce cours :

Et voici le code PHP qui réalise l'insertion :

Protection des guillemets avec mysqli_real_escape_string

La requête précédente plante si l'internaute saisi un guillemet simple dans un des champs de saisi. Par exemple, si le login est l'art, la requête SQL exécutée est :

On obtient alors l'erreur SQL suivante :

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'art', SHA1('pwd'), '1973-02-25', 0, 1.84)' at line 1

On évite cette erreur en échappant les guillemets, ici grâce à la fonction mysqli_real_escape_string :

La requête SQL ne plante plus, car elle est devenue (remarquez l'échappement du guillemet simple : ' est devenu \') :

Retenez bien... Soyons intransigeants avec la sécurité en informatique !

Vos sites Web ne doivent :

Toutes les données qui proviennent des internautes devront donc être échappées grâce à mysqli_real_escape_string avant d'être utilisées dans des requêtes SELECT, INSERT, UPDATE ou DELETE.

Je vous montrerai très bientôt mon TP SQL Injection pour montrer comment voler les mots de passe en exploitant ce genre de failles.

Gestion d'erreur automatique grâce à votre propre fonction mysqli_myquery()

Je reconnais qu'il est fastidieux d'écrire pour chaque requête SQL dans mes sites :

Je crée donc ma propre fonction mysqli_myquery que j'appelle ainsi :

Et voici la déclaration de ma fonction mysqli_myquery (que je place dans mon debut_page.php) :

TP pour la mise en pratique

Le TP Livre d'or permet de mettre en oeuvre un insertion simple : un livre d'or permet généralement de poster un commentaire sur un site sans être authentifié.
Collez ici le code PHP de votre TP Livre d'or qui effectue l'insertion des messages dans la base de données :

Votre réponse n°1

Collez ici le code qui, dans votre projet de fin d'année, permet à un internaute de s'inscrire sur votre site (formulaire + code PHP) :

Votre réponse n°2