Site.php
À des fins d’illustration, nous avons produit un petit paquetage permettant à un utilisateur d’effectuer une recherche dans une base de données (voir le chapitre 13). La syntaxe de PHP n’est pas difficile à comprendre et le manuel du langage est disponible à partir de la page http://www.php.net/manual/en/ref.mysql.php. La base de données a deux champs : xname et sname.
La première page s’appelle index.html afin d’être automatiquement appelée. Il s’agit d’un formulaire HTML classique :
<HTML>
<HEAD>
<TITLE>Test PHP</TITLE>
</HEAD>
<BODY>
<form action="lookup.php" method="post">
Recherche de personnes par leur nom :<BR><BR>
Nom :  <input name="xname" type="text" size=20><BR>
<input type=submit value="Rechercher">
</form>
</BODY>
</HTML>
L’attribut action de l’élément form indique que le formulaire appellera lookup.php, qui est le script PHP s’interfaçant avec MySQL.
Ce script est le suivant :
<HTML>
<HEAD>
<TITLE>Test PHP : recherche</TITLE>
</HEAD>
<BODY>
Recherche :
<?php print "Vous recherchez les personnes s’appelant $xname"?><BR>
Les voici :
<?php
/* connect */
mysql_connect("127.0.0.1","webserv","");
mysql_select_db("people");
/* récupération */
$requete = "select xname,sname from people where xname='$xname'";
$resultat = mysql_query($requete);
/* affichage */
while(list($xname, $sname) = mysql_fetch_row($resultat))
{
print "<p>$xname, $sname</p>";
}
mysql_free_result($resultat);
?>
</BODY>
</HTML>
Le code PHP est compris entre les marqueurs <?php et ?>. Les commentaires sont placés entre /* et */, exactement comme en C.
On suit ici les étapes classiques :
- Connexion à MySQL -- sur un vrai site, on mettrait en place une connexion persistante, afin d’éviter le surcoût d’une reconnexion à chaque requête.
- Choix d’une base de données -- people, ici.
- Construction d’une requête adressée à la base de données choisie :
select xname,sname from people where xname='$xname'
- Exécution de la requête et récupération du résultat dans une variable -- $resultat
- Dissection de $resultat pour en extraire les enregistrements satisfaisant la requête.
- Affichage ligne par ligne des données obtenues.
- Libération de $resultat pour récupérer son emplacement mémoire.
Nous voyons alors apparaître les lignes suivantes à l’écran :
Recherche : Vous recherchez les personnes s’appelant Jean ?
Les voici :
Jean, Dupont
Jean, Bonnot
Le contenu de la variable $requete est exactement la commande que vous taperiez sous MySQL. Il convient de souligner que même si la requête :
select * from name where xname='$xname'
fonctionne directement sous MySQL, vous devez préciser les noms de variables pour que PHP puisse récupérer les résultats dans celles-ci :
select xname, sname from name where xname='$xname'
Cela dit, ce problème peut être réglé en effectuant une extraction de données plus sophistiquée :
...
$requete = "select * from people where xname='$xname'";
$resultat = mysql_query($requete);
/* Affichage */
while($ligne = mysql_fetch_array($resultat, MYSQL_NUM))
printf("<BR>%s %s", $ligne[0], $ligne[1]);
mysql_free_result($resultat);
...
Lorsque nous avons voulu exécuter ce script, notre seule difficulté a été de le connecter à la base de données. Le code original, tiré du manuel PHP, était :
mysql_connect("localhost","utilisateur","secret");
En l’adaptant à la configuration de notre machine de test, telle qu’elle a été présentée dans les trois premiers chapitres de ce livre, nous avons donc écrit :
mysql_connect("localhost","webserv","");
Mais cela produisit un message déplaisant :
Warning: MySQL Connection Failed: Can’t connect to local MySQL server through socket '/tmp/mysql.sock' (38) in /usr/www/APACHE3/site.php/htdocs/test.php on line 7
La faute en incombait sûrement à notre mauvaise configuration, où le DNS n’était pas disponible pour résoudre l’URL. Selon la documentation de PHP, il y a plusieurs moyens de corriger cela :
- En ajoutant le numéro de port par défaut :
mysql_connect("localhost:3306","webserv","");
- En ajoutant la ligne suivante à /usr/local/lib/php.ini :
mysql.default_port = 3306
- En ajoutant la ligne suivante au fichier de configuration d’Apache :
SetEnv MYSQL_TCP_PORT 3306
Aucune de ces solutions n’a fonctionné mais, heureusement, il a suffit de modifier la ligne PHP en celle-ci :
mysql_connect("127.0.0.1","webserv","");
Erreurs
Si vous faites une erreur de syntaxe, par exemple en ajoutant un } après la ligne du printf( ), le navigateur affichera un message d’erreur pertinent :
Parse error: parse error in /usr/www/APACHE3/site.php/htdocs/lookup2.php
on line 25
Cependant, il n’y a pas que des erreurs de syntaxe. Pour illustrer ce qui se passe, nous voulions que l’exemple précédent reste simple. Dans la réalité, vous aurez affaire à des erreurs plus sinistres. Pour les traiter, PHP utilise une syntaxe dérivée de celle de Perl :
mysql_connect("127.0.0.1","webserv","") or die(mysql_error()); mysql_select_db("people") or die(mysql_error());
La fonction die( ) affiche un message -- ou exécute la fonction qu’on lui a passé en paramètre -- puis met fin au script. Si, par exemple, on tente de sélectionner une base de données inexistante, people2, l’appel à la fonction mysql_select_db( ) échouera et renverra 0. die( ) sera alors appelée et invoquera à son tour mysql_error( ) : cette fonction renverra le message d’erreur produit par MySQL, qui sera inclus dans le code HTML. Le navigateur affichera alors :
Recherche : Vous recherchez les personnes s’appelant Jean
Les voici : Unknown database 'people2'
Au cours de vos développements, utilisez la construction or die( ) à chaque fois que quelque chose d’imprévu peut se passer.
Cependant, lorsque les pages sont visibles sur le Web, notamment par les sales types, vous préférerez éviter de révéler un tel message à tout le monde. On peut (bien que ce soit trop compliqué pour l’expliquer ici) définir son propre gestionnaire d’erreurs : vous utiliseriez alors une variable globale -- $error_level, par exemple -- qui vaudrait devel ou prod selon le cas. Si cette variable vaut devel, le gestionnaire d’erreur que vous avez défini appeler die( ) ; si elle vaut prod, il appelerait une autre fonction, affichant un message poli :
Désolé, mais une erreur s’est produite.
et ajouterait une ligne dans un fichier log du serveur. Cette fonction pourrait également vous envoyer un courrier électronique à l’aide de la commande mail( ) de PHP.
Scripts PHP autonomes
Tous ces langages, que ce soit Perl, Java, Python, etc. ont commencé leur carrière comme moyen d’écrire des scripts -- des programmes courts pour analyser des données, déplacer des fichiers, etc. -- et cela, bien avant que le Web n’existe. Lorsque vous vous êtes ennuyé à télécharger, compiler, installer et apprendre un langage, il serait dommage de ne pas pouvoir l’utiliser pour les tâches ingrates qui doivent s’effectuer sur un ordinateur. Au premier abord, PHP semblait disqualifié pour ce rôle puisque nous avons vu qu’il était intégré au pages HTML mais, à partir de la version 4.3, on peut désormais exécuter des scripts à partir de la ligne de commande (voir http://www.php.net/manual/en/features.commandline.php).