Réalisation de sites web

Sommaire du site

Présentation
Comment apprendre
L'équipement
La page web
  Styles et CSS
  HTML, structure de la page
  HTML, éléments du corps
Le langage JavaScript
  JavaScript, objets "core"
  JavaScript, DOM, les bases
  JavaScript, DOM, node
  JavaScript, compléments
Le langage PHP, les bases
  PHP, fonctions utiles
  PHP pour le web
  PHP, compléments
SQL, introduction
  MySQL et PHP pour le web
  MySQL, plus loin...
Applications AJAX
Annexes utiles
  Fichier .htaccess
  Sécurité des sites web
  Conception d'un site web
  Référencement, syndication

Sommaire détaillé

Mentions légales.

Chapitres de cette page
Contenu  -> 

Page mise à jour le : 12-08-2015

Haut de la page

Intérêt
Connexion aux bases de données
Fonctions PHP d'interface
Requêtes renvoyant une liste
A suivre...

MySQL et PHP pour le web

Intérêt

Différents systèmes de gestion de bases de données sont utilisables depuis le PHP.
Ici, nous ne verrons que les utilisations de MySQL qui est le plus courant.

Le web est un excellent moyen d'accès aux bases de données car il donne cette possibilité à de nombreux utilisateurs. De plus en plus de sites web comportent des pages qui ne contiennent que peu d'informations statiques mais qui les produisent depuis une base de données. C'est le cas de la plupart des sites d'information.

De plus cela permet à des personnes peu familiarisées avec les outils informatiques d'alimenter le site facilement. C'est le cas des blogs, des sites basés sur les CMS (Content Management System) tels que SPIP ou Joomla et des Wikis.

On a ainsi un partage des tâches :

Mais l'accès aux informations de base de données depuis le PHP est aussi intéressant sous d'autres aspects :

Connexion aux bases de données

On remarquera que le nom de toutes les fonctions PHP d'accès à MySQL débute par "mysql_".

La connexion à une base de données "MySQL" se fait en deux temps :

Connexion au serveur

Cette connexion est protégée par un système d'authentification simple. Il faut généralement trois informations :

Depuis le PHP, la connexion se fait par la fonction :

mysql_connect (serveur, utilisateur, mdp)

où les trois paramètres sont des chaînes de caractères.

Cette fonction renvoie un identifiant de connexion ou FALSE si la connexion n'a pas pu être réalisée.

Il est possible d'établir plusieurs connexions pour travailler dans le même script avec différentes bases de données. Dans ce cas l'identifiant de connexion devra être transmis à la plupart des fonctions de l'interface MySQL.

Mais ce cas est assez rare et l'identifiant de connexion peut être omis pour ces fonctions. Cette page les présente dans ce dernier cas.

Connexion à la base de données

Par la fonction PHP

mysql_select_db(nom_base)

Où 'nom_base' est le nom de la base de données.

Cette fonction renvoie TRUE si elle a réussi, FALSE dans le cas contraire.

Cas d'erreur

Comme on vient de le voir, il se peut que les fonctions précédentes n'aboutissent pas. Dans ce cas, il peut être intéressant de savoir pourquoi.

Le système propose deux fonctions qui donnent plus de renseignements sur les erreurs et qui sont utilisables avec la plupart des fonctions d'accès à MySQL

La fonction mysql_errno() renvoie le numéro de la dernière erreur produite sur MySQL. Elle n'est pas très utile car il faut trouver, dans la documentation MySQL, à quelle erreur ce numéro correspond.

L'autre est plus intéressante.

mysql_error()

Elle renvoie sous forme de texte le message associé à la dernière erreur produite sur MySQL (en anglais).

Soyez prudent avec l'utilisation de ces messages d'erreur. En effet leur affichage à l'écran peut donner des informations sur la structure de la base de données. Ce qui n'est pas vraiment pertinent pour les utilisateurs mais peut l'être pour les pirates !

Un conseil

Il est très intéressant de placer ces deux fonctions de connexion dans un fichier séparé à inclure.

En effet, il est probable que plusieurs pages du site nécessiteront une connexion à la base.

De plus, comme on l'a vu la fonction 'mysql_connect' utilise des paramètres confidentiels. Par conséquent ce fichier devrait être placé à un endroit non accessible par le web (en amont du répertoire 'www').

Si on utilise un serveur local pour les tests et un serveur distant pour la production, il est probable que l'on n'utilisera pas pour ces deux contextes les mêmes caractéristiques de connexion. Dans ce cas il est simple d'utiliser des fichiers de même nom mais de contenu différents sur les deux serveurs.

Exemple

$serveur= "mon_mysql_serveur" ;
$base= "ma_base" ;
mysql_connect($serveur,"moi_meme","kdjhf7_Ks")
  or exit
mysql_select_db($base)
  or exit;

Notons l'utilisation de l'opérateur 'or' qui permet d'abandonner l'exécution en cas d'erreur.

 

Fonctions PHP d'interface

Voici les principales fonctions PHP pour accéder à MySQL.

mysql_query(requete)

C'est certainement la fonction la plus utilisée car elle fait exécuter la requête passée en paramètre par MySQL.

Pour les requêtes de type SELECT qui retourne une liste d'informations cette fonction renvoie une ressource de résultat qui devra être transmise aux fonctions de parcours de cette liste (voir paragraphe suivant).

Pour les requêtes ne retournant pas d'information (INSERT, UPDATE, DELETE) cette fonction renvoie TRUE si la requête a bien été exécutée ou FALSE en cas d'erreur.

mysql_real_escape_string(chaine)

Cette fonction échappe les caractères qui seraient mal interprétés dans les requêtes SQL. Elle joue le même rôle que la fonction PHP 'addslashes()' mais est mieux adaptée au SQL et elle devrait être préférée. Cependant elle impose une connexion au serveur de bases de données préalable.

Avant d'utiliser cette fonction il est nécessaire de vérifier que le traitement implicite des "guillemets magiques" ne soit pas réalisé. Si c'était le cas il faut appeler auparavant la fonction 'stripslashes'.

Cette fonction est indispensable si les données sont binaires (non textuelles) ou si elles proviennent d'un formulaire.

mysql_affected_rows()

Cette fonction peut être appelée après une requête modifiant la table (INSERT, UPDATE, DELETE). Elle renvoie le nombre de lignes affectées par la requête.

mysql_insert_id()

Dans le cas d'une table comportant un champ en "auto-incrément" et après une requête d'insertion, cette fonction renvoie la dernière valeur de l'auto-incrément

Exemple

Toujours avec notre table d'adhérents d'association.

$nom= mysql_real_escape_string($nom_adherent);
$adresse= mysql_real_escape_string($adr_adherent);
$fonction= "adhérent";
$requete= "INSERT INTO `adherents` SET
  `nom` = '$nom',
  `adresse` = '$adresse',
  `fonction` = '$fonction',
  `date_cotisation` = NOW() ";
$id_req= mysql_query($requete);

//La ligne suivante est à modifier en production
if (!$id_req) exit ("Erreur [$requete]<br>".mysql_errno());
echo "Le nouvel adhérent à l'identifiant : ".mysql_insert_id();

 

Le cas des requêtes renvoyant une liste

Certaines requêtes renvoient des informations. En particulier on obtient une liste d'enregistrements par la requête SELECT ... FROM ...

Comme pour les autres, cette requête est lancée par la fonction 'mysql_query()'. Dans ce cas cette fonction, si elle aboutit, renvoie une liste d'enregistrements. Et chaque enregistrement sera un tableau (au sens du PHP) dont chaque composante sera une valeur de champ.

Il nous faut donc un moyen pour parcourir la liste des enregistrements obtenus. Pour cela l'interface PHP nous fourni une famille de fonctions dont le nom commence par "mysql_fetch_".

A chaque appel ces fonctions renvoient le tableau de l'enregistrement courant ou FALSE s'il n'y en a plus. Un pointeur interne est géré pour que la suite des appels corresponde à l'obtention des enregistrements dans l'ordre où SELECT les a générés.

Voici les deux fonctions les plus utiles.

mysql_fetch_row(res)

Renvoie, pour chaque enregistrement, un tableau indexé numériquement sur les champs obtenus (commence à l'indice 0).

Le paramètre 'res' est la ressource de résultat obtenu par la fonction 'mysql_query()'.

Avec notre exemple,

$requete= "SELECT `nom`, `adresse` FROM `adherents`";
$id_req= mysql_query($requete);
while ($adherent= mysql_fetch_row($id_req))
  echo $adherent[0].' -- '. $adherent[1]."<br>";

Nous donne le nom et l'adresse de tous les adhérents

mysql_fetch_assoc(res)

Comme la précédente, mais est renvoyé un tableau associatif indexé par les noms des champs.

On voudrait connaitre les adhérents qui n'ont pas payé leur cotisation depuis moins d'un an.

$requete= "SELECT `nom`, `date_cotisation` FROM `adherents`
           WHERE `date_cotisation` < NOW() - INTERVAL 1 YEAR";
$id_req= mysql_query($requete);
while ($adherent= mysql_fetch_assoc($id_req))
  echo $adherent['nom'].' -- '. $adherent['date_cotisation']."<br>";

Remarquez, dans la clause WHERE l'expression "il y a un an" de la date :
"NOW() - INTERVAL 1 YEAR"

En savoir plus sur les dates en MySQL :
http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html

 

Ces fonctions renvoient toujours un tableau même si un seul champ/colonne est demandé.

 

Autres fonctions sur ces listes

Ces fonction prennent comme paramètre une ressource de résultat obtenu par la fonction 'mysql_query()'.

mysql_num_rows(res)

Renvoie le nombre d'enregistrements obtenus.

Il n'est pas nécessaire d'utiliser une fonction 'mysql_fetch_' auparavant.

mysql_num_fields(res)

Renvoie le nombre de champs des enregistrements de la liste. Utile si l'on a fait un "SELECT * FROM...".

mysql_free_result(res)

Cette fonction libère la mémoire utilisée par une fonction 'mysql_fetch_'.

Cela est utile lorsque l'on parcourt de grandes listes de résultats successivement. Sinon la mémoire est libérée à la fin de l'exécution du script.

A suivre...

Mais on peut faire encore mieux (plus compliqué aussi avec MySQL)

Plus loin avec MySQL