Cours PHP mysqli :
Select : affichage depuis 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.

Sélectionner des données et les afficher dans le navigateur

Les requêtes suivantes sont basées sur cette table SQL, permettant de stocker des utilisateurs :
user (usr_id, usr_login, usr_pwd, usr_naissance, usr_mail_confirme, usr_taille);

Et voici un code PHP qui affiche l'ensemble des utilisateurs :

Et le résultat dans le navigateur est :

Quelques explications :

Ajouter une gestion d'erreurs

La gestion d'erreurs que l'on va rajouter permet d'afficher une éventuelle erreur dans la requête SQL. On parle bien d'erreurs 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'erreurs vous passerez un temps énorme à diagnostiquer des erreurs SQL, même évidentes.

Voici un rappel sur la gestion d'erreurs (qui a été présentée en détail dans le cours INSERT) :

Protection des données à l'affichage

Souvent on réaffichera des données qui ont été saisies par nos internautes (messages, login, commentaires, texte d'une annonce, etc.)

Là, la méfiance s'impose. Les internautes peuvent en effet très facilement saisir des textes qui vont perturber vos affichages, le plus violent étant la possibilité de rediriger votre page vers la page de leur choix avec ce genre de saisie :
(remarque : en décembre 2016, on s'est rendu compte en cours que Firefox protégeait contre ce genre de redirection)

Et voici comment grâce à htmlspecialchars, on se protège de cette insertion de balies HTML dans les textes des internautes :

Pourquoi je ne protège que le login mais ni le usr_id ni la date de naissance (usr_naissance) ?

Protection des guillemets avec mysqli_real_escape_string

Une requête peut planter si l'internaute saisi un guillemet simple (ou double, selon le cas) dans un des champs de saisi. Par exemple, les requêtes suivantes vont planter :

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 'internaute' 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.

Quelques fonctions très utiles associées au SELECT en PHP

Après avoir exécuté une requête de sélection, vous aurez très souvent besoin de mysqli_num_rows qui compte le nombre d'enregistrements dans un recordset

Si vous savez que votre jeu d'enregistrement ne contient que 0 ou une ligne (par exemple lors d'une authentification), le while est inutile, un if suffit :

Mise en pratique

Re-collez ici le code PHP du TP livre d'or, votre réponse n°8, qui affiche la liste des messages :

Votre réponse n°1

Collez ici le code PHP qui effectue l'authentification d'un internaute sur votre projet de fin d'année :

Votre réponse n°2