Ajouter ce site au Favoris Imprimer cette page  
 
 
     
     
     
   
Gestion de bases MySql avec PHP


Scripts PHP pour accéder à une base Mysql
Généralités
Dans ce chapitre, les généralités sur les bases de données et la structure des tables sont supposées acquises.
De façon générale, il est bien plus simple de stocker et de gérer des données dans une base de données que de les manipuler directement à l'aide de structures comme les fichiers et les tableaux.
Notamment la recherche d'information y est bien plus aisée et épargne beaucoup de programmation. Nous allons voir les grandes phases de l'utilisation de PHP pour gérer et consulter une base MySql et les principales fonctions spécialisées dans l'accès à ces bases.
Remarquer que PHP ne se limite pas à MySQL et intégre de telles interfaces d'accès aux principales bases de données relationnelles.

Connexion à un serveur Mysql : mysql_connect
La fonction mysql_connect($serveur, $login, $mdp) tente une connexion d'un utilisateur $login muni de son mot de passe $mdp, au serveur hébergé par la machine hote $host (localhost si la connexion est locale).
Bien entendu, cette connexion au serveur ne pourra être effectuée que par un utilisateur possédant des droits suffisants.
La valeur $connexion retournée est un identifiant positif de connexion en cas de succès, sinon c'est 0 considéré comme FALSE.
Il est fortement recommandé de placer l'affectation de ces variables dans un fichier à inclure, lui-même étant placé en dehors de l'arborescence accessible par le serveur WEB.
Inversement, mysql_close($connexion); supprime la liaison identifiée par $connexion.
<?
/* le fichier param.inc.php contient les valeurs des variables $serveur, $login, $mdp */
require("param.inc.php");
/* connexion au serveur MySql */
$connexion = mysql_connect($serveur, $login, $mdp) or die("Connexion impossible au serveur $host par $login");
echo "connexion réussie de $login au serveur $serveur<P>";
?>

/*Autre façon : on peut faire précéder ces commandes du symbole @,
* pour empêcher l'éventuelle émission de messages d'erreur. Bien entendu
* cela ne supprime pas les erreurs ! mais permet au programmeur de les traiter lui-même
*/

$connexion = @mysql_connect($serveur, $login, $mdp) ;
if ($connexion >0)
echo "Connexion réussie de $login au serveur $serveur<br>";
else
echo "Connexion impossible au serveur $serveur";

Opérations sur les bases de données : création, suppression et sélection
Ces 3 fonctions suivantes renvoient l'entier 1 en cas de succès, 0 en cas d'échec.
Les créations et suppressions sont normalement des privilèges de "root" l'administrateur MySQL
Par contre la sélection d'une base doit précéder ou accompagner (voir mysql_select_db) toute requête à cette base.
<?
require("param.inc.php");
$bd="test";
/* suppression de la base sur le serveur */
mysql_drop_db($bd, $connexion) or die("Suppression impossible de la base $bd" par $login) ;
echo "suppression réussie de la base $bd, essai de re-création<P>";

/* création de la base sur ce serveur */
mysql_create_db($bd, $connexion) or die("Création impossible de la base $bd par $login") ;
echo "création réussie de la base $bd<P>";
?>

/* Connexion à la base $bd
* Si le paramètre $connexion est omis,
* il s'agit de la dernière connexion réussie au serveur */
mysql_select_db($bd, $connexion) or die("Connexion impossible à la base $bd par $login");
echo "connexion réussie à la base $bd pour l'utilisateur $login<BR>";

Requêtes adressées à une base : mysql_query et mysql_db_query
La fonction PHP mysql_query($requete) est la fonction généraliste qui envoie la chaine $requete écrite en langage SQL, au moteur MySql afin que ce dernier l'exécute.
Implicitement, la requête s'adresse à la base précédemment sélectionnée par mysql_select_db
Sinon, on utilise mysql_db_query($bd, $requete) pour adresser la requête directement à la base
Selon le type de requete, cette fonction renvoie une valeur

interprétable en booléen vrai-faux (pour DELETE, INSERT, UPDATE ..)
identificateur de résultat, à partir duquel il faudra obtenir les données. C'est le cas pour la commande SELECT) pour laquelle il faudra utiliser les fonctions d'extraction spécifiques mysql_fetch_xxx() pour récupérer les lignes du résultat de la requête
Exemples :
/* les connexions au serveur et à la base sont déjà établies
* afficher le contenu de la table personnes */
$bd="test";
$table = "personnes";
$requete = "SELECT * FROM $table ORDER BY nom";
$resultat = mysql_query($requete);

