Interfaçage de MySql via le langage PHP
Intérêt
Il est très intéressant de pouvoir gérer son site web à travers les bases de données. En effet rien de plus embêtant que de devoir replonger dans le code source pour reprendre les pages à modifier même avec des logiciels WYSIWYG.
Ce serait si bien si l'ajout d'un nouvel article, d'une image ... dans mon site n'obligeait pas à reprendre la page qui propose des liens vers ces domaines.
Avec la base de données c'est possible. Vous ajoutez un élément dans un table et c'est tout. Via php, la page proposée à l'utilisateur est construite dynamiquement en effectuant une requête sur la base de données.
Les commandes utilisées en php pour réaliser ce que nous faisions manuellement commencent généralement par le mot
mysql_.
Attention ! Pour suivre ce cours, il est indispensable d'avoir de bonnes notions sur les SGBDR et le langage de requête SQL.
De plus, votre hébergeur doit gérer les bases de données MYSQL via le plus souvent PHPMYADMIN.
Connexion et déconnexion à la base de données
- Connexion à MySql
Avant de pouvoir effectuer des requêtes sur la base de données, il faut s'y connecter via un utilisateur autorisé.
On utilise la commande: mysql_connect
$connexion=mysql_connect
(nom_machine_locale,utilisateur,mot_de_passe);
- Ouverture de la base
Une fois la connexion à MySql réalisée, il va falloir indiquer quelle est la base de données sur laquelle nous désirons travailler.
Pour cela utilisez la commande mysql_select_db.
mysql_select_db(nom_de_la_base,connexion);
Note : le pointeur de connexion serait ici $connexion déclaré lors l'ouverture de la connexion.
On peut outrepasser cette fonction, dans ce cas, il faudra utiliser mysql_db_query($db,$requete)
$resultat=mysql_db_query($bdd,$requete) or die ('Erreur '.$requete.' '.mysql_error());
Notez que la fonction die est vue dans la gestion des erreurs plus bas sur cette page.
- Déconnexion
Lorsque vous avez terminé d'utiliser la base de données, vous devez, libérer la ressource au moyen de la commande mysql_close.
mysql_close($connexion);
Si vous omettez cette commande, la fin du script fera office de fermeture de connexion. Si vous omettez le pointeur, ce sera la dernière connexion ouverte qui sera lors fermée.
État de MySql
Avant de travailler sur une base contenue dans MySql vous pouvez vouloir connaître ou faire connaître le contenu de MySql, permettant ainsi à l'utilisateur de choisir la base sur laquelle il veut travailler (effectuer des requêtes, mise à jour ...).
Vous avez à votre disposition la commande
mysql_list_dbs.
Cette commande est identique à
SHOW DATABASES sous MySql.
La commande renvoie un pointeur sur le résultat. Vous n'obtenez pas directement les informations, il faut ensuite utiliser des fonctions de récupération des résultats (
mysql_field_*,
mysql_num_...) souvent dans une boucle.
mysql_list_dbs($connexion);
exemple
Je désire fournir à un utilisateur, sous forme de listes, la liste des bases contenues dans MySql. Il doit pouvoir, ensuite, en choisir une et l'ouvrir tout cela avec un seul programme php.
<HTML><BODY BGCOLOR=#FFFFFF>
<?php
$username="admin";
$password="motdepasse";
$hostname="monsite.com";
echo ("
<center><font size=7><U>PHP-MYSQL en action<br>Connexion à MySql</u></font>
<BR><BR>
</CENTER>
");
#On se connecte a MySql
if(!($connexion=mysql_connect
($hostname,$username,$password)))
{
echo "<U>probleme lors de la connexion à MySql</U>";
exit();
}
else
{
echo ("<B>Connexion a MySql OK <BR>");
# On recupere les bases presentes
$result=mysql_list_dbs($connexion);
# On compte le nombre de lignes de resultat
$nombre_base=mysql_num_rows($result);
echo "Nous avons <font color=green>$nombre_base</font> bases disponible(s)<BR>";
# On crée le formulaire qui pointera sur ce meme programme
echo "<FORM METHOD=POST>
<SELECT NAME=nombase SIZE=$nombre_base>
";
#On affiche chaque ligne de resultat
while ($ligne = mysql_fetch_row($result))
{ echo "<OPTION>$ligne[0]";}
echo "
</SELECT><BR>
<INPUT TYPE=submit VALUE=soumettre>
<INPUT TYPE=reset VALUE=reset></FORM>";
# Partie pour le traitement du resultat une fois une base selectionnee
if($nombase != "")
{
print "Vous avez choisi d'accéder à la base -->$nombase<--<br>";
#On se connecte a la base
if(!mysql_select_db($nombase,$connexion))
{echo ("Erreur de selection de la base -->$nombase<--<br>");exit();}
else
{echo ("<B>Ouverture de la base -->$nombase<-- ok<br>");}
}
}
mysql_close($connexion);
?>
</BODY></HTML>
La partie FORM ne contient pas d'option ACTION. Le programme recevant les informations une fois le formulaire soumis sera donc lui-même.
Vous pouvez sinon utiliser la variable d'environnement de php contenant le nom de votre programme:
<FORM ACTION=$PHP_SELF METHOD=POST>
État d'une base
Nous connaissons maintenant les bases disponibles, mais qu'y a t'il à l'intérieur ?
Nous allons donc avant de voir la récupération d'informations contenues dans les tables comment récupérer l'état d'une base (table, structure ...).
- Liste des tables
Nous l'avons déjà un peu évoqué avec la récupération des bases contenues dans MySql. Vous pouvez utiliser la fonction mysql_list_tables associée à la fonction mysql_tablename.
$pointeur_resultat=mysql_list_tables
($nom_de_la_table,$pointeur_de_connexion);
mysql_tablename($pointeur_resultat,$indice);
exemple
En reprenant l'exemple précédent, je désire maintenant montrer les tables disponibles dans la base sélectionnée. Afin d'avoir plus d'une table à ma disposition je vais travailler sur la base "baseetudiants".
Je complète l'exemple précédent une fois la base ouverte.
<HTML><BODY BGCOLOR=#FFFFFF>
<?
else
{
echo ("<B>Ouverture de la base -->$nombase<-- ok<br>");
$result_table=mysql_list_tables($nombase,$connexion);
# On compte le nombre de lignes de resultat
$nombre_table=mysql_num_rows($result_table);
echo "Nous avons <font color=green>$nombre_table</font> tables disponibles<BR>";
# On crée le formulaire qui pointera su ce meme programme
echo "<FORM ACTION=mysql_query_table.php METHOD=POST>
<SELECT NAME=nomtable SIZE=$nombre_table>
";
for($j=0;$j<$nombre_table;$j++)
{
echo "<OPTION>".mysql_tablename($result_table,$j);
}
echo "
</SELECT><BR>
<INPUT TYPE=submit VALUE=soumettre>
<INPUT TYPE=reset VALUE=reset>
</FORM>";
}
}
}
mysql_close($connexion);
?>
</BODY></HTML>
- Structure d'une table
Avant d'effectuer des mises à jour, recherches, insertions d'informations dans une table, il est préférable de bien connaître la structure de la table pour éviter des erreurs.
Vous pouvez utiliser la fonction mysql_query qui permet de passer une commande SQL.
$pointeur_resultat=mysql_query
($requete,$pointeur_de_connexion);
exemple
$requete="DESC $nomtable";
$result_query=mysql_query($requete,$connexion);
Ainsi, la commande mysql_query permet de passer n'importe quelle commande comme si vous la tapiez en direct dans MySql. Le résultat est un pointeur référençant un tableau en mémoire.
$colonne = mysql_num_fields($result_query);
$ligne = mysql_num_rows($result_query);
Je récupère, en utilisant le pointeur de résultat, le nombre de colonnes et de lignes contenues dans le tableau. Ceci me permet ensuite de créer des boucles permettant de lire le contenu de ce tableau. Les indices, je le rappelle commencent à 0.
mysql_num_fields renvoie le nombre de colonnes du tableau résultat (les attributs ici).
mysql_num_rows renvoie le nombre de lignes du tableau résultat (les champs ici).
On peut ensuite afficher le Titre des colonnes (nom des attributs) via la fonction mysql_field_name et une boucle for qui parcourt le tableau en largeur (nombre de colonnes)
for($cpt2=0;$cpt2<$colonne;$cpt2++)
{print "<th bgcolor=yellow>".mysql_field_name
($result_query,$cpt2)."</th>";}
La fonction mysql_field_name permet donc de récupérer le nom de la valeur contenu dans le tableau des résultats. Vous pouvez aussi récupérer la longueur (mysql_field_length), le type (mysql_field_type) ainsi que les options de l'attribut.
Recuperation des resultats d'une ligne
$tab_rows=mysql_fetch_row($result_query);
Je récupère, sous forme de liste ($tab_rows), chaque ligne de résultats du tableau. A chaque passage, le pointeur se positionne sur la ligne suivante d'où la nécessité d'une boucle.
Requêtes sur les tables
Voyons maintenant comment effectuer des requêtes de sélections, d'ajout, de créations ...
Le principe est assez simple nous allons créer notre requête et ensuite la passer à MySql au moyen de la fonction
mysql_query déjà vue précédemment.
Récupération d'informations
On souhaite maintenant récupérer toutes les informations contenues dans la table.
L'affichage se fera comme pour la structure de la table sous forme de tableau.
La requête est simple :
select * from table
Ici on sélectionne tous les enregistrements d'une table, en pratique cela se fait via:
$requete="select * from $nomtable";
en sachant que l'on peut effectuer une requête plus complexe en fonction des besoins comme :
$requete="SELECT * FROM $nomtable WHERE rubrique='chariot' AND type LIKE '%$type%'";
$resultat=mysql_db_query($db,$requete) or die ('Erreur '.$requete.' '.mysql_error());
$n=mysql_num_rows($resultat);
Dans ce dernier cas, on utilise la clause
WHERE pour la requête SQL qui permet de cibler notre demande.
Il nous faut ensuite utiliser une boucle
for pour lire le contenu de chaque enregistrement, champ par champ.
for($i=0;$i<$n;$i++) {
$ligne=mysql_fetch_row($resultat);
$id=$ligne[0];
$description=$ligne[1];
echo ("identifiant n°$id = $description<br>");
}
les différents champs sont présents dans un tableau indicé de 0 à (nombre de champs-1).
Ajout d'informations
comme indiqué précedemment, on se sert d'une autre reqûete SQL:
$requete="INSERT INTO matable (url,Titre,mail,note,date,logo) VALUES ('$url','$Titresite','$mail',5,NOW(),'$logo')";
$resultat1=mysql_db_query($bdd,$requete) or die ('Insertion dans la base de données du site '.$Titresite.' impossible '.$requete.' '.mysql_error());
On prend ici l'exemple d'un annuaire de liens où chaque nouveau site est ajouté dans une base de donnée "matable". On reprend les valeurs de variables renseignées via un formulaire par exemple.
Notez la correspondance rigoureuse des champs qui seront renseignés avec les valeurs indiquées après "VALUES".
On utilise également la fonction MYSQL
NOW() pour entrer la date actuelle.
Suppression d'informations
On peut également supprimer un ou plusieurs enregistrements en fonction de critères.
$requete="DELETE FROM mabase WHERE url='$url'";
$resultat=mysql_db_query($bdd,$requete) or die ('Erreur : le site '.$Titresite.' n\'a pas été supprimé de la base de données : '.$requete.' '.mysql_error());
Dans cet exemple on utilise donc la fonction
DELETE et un critère de sélection.
Gestion des erreurs
Deux fonctions permettent, suite à une commande qui a échoué, de récupérer un numéro référençant l'erreur (
mysql_errno) et un message d'erreur (
mysql_error).
echo ("Numero d'erreur : ".mysql_errno()."<BR>");
echo ("Message d'erreur : ").mysql_error();
ou plus simplement
print mysql_errno();
print mysql_error();
Vous pouvez éventuellement indiquer le pointeur de résultat. Si vous ne le faites pas le dernier récupéré sera alors utilisé.
Une méthode trés utilisée est de stopper le script par la fonction
die en cas d'erreur.
$resultat=mysql_db_query($db,$requete) or die ('Erreur '.$requete.' '.mysql_error());
Informations sur la base
Avec la version php 4.0.5 vous avez à votre disposition des fonctions qui permettent d'obtenir des renseignements sur le client, le serveur ...
Ces fonctions renvoient une chaîne de caractères.
mysql_get_client_info() renvoie le numéro de version du client utilisé par PHP
mysql_get_host_info() renvoie le type de connexion utilisée et le nom du serveur hôte
mysql_get_proto_info() renvoie la version du protocole utilisée pour la connexion
mysql_get_server_info() renvoie la version du serveur.
Nous vous informons que ce cours constitue une œuvre protégée en France
par le Code de la Propriété Intellectuelle, et à l’étranger par les
conventions internationales en vigueur sur le droit d’auteur. La
violation de l’un des droits d’auteur de l’œuvre est un délit de
contrefaçon.
Il est donc interdit, à titre privé ou public, de reproduire, copier,
vendre, revendre ou exploiter, que ce soit dans un but commercial ou
purement gratuit, ce cours, sauf accord exprès et préalable de son
auteur.