Les bases du PHP
Introduction
La gestion d'un site web amène fréquemment à gérer des bases de données. Par exemple, sur excelabo, vous trouvez des classeurs qui sont proposés en téléchargement. Comme les contributeurs sont très actifs, cette liste doit être régulièrement mise à jour. Manuellement ceci impose de:
- Garder la trace de tous les classeurs, ce qui est facilement fait dans un classeur excel (quand même !).
- Editer en HTML cette liste avec les liens vers les fichiers zippés à télécharger.
- Modifier sur la page d'accueil le nombre de classeurs proposés.
C'est assez vite lassant et surtout les sources d'erreurs sont multiples. Une solution consiste à gérer tout cela avec une base mysql maintenue sur l'hébergeur du site. Free par exemple propose ce type de service. Comme beaucoup d'hébergeurs, ils ont choisi la solution MYSQL.
Une base mysql doit être interrogée et les résultats renvoyés dans une page web. C'est le langage PHP qui permet de réaliser cette partie. Php est un langage qui s'intègre très bien avec le html ce qui permet d'écrire certaines parties de pages en html (les parties fixes) et d'autres, les parties dynamiques en php.
J'ai pas mal galéré lorsque j'ai choisi cette solution pour comprendre comment faire. L'objectif de cette page est de reprendre pas à pas les notions indispensables pour utiliser cette possibilité sans se prendre trop la tête. Nous verrons donc :
- le B-A BA du php Mysql
- La création d'une table mysql chez l'hébergeur
- la gestion manuelle de cette table
- la gestion et l'utilisation de cette table en php (les notions de base seulement)
Le B-A BA du php Mysql
Il y a d'excellents sites dédiés aux langages PHP/MYSQL et des forums très actifs avec des gens vraiment sympas. Je vous recommande en particulier :
- Le mode d'emploi en français de MySQL
- Le mode d'emploi de PHP en Français
- Le site de l'indispensable easy PHP
- Developpez.com, ses tutoriaux et forums
- All html un site avec des forums très actifs et des tas de tutoriaux et d'aides
- PHP débutant
- PHP info
- PHP scripts
L'objectif n'est pas ici de faire un cours complet de php mais d'expliquer les quelques notions essentielles pour comprendre la suite et faire vous même vos propres scripts en vous inspirant des multiples exemples disponibles sur le net. Je prie les puristes de m'excuser de quelques abus de langages et imprécisions dans ce qui suit. Le but est d'être le plus simple possible...
Quelques définitions
PHP est un langage, comme javascript, qui permet de traiter dynamiquement des pages web.
Des exemples ? Vous indiquez sur votre page html la date de sa dernière modification. Si vous écrivez en html vous n'avez pas d'autre choix que de mettre la date "en dur". Comment faire pour qu'il apparaisse "date de dernière modification : aujourd'hui, hier, avant-hier ou la date entière si la mise à jour date de plus de 3 jours ? Pour faire cela vous devez faire appel à un peu de programmation, on parle d'un script, qui peut être écrit en php ou en javascript.
La différence essentielle entre ces deux langages tient au fait que le script sera exécuté par le navigateur de celui qui consulte la page si c'est du javascript ou par l'hébergeur du site si c'est du php. Cette dernière solution présente l'avantage d'être généralement breaucoup plus rapide. La page html est alors gérée dynamiquement: au moment ou l'utilisateur charge la page sur son navigateur, la page interroge le serveur qui lui renvoie l'info à faire figurer : quel jour sommes nous ? quelle est la date de dernière mise à jour ? En fonction de ces données, l'info varie.
Ces échanges dynamiques entre une page et le serveur peuvent être utiles pour afficher des données qui changent souvent comme la date ou une liste d'adhérents ou de classeurs à télécharger. Sur la page d'accueil d'Excelabo, figure le nombre de classeurs disponibles. Cette info est codée en php et va interroger le serveur. Ce qui est interrogé dans ce cas précis c'est une base mysql sur laquelle sont stockées les infos. En gros, c'est un tableau avec des entêtes de colonne et des lignes... Rien de bien sorcier.
Création d'un base de données mysql
Pour cela, il faut tout d'abord avoir votre propre site web ! Pour des raisons de sécurité, je ne peux pas vous donner accès au dossier hébergeant excelabo pour que puissiez vous exercer. Si vous n'avez pas de site web, tournez vous vers des hébergeurs gratuits comme Free en France qui proposent dans leurs services la gestion de base mysql (encore merci à free pour ça).
Si vous disposez d'un site web, vous n'avez pas nécessairement de base mysql associée. Peut être que votre hébergeur ne le propose pas (changez !) ou que vous n'avez pas encore demandé la création de votre base mysql. Chez free l'ouverture se fait dans les 24h. Pour la demander allez sur leur site web et regardez dans la section "gestion de mon site web". Vous recevrez un login et un mot de passe dédiés à la gestion de la base mysql (pas nécessairement les mêmes que ceux utilisés pour gérer vos accès FTP).
Si vous n'avez pas de site web, vous pouvez utiliser php pour gérer une base de données en local. Vous pouvez installer pour cela easy php, logiciel gratuit qui vous permet de gérer des bases locales. C'est une solution confortable pour tester vos bases avant de les mettre sur le serveur distant. C'est aussi tout à fait suffisant si vous voulez par exemple organiser votre liste de MP3 et pouvoir l'interroger en local sans la partager avec le monde entier :-).
Chez free (et d'autres), vous avez une base de données seulement. Mais sur cette base, vous pouvez mettre autant de tables que vous le souhaitez. Si votre site s'appelle "MonSite.free.fr" par défaut votre base s'appelle MonSite qui est également votre nom d'utilisateur (attention suivant les configs ceci peut varier, vérifiez ces infos chez votre hébergeur. Pour y accéder vous avez besoin d'un mot de passe: "MonPass". Suivant les cas celui ci peut être le même que celui utilisé pour le FTP ou un autre. Vous aurez également besoin d'une autre info : le nom de l'hébergeur. Chez free c'est sql.free.fr.
Toutes les astuces d'excelabo sont gérées via plusieurs tables mysql hébergées chez Online. Une table contient par exemple les titres, questions et réponses. Une autre contient les différents auteurs associés à cette astuce. Une troisième répertorie les liens web sur excel que je préfère avec leurs caractéristiques (j'ai actuellement 12 tables différentes).
Utilisation de l'interface Php-myadmin
Les hébergeurs vous proposent en général d'accéder à votre base mysql à l'aide d'une interface web, php-myadmin. Vous verrez très vite que celle ci n'est guère pratique pour faire des opérations régulières, même si théoriquement vous pouvez intégralement gérer vos bases à partir de là. Dans un premier temps nous utiliserons cependant cette interface pour lui faire lire un fichier texte, avec une extension .sql comportant les instructions de création d'une base.
En vous connectant sur la page phpmyadmin, vous devez avoir sur la gauche le nom de votre base de données avec indiqué entre parenthèses le nombre de tables qu'elle héberge. Cliquez dessus pour accéder à la page d'administration. L'interface peut ensuite changer d'aspect mais les différentes fonctions sont les mêmes.
Quel logiciel utiliser pour créer des pages php ou sql ?
N'utilisez surtout pas word ! Vous auriez des problèmes avec les codes de retour de ligne notamment. Choisissez soit des logiciels de création de pages web avec une fonction dédiée au php, soit tout simplement note pad. Personnellement j'utilise Web expert. Web expert permet en plus de lancer un "interpréteur php " pour voir en local les résultats de ce qu'on fait. Mon interpréteur php en local, c'est easy php. Ce couple est utilisé par de nombreux webmasters. L'avantage c'est que vous trouverez assez facilement de l'aide dans les forums si vous avez des problèmes (notamment sur allhtml).Web expert vous permet de mieux visualiser les codes php grace à une mise en couleur des instructions et des paramètres.
Création d'une table avec un fichier .sql
Pour créer une table, contenant des fiches, il faut commencer par décrire les en têtes de colonnes et le type de données contenues dans chacune. Vous trouverez sur les sites spécialisés et surout dans les modes d'emploi php et mysql des compléments d'information sur les paramètres de champ. Nous allons créer une base simple comportant quatre champs : un numéro d'identification, unique, qui nous permettra d'identifier chaque fiche de la table, un champ nom, un champ prénom et un champ adresse mail.
Copiez et collez les lignes suivantes dans note pad ou web expert et enregistrez sous le nom tuto.sql (ou autre nom mais avec l'extension .sql !)
CREATE TABLE tutoriel ( id int(3) NOT NULL auto_increment, nom varchar(30) default NULL, prenom varchar(30) default NULL, mail varchar(150) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
Ouvrez php-myadmin sur le web. Vous devez avoir un bouton "parcourir" vous permettant de sélectionner un fichier sur votre disque dur local. Sur online il faut préalablement cliquer sur l'onglet "SQL" en haut de l'écran de droite. Sélectionnez tuto.sql puis cliquez sur exécuter. Le contenu du fichier tuto.sql va être lu. Nous devez très rapidement voir apparaitre un message vous disant que la table tutoriel a été créée avec succès. Une ligne s'inscrit sous les rubriques table/action/enregistrements/type/taille faisant apparaitre les caractéristiques de votre table. Pour le moment le nombre d'enregistrements dans la table est nul.
Pour ajouter des enregistrements le plus simple est de créer un second fichier .sql celui-ci pourrait reprendre les données de structure nécessaires à la création de la table mais ce n'est pas nécessaire. En fait si vous le faisiez, SQL vous dirait qu'il existe déjà une table de ce nom et vous devriez la supprimer. Le fichier contient les lignes suivantes :
INSERT INTO tutoriel VALUES ('','Napoléon', 'Bonaparte', 'napo@corse.fr');
INSERT INTO tutoriel VALUES ('','Arc', 'Jeanne', 'bergere@domremy.fr');
INSERT INTO tutoriel VALUES ('','Empereur', 'Marc-Aurèle', 'empereur@rome.it');
INSERT INTO tutoriel VALUES ('','Cretinus', 'Alpinus', 'idiot@village.org');
Le premier champ (entre les deux premiers ') reste vide car l'instruction auto_increment ajoutera automatiquement le N° dans la table.
Attention à finir chaque ligne par un ;
Enregistrez ces données sous le nom datatuto.sql par exemple. Suivez la même procédure que précedemment pour charger ces données dans la table via l'interface web. Vous pouvez ainsi ajouter autant de fiches que vous le souhaitez à votre table, en une fois ou en de multiples fois. D'autres instructions mysql permettent d'enlever ou de modifier des fiches existantes. Ces fiches peuvent être sélectionnées dans la table à partir de critères multiples.
NB : vous pouvez aussi regrouper en un seul fichier les instructions de création de la table et l'insertion des premières données. C'est ce qui vous est proposé dans le fichier exemple à télécharger (archive zip, voir en haut de cette page).
Tout l'intérêt d'avoir une base mysql est de pouvoir l'interroger voire l'alimenter depuis une page html (en fait php). Vos lecteurs pourront ainsi par exemple vous laisser leur coordonnées pour que vous leur envoyiez des infos personnalisées. L'interface entre le visiteur et la base est facilement gérée via un formulaire comportant des champs de texte, des cases à cocher... Bref rien d'inconnu pour un excellien !
Création d'un fichier connect.php
Toutes les pages php de votre site qui devront accéder en lecture ou en écriture à la base php doivent comporter les infos nécessaires pour s'y connecter. Cette page comporte notamment le mot de passe nécessaire pour accéder à votre base. Celle ci est en effet non accessible à tout le monde (heureusement !). Si vous regardez le code source d'une page php sur le web vous ne les verrez pas.
Tout le code php, compris entre des balises <? et ?> est en effet non visible quand on demande d'afficher les codes sources d'une page. C'est une des raisons d'ailleurs d'utiliser le php si vous voulez protéger le code source de votre page. Cela dit, il est vraiment recommandé de ne pas mettre vos mots de passe sur vos pages. Il y a des petits malins !
Par ailleurs, c'est une bonne idée d'avoir une seule page comportant ces indications de base, maintenue dans un dossier particulier sur lequel vous pouvez mettre une restriction d'accès à l'aide d'un fichier .htaccess. Vous trouverez des explications sur le site de free pour voir comment gérer les restrictions d'accès. Mais cette page vous permet de n'avoir qu'un seul endroit à modifier si vous changez d'hébergeur ou de mot de passe. Nous allons donc écrire une page connect.php que nous appellerons ensuite depuis les autres pages pour récupérer les données qu'elle contient.
Pour écrire votre page php, ouvrez note pad et écrivez ceci :
<?php
$serveur="sql.free.fr";//nom du serveur
$user="MonSite";//votre nom utilisateur
$password="MonPass";//votre mot de passe
$base="MonSite";//nom de la base de donnée
$connexion = mysql_connect($serveur,$user,$password) or die("impossible de se connecter : ". mysql_error());
$db = mysql_select_db($base, $connexion) or die("impossible de sélectionner la base : ". mysql_error());
?>
Enregistrez sous connect.php
Si vous travaillez en local, avec easy php, vous avez malgré tout besoin de vous connecter à la base mysql. Vous pouvez donc avoir plusieurs fichiers connect.php, un sur le serveur distant et un en local par exemple. La syntaxe de cette page est la suivante :
Un exemple de fichier connect est inclus dans l'archive zip. Attention, il s'appelle fc-phpconnect.php. renommez le après l'avoir paramétré avant de l'utiliser
<? $serveur="localhost";//nom du serveur $user="root";//votre nom utilisateur pour easy php (c'est toujours celui là par défaut) $password="";//pas de mot de passe mais il faut le dire quand même $base="excelabo";//nom de la base de donnée en local $connexion = mysql_connect($serveur,$user,$password); $db = mysql_select_db($base, $connexion); ?>
Quelques remarques sur l'écriture
Le code php est encadré par ses balises : <?php et ?>
Les variables commencent par un "$"
Les commentaires commencent par // (tout ce qui derrière sur la même ligne est ignoré. Si vous voulez écrire tout un baratin, mettez /* au début puis */ à la fin.
TRES IMPORTANT (et casse pieds...) : chaque instruction DOIT se terminer par un ";"
Si vous l'oubliez vous aurez droit à des baratins genre "a parse error est intervenue sur votre page..." Le plus énervant c'est que le N° de la ligne qui vous est indiquée dans ces messages correspond à celle de l'erreur générée par l'oubli de la ponctuation mais pas nécessairement au N° de la ligne ou la ponctuation manque. Il faut parfois chercher un bon moment avant de trouver l'oubli. Adieu le confort du debuggeur de macro de VBA qui vous met les erreurs en couleur ! La version 6 de web expert annonce une fonction de correction de code php mais je ne l'ai pas testée.
Dans ce simple script, vous voyez apparaitre la structure de base des instructions :
- une variable pour commencer la ligne, par exemple $connexion qui suivant les cas renverra une valeur ou vrai ou faux ou un numéro suivant les cas. Dans certains cas cette variable est omise.
- une instruction Mysql_truc. La liste de ces intructions est diponible sur le mode d'emploi php dans la rubrique fonctions mysql. Ce sont des fonctions qui permettent d'exécuter une instruction sur la base : connexion, interrogation, sélection de données...
- or die... cette partie est optionnelle. Elle permet juste de renvoyer un message d'erreur. Je vous le conseille très vivement, au moins pendant la phase de mise au point de vos scripts pour identifier ce qui coince. La phrase entre guillemets est à votre convenance. Je vous conseille dans des scripts complexe d'être explicite pour vous reprérer dans vos erreurs.
- mysql error() renvoie le type d'erreur rencontré par mysql. Utile... Cette instruction est ici précédée par un point. Ce point est l'instruction de concaténation dans php, comme le & dans VBA.
Maintenant créons une page qui va simplement aller lire le nombre d'enregistrements présents dans notre table.
Dans une page html quelconque, écrivez le code ci dessous :
<?php
require("dossier_protégé/connect.php"); //indiquez le chemin relatif du fichier connect.php tel qu'il sera sur le serveur
$result1 = mysql_query("SELECT * FROM matable");
$nbenregistrements = mysql_num_rows($result1);
echo "il y a $nbenregistrements noms dans la base";
?>La première ligne n'a pas besoin d'être répétée avant chaque interrogation d'une table. Une fois par page php c'est suffisant (et pratique !)
Attention, dans php comme dans le VBA, la gestion des guillemets et apostrophes est précise (et très similaire). Dans ce premier script on voit apparaitre MYSQL_QUERY, instruction de base pour rechercher des fiches sur la base (identifiée dans la page connect), SELECT pour choisir ces fiches, FROM pour indiquer sur quelle table. Le select * indique que l'on veut récupérer dans la réponse (ici dans $result) tous les champs de la table en question. Donc ici le N° d'identification, le nom et le prénom. Si on ne veut que le nom il suffit d'indiquer "SELECT nom FROM matable"
Les résultats de la demande sont stockés dans un tableau dont le fonctionnement est assez similaire à celui des tableaux (arrays) d'excel. On peut ensuite bien sur faire de très nombreuses opérations sur ces tableaux (voir la rubrique correspondante sur le mode d'emploi de php).
La variable $nbenregistrements renvoie le nombre de lignes de la table "matable" récupérée par l'instruction mysql_num_rows. Si on veut afficher ce résultat dans la page html, on utilise l'instruction "echo". Tout ce qui est entre guillemets sera affiché. On peut inclure des variables qui seront interprétées pour afficher leur valeur comme ici $nbenregistrements.
On peut ensuite vouloir afficher dans une table html les noms et les prénoms de la table. Pour cela on va lire les résultats récupérés dans la variable $resultat1. Il y a plusieurs possibilités pour faire ça. En voici une :
- Vous devez vous identifier ou créer un compte pour écrire des commentaires
