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.
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 :
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) :
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 gênant étant la possibilité de rediriger votre page vers la page de leur choix avec ce genre de saisie :
(remarque : depuis 2016, les navigateurs protègent 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) ?
Une requête peut planter si l'internaute saisi un guillemet simple (ou double, selon le délimiteur choisi dans la requête) dans un des champs de saisi. Par exemple, les requêtes suivantes vont planter :
On obtient alors l'erreur SQL suivante :
On évite cette erreur en échappant les guillemets, ici grâce à la méthode real_escape_string :
La requête SQL ne plante plus, car elle est devenue (remarquez l'échappement du guillemet simple : '
est devenu \'
) :
Vos sites Web ne doivent :
Toutes les données qui proviennent des internautes devront donc être échappées grâce à 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.
Après avoir exécuté une requête de sélection, vous aurez très souvent besoin de 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 :
Re-collez ici le code PHP du TP livre d'or, votre réponse n°8, qui affiche la liste des messages :
Collez ici le code PHP qui effectue l'authentification d'un internaute sur votre projet de fin d'année :