noSQL

UNE base de données sans SQL est possible, et même préférable dans certains cas, par exemple lorsque les données ne doivent pas être dynamiquement changées par des formulaires. Un ou plusieurs fichiers sauvegardés dans l'espace utilisateur du serveur permet d'éviter d'ouvrir une base de données pour pas grand-chose.

Il est même possible de stocker et modifier des données dans des fichiers textes en les structurant.

1. Éphémérides non modifiables

1.1 Fichiers des mois
1.2 Fichier exploitant

2. Carnet de téléphone modifiable

2.1 script carnet.php
2.2 script editer.php
2.3 script sauver.php
2.4 script effacer.php

1. Éphémérides non modifiables

L'exemple qui suit permet d'afficher une information qui doit être automatiquement changée chaque jour (type éphéméride). La solution la plus simple est d'écrire un fichier pour chaque mois, contenant sous forme de tableau les informations pour 29 à 31 jours.

1.1 Chaque mois en fichier .php

La base de données consiste en douze fichiers de 1.php à 12.php) contenant chacun un tableau dont chaque jour doit avoir été défini. La séquence <!--n--> permet de répérer chaque jour, tout en étant invisible en html.

<?php

$tableau=array("pas de jour 0!",
"<!--1-->On est le 1!",
"<!--2-->On est le 2!",
"<!--3-->On est le 3!",
"<!--4-->On est le 4!",
"<!--5-->On est le 5!",
"<!--6-->On est le 6!",
"<!--7-->On est le 7!",
"<!--8-->On est le 8!",
"<!--9-->On est le 9!",
"<!--10-->On est le 10!",
"<!--11-->On est le 11!",
"<!--12-->On est le 12!",
"<!--13-->On est le 13!",
"<!--14-->On est le 14!",
"<!--15-->On est le 15!",
"<!--16-->On est le 16!",
"<!--17-->On est le 17!",
"<!--18-->On est le 18!",
"<!--19-->On est le 19!",
"<!--20-->On est le 20!",
"<!--21-->On est le 21!",
"<!--22-->On est le 22!",
"<!--23-->On est le 23!",
"<!--24-->On est le 24!",
"<!--25-->On est le 25!",
"<!--26-->On est le 26!",
"<!--27-->On est le 27!",
"<!--28-->On est le 28!",
"<!--29-->On est le 29!",
"<!--30-->On est le 30!",
"<!--31-->Déjà un mois de passé!");

?>

1.2 Le fichier ephemeride.php

Le fichier ephemeride.php ci-dessous réalise plusieurs opérations:

<?php

$n=date("n");       /* $n contient le mois courant, de 0 à 12 */
$fichier="$n.php";  /* fabrication du nom de fichier .php contenant le tableau */
include($fichier);  /* inclut le $tableau du mois courant */

$tabmois=array("", "janvier", "février", "mars", "avril", "mai", "juin",
"juillet", "août", "septembre", "octobre", "novembre", "décembre");
$mois=$tabmois[$n];

$semaine=array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi");
$w=date("w");         /* $w contient le jour de la semaine (dimanche = 0) */
$jour= $semaine[$w];  /* $jour contient le jour de la semaine en toutes lettres */

$j=date("j");         /* $j contient le jour courant */
$texte=$tableau[$j];  /* extrait du $tableau le texte correspondant au jour courant */

echo "<html><body>
<h1>$jour $j $mois</h1>
<p>$texte<p>
</body></html>";

?>

2. Carnet de téléphone modifiable

La seconde manip est un carnet de téléphone très simple basé sur les paires clé/valeur d'un tableau associatif, sauvegardé sous forme de chaîne dans un fichier texte.

2.1 script carnet.php

Le script central est celui qui affiche les noms et les numéros de téléphone. Pour ce faire, il récupère le fichier flat.txt , qu'il découpe dans un tableau avec implode() et le séparateur: #. chaque chaîne de ce tableau contient lui-même deux champs: le nom et numéro de téléphone, séparés par § (ces caractères sont purement arbitraires, ils ne doivent pas être contenus dans les données: nom et n° de téléphone.

<?php

$handle=fopen("flat.txt","r");              /* ouvre le fichier en lecture */
$chaine=fgets($handle);              /* lit le fichier texte jusqu'au bout */
fclose($handle);       /* referme le fichier texte, $chaine reste attribué */

echo "<p><a href=\"editer.php\">Ajouter</a> ou cliquer sur un nom pour corriger</p>
<table>";

$tab=explode("#",$chaine);  /* chaine éclatée en tableau indexé; séparateur: # */

$tableau=array();  /* initialisation du tableau associatif des enregistrements */

foreach($tab as $ligne)
  {
  $personne=explode("§",$ligne); /* ligne éclatée en tableau prénom/numéro; séparateur: § */
  $tableau[$personne[0]]=$personne[1];
  echo "<tr><td><a href=\"editer.php?nom=$personne[0]\">$personne[0]</a></td>
        <td>$personne[1]</td>
        <td><a href=\"effacer.php?nom=$personne[0]\">effacer</a></td></tr>";
  }