/* Connaitre la liste des tables */
$resultat = mysql_list_tables ( $bd );
// donne le nombre de lignes dans le resultat
$nb = mysql_num_rows($resultat);
echo "Liste des tables de $bd : <p>";
for ($i =0 ; $i < $nb ; $i++)
// donne le nom de la table numéro i dans la liste précédente
echo mysql_tablename($resultat , $i) . "<br>";

Opérations sur les tables : création, suppression, modification
Soit à créer une table nommée personnes, dont les champs sont id (un numéro identifiant la personne, donc à déclarer comme clé primaire), nom (à indexer car il sera l'objet d'interrogations), prenom, sexe, date et emploi. En SQL chacune de ces variables de champ doit être déclarée avec son type et d'éventuelles options
Voici la requête SQL de création de la tables personnes, et son exécution par un script PHP :
$bd="test";
$table = "personnes";
$requete= "CREATE TABLE $table (
id INT NOT NULL AUTO_INCREMENT,
nom VARCHAR(25),
prenom VARCHAR(25),
date_naissance DATE
sexe CHAR(1),
emploi VARCHAR(25),
PRIMARY KEY (id),
INDEX i_nom (nom)
)";
$resultat = mysql_query($bd, $requete);
/* la requete a t-elle réussi ? On teste le "booléen" renvoyé */
if ($resultat) echo "La table $table a bien été créée !<P>";

/* Supprimer la table*/
$requete = "DROP TABLE $table" ;
$resultat = mysql_query($requete) or die("Impossible de supprimer $table") ;

Opérations sur les enregistrements d'une table : ajout, suppression et mise à jour
Ces 3 commandes SQL : INSERT, DROP et UPDATE agissent sur les lignes d'une table existantes
$table = "personnes";
$requete = "INSERT INTO $table (id, nom, prenom, sexe , emploi)
VALUES (32,'Toto','Jules','m', 'formateur')";
$resultat = mysql_query($requete);
// Le prénom ne Toto n'est pas Jules mais Arthur
requete = "UPDATE $table SET prenom = 'Arthur'
WHERE nom = 'Toto'";
$resultat = mysql_query($requete);
// Finalement on supprime cet enregistrement
requete = "DELETE FROM $table
WHERE nom = 'Toto' AND prenom ='Arthur' ";
$resultat = mysql_query($requete);

Interroger la base : SELECT
Une telle requête s'écrit en SQL avec la commande SELECT. Son exécution produit une variable qui est un identificateur du résultat, par lequel nous pourrons obtenir explicitement les données.

$requete = "SELECT * FROM $table ";
$requete .= " WHERE id <=10
$requete .= " ORDER BY nom";
$resultat = mysql_query($requete);
// si besoin, pour connaitre le nombre $nb de lignes du résultat
$nb = mysql_num_rows($resultat);

3 fonctions peuvent être utilisées pour récupérer les informations référencées par $resultat, après appel de mysql_query() sur une requête de type SELECT : mysql_fetch_array(), mysql_fetch_row(), mysql_fetch_object().
$ligne = mysql_fetch_row($resultat);
Cette fonction retourne un tableau indicé nommé ici $ligne, indicé à partir de 0, dont les éléments contiennent les valeurs des champs de la ligne courante pointée par $resultat, ou bien FALSE s'il ne reste plus de ligne.
Les appels consécutifs à mysql_fetch_row() déplace un pointeur vers la ligne suivante, si elle existe. Insérées dans une boucle while, ces appels permettent de décrire en séquence toutes les lignes du résultat.

$ligne = mysql_fetch_array($resultat);
Cette fonction est une version étendue de mysql_fetch_row().
Ici $ligne désigne un tableau associatif dont les indices peuvent être remplacés par les noms des champs, ce qui permet de s'adresser directement à la valeur d'une colonne du résultat. Ainsi la valeur du champ nom du tableau $ligne s'obtient avec $ligne[nom]