echo "</table>
</body></html>";

?>

2.2 script editer.php

Ce fichier est celui qui édite une fiche. Soit il est appelé par le lien «ajouter», auquel cas il ne doit récupérer aucune donnée et passe directement à l'affichage html du formulaire, soit il corrige une entrée et doit d'abord récupérer le nom de la fiche à corriger, l'ensemble des données du fichier de données et puis déterminer le la paire nom/téléphone à afficher.

<?php

$nom=$_GET['nom'];
$tel=""; /* par défaut, pas de numéro de téléphone */

if($nom) /* correction d'une fiche existante */
  {
  $handle=fopen("flat.txt","r"); /* ouvre le fichier en lecture */
  $chaine=fgets($handle); /* lit le fichier texte jusqu'au bout */
  fclose($handle); /* referme le fichier texte, $chaine reste attribué */

  $tab=explode("#",$chaine); /* chaine éclatée en tableau indexé; séparateur: # */
  $tableau=array(); /* initialisation du tableau personne => numéro */

  foreach($tab as $ligne) /* réalisation du tableau  */
    {
    $personne=explode("§",$ligne); /* ligne éclatée en tableau prénom/numéro; séparateur: § */
    $tableau[$personne[0]]=$personne[1];
    }
  $tel=$tableau[$nom]; /* numéro de téléphone correspondant au nom */
  }

echo "<!DOCTYPE HTML>
<html><body>
<p>
<form action='sauver.php' method='post'>
Nom: <input name='nom' value='$nom'><br>
Tél: <input name='tel' value='$tel'><br>
<input type='submit' value='Sauver'>
</form>
</p>
</body></html>
"

?>

2.3 script sauver.php

Ce script inclut les deux champs dans le fichier flat.txt selon le cycle lecture/remplacement/tri alphabétique/écriture. Comme rien n'a été affiché par le navigateur, la dernière instruction permet la redirection vers le script carnet.php pour afficher le résultat.

<?php

$nom=$_POST['nom']; /* récupération des deux champs par la méthode POST */
$tel=$_POST['tel'];

$handle=fopen("flat.txt","r"); /* ouvre le fichier en lecture */
$chaine=fgets($handle); /* lit le fichier texte jusqu'au bout */
fclose($handle); /* referme le fichier texte, $chaine reste attribué */

$tab=explode("#",$chaine); /* chaine éclatée en tableau indexé; séparateur: # */
$tableau=array(); /* initialisation du tableau personne => numéro */

foreach($tab as $ligne) /* réalisation du tableau associatif  */
  {
  $personne=explode("§",$ligne); /* ligne éclatée en tableau prénom/numéro; séparateur: § */
  $tableau[$personne[0]]=$personne[1];
  }

$tableau[$nom]=$tel; /* ajout (si nouveau nom) ou correction du numero */

$tab=array();
foreach($tableau as $cle => $valeur) /* réalisation du tableau nom§numero */
  {
  $tab[]=$cle."§".$valeur; /* ligne recomposée nom/numéro */
  }

sort($tab); /* tri alphabétique des chaînes nom§numero */

$chaine=implode("#",$tab); /* constitution de la chaîne à sauver */

$handle=fopen("flat.txt","w"); /* ouvre le fichier en écriture */
fwrite($handle,$chaine); /* écrit le fichier texte jusqu'au bout */
fclose($handle);

header("Location: carnet.php");

?>

2.4 script effacer.php

Ce script efface l'entrée définie par le nom en regard de l'item «effacer» de la page carnet.php. Il ressemble beaucoup au script si ce n'est qu'il efface une entrée avec unset($tableau[$nom] plutôt que la corriger ou ajouter, et que le tableau n'a pas à être trié.

<?php

$nom=$_GET['nom'];

$handle=fopen("flat.txt","r");                 /* ouvre le fichier en lecture */
$chaine=fgets($handle);                 /* lit le fichier texte jusqu'au bout */
fclose($handle);          /* referme le fichier texte, $chaine reste attribué */

$tab=explode("#",$chaine); /* chaine éclatée en tableau indexé; séparateur: # */
$tableau=array();             /* initialisation du tableau personne => numéro */

foreach($tab as $ligne)                 /* réalisation du tableau associatif  */
  {
  $personne=explode("§",$ligne);   /* ligne éclatée en tableau prénom/numéro; */
  $tableau[$personne[0]]=$personne[1];
  }

unset($tableau[$nom]);  /* effacer une occurrence */

$tab=array();
foreach($tableau as $cle => $valeur) /* réalisation du tableau nom§numero */
  {
  $tab[]=$cle."§".$valeur; /* ligne recomposée nom/numéro */
  }

$chaine=implode("#",$tab); /* constitution de la chaîne à sauver */

$handle=fopen("flat.txt","w"); /* ouvre le fichier en écriture */
fwrite($handle,$chaine); /* lit le fichier texte jusqu'au bout */
fclose($handle);

header("Location: carnet.php");

?>

Le résultat n'est pas parfait!