$ligne= mysql_fetch_object($resultat);
On obtient un objet construit à partir d'une ligne du resultat, ou FALSE si on a atteint la fin de la table
Cet objet $ligne possède pour attributs tous les champs de la table, initialisés aux valeurs actuelles de cette ligne. Ainsi la valeur du champ nom de l'objet $ligne s'obtient avec la syntaxe $ligne->nom
Si nécessaire, on peut re-parcourir le résultat identifié par $resultat, en remettant le pointeur au début par la commande
mysql_data_seek($resultat, 0);
Exemple
<?
/* inclure les paramètres de connexion */
require("param.inc.php");

/* connexion au serveur MySql */
$connexion = mysql_connect($serveur, $login, $mdp) or
die("Connexion impossible au serveur $serveur");
echo "connexion réussie de $login au serveur $serveur<br>";

/* connexion à la base */
mysql_select_db($bd) or die("Connexion impossible à la base $bd");
echo "connexion réussie à la base $bd pour l'utilisateur $login<P>";

/* interrogation classique */
$req = "SELECT * FROM $table";

/* affichage des lignes par la focntion mysql_fetch_row() */
echo "Affichage par \"tableau indicé\"<br>";
$resultat = mysql_query($req);
echo "<table border=2>";
echo "<tr> <th>Nom</th> <th>Prénom</th> <th>Date de naissance</th> <th>Rang</th></tr>";
while ($ligne = mysql_fetch_row($resultat) )
echo "<tr><td>$ligne[0]</td><td>$ligne[1]</td><$ligne[2]</td><td>$ligne[3]</td></tr>";
echo "</table>";
?>

Résumé : les principales fonctions
Voici la liste des fonctions intégrés à PHP et spécialisées dans l'accès aux bases MySql.
Chacune fait l'objet d'une description dans la documentation disponible sur le site PHP à http://www.php.net/docs.php. La traduction française à jour se trouve à http://www.php.net/manual/fr/
$connexion=mysql_connect($serveur, $login,$mdp) L'utilisateur $login ouvre une connexion au serveur $serveur, et reçoit en retour l'identifiant $connexion
mysql_close($connexion) Ferme la connexion MySQL identifiée par $connexion
mysql_select_db($bd,$connexion) Sélectionne la base de données nommée $bd
$resultat = mysql_query($requete[,$connexion]) La requête SQL $requete, écrite sous forme de chaine, est envoyée à la base déjà sélectionnée, et reçoit un identifiant de résultat
Celui-ci est un pseudo-booléen TRUE si la requete a été correctement exécutée (meme si aucune ligne n'a été modifiée ou sélectionnée). En cas de requete SELECT, $resultat permet d'accéder aux données extraites.
mysql_db_query($bd, $requete[,$connexion]) Idem, mais la base est d'abord sélectionnée
$nbchamps=mysql_num_fields($resultat) Retourne dans $nbchamps le nombre de champs du résultat
$nblignes = mysql_num_rows($resultat) Retourne dans $nblignes le nombre de lignes du résultat
$nb=mysql_affected_rows($connexion) Retourne le nombre de lignes affectées lors de la dernière requête de type INSERT, UPDATE,DELETE,CREATE ou DROP
$nomchamp = mysql_field_name($resultat, $i) Retourne le nom du champ numéro $i du résultat ($i de 0 à $nbchamp
$ligne = mysql_fetch_row($resultat) Retourne la ligne suivante du résultat dans un tableau indicé, dont les éléments contiennent les valeurs de cette ligne
$ligne = mysql_fetch_array($resultat) Retourne la ligne suivante du résultat dans un tableau associatif.
$ligne = mysql_fetch_object($resultat) Retourne la ligne suivante du résultat, dans un objet dont les attributs sont exactement les champs obtenus
$liste_bases = mysql_list_dbs() Retourne la liste des bases de données disponibles sur le serveur
$liste_tables = mysql_list_tables($bd) Retourne la liste des tables de la base $bd
$nom = mysql_db_name($resultat,$i) Retourne le nom de la $i ème base de donnée
$tab[$i] = mysql_tablename($liste_tables, $i) Lit le nom du champ numéro $i dans la table
mysql_data_seek($resultat,0) Déplace le pointeur interne de résultat au début du résultat
$num=mysql_errno() Retourne le numéro de message d'erreur de la dernière opération MySQL.
$texte=mysql_error() Retourne le texte associée avec l'erreur générée lors de la dernière requête.


[Precédent] [Sommaire] [Suivant]                                  [Haut]