Gérer la configuration d'un site web

Pourquoi faire appel à une base de données pour extraire systématiquement des paramètres qui changent peu ou pas ? En dehors d'une gestion de cache, il est très simple de concevoir une interface gérant un fichier inc.config.php, inclu en toutes pages.

Définir ses besoins

Considérant que l'adresse email est nécessaire au formulaire d'un site, ou encore les paramètres d'une base de données, voici le fichier qui sera inclu dans toutes les pages (où il est nécessaire) automatiquement généré :

inc.config.php

<?
// Paramètres générés par /config-modif.php
// Source Pierre Pesty http://dev.ppan.net
$ladate = time();
$lapage = basename($_SERVER['PHP_SELF']);
$adminpwd = "piRBQ5eEvddRQ";
$username = "pierre";
$usermail = "abuse@wanadoo.fr";
define("DBHOST", "localhost");
define("DBNAME", "pierre");
define("DBUSER", "root");
define("DBPASSWD", "");
?>

Voici maintenant le fichier config.php qui permet d'éditer ses variables (avec sa feuille de styles) :

config.php

<?
// récupération des variables
include('inc.config.php');
// traitement d'une erreur éventuelle (via config-modif.php)
// ajouter autant de traitements que de variables requises
switch($_GET['msg']) {
	case 1: $errmsg = "Mots de passe admin différents"; break;
	case 3: $errmsg = "Aucun nom d'utilisateur"; break;
	case 4: $errmsg = "Email invalide ou vide"; break;
	case 7: $errmsg = "Problème d'écriture du fichier inc.config.php"; break;
	case 8: $errmsg = "Fichier inc.config.php modifié !"; break;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Gestion config</title>
<meta name="author" content="Pierre Pesty">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="webdev_form.css" type="text/css" rel="stylesheet">
</head>
<body>
<form method="post" action="config-modif.php">
<!-- ancien mot de passe (crypté) par défaut -->
<input type="hidden" name="f_oldpwd" value="<?= $adminpwd?>">
<?
// si erreur
if(isset($errmsg))
	echo "<p><label>&nbsp;</label>$errmsg</p>\n";
?>
<p>
<label for="username">Nom</label>
<input id="username" name="username" value="<?= $username?>"></p>
<p>
<label for="pass1">Mot de passe (si modifié)</label>
<input type="password" id="pass1" name="f_pass1"></p>
<p>
<label for="pass2">Répéter</label>
<input type="password" id="pass2" name="f_pass2"></p>
<p>
<label for="email">Email</label>
<input id="email" name="email" value="<?= $email?>"></p>
<p>
<label for="host">Hôte MySQL</label>
<input id="host" name="DBHOST" value="<?= DBHOST?>"></p>
<p>
<label for="dbname">Nom de la base</label>
<input id="dbname" name="DBNAME" value="<?= DBNAME?>"></p>
<p>
<label for="dbuser">Nom utilisateur base</label>
<input id="dbuser" name="DBUSER" value="<?= DBUSER?>"></p>
<p>
<label for="dbpass">Mot de passe base</label>
<input type="password" id="dbpass" name="DBPASSWD" value="<?= DBPASSWD?>"></p>
<p>
<label>&nbsp;</label>
<input id="submit" type="submit" value="Submit"></p>
</form>
</body>
</html>

Reste à modifier le fichier inc.config.php avec les instructions qui vont bien :

config-modif.php

<?
// fonction de vérification d'email
function checkmail($email) {
	if(!preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*\.([a-z]{2,4})$`',$email)) Return false;
	Return true;
}
$msg = 0;
// mots de passe admin différents
if($_POST['f_pass1'] != $_POST['f_pass2']) $msg = 1;
// nom admin vide
if(empty($_POST['username'])) $msg = 3;
// email invalide
if(empty($_POST['email']) || !checkmail($_POST['email'])) $msg = 4;
if($msg) {
	// $msg > 0 donc on revient à l'édition
	header("Location: config.php?msg=$msg");
	exit;
}
if(empty($_POST['f_pass1']))
	// mot de passe non modifié en l'état
	$new_pwd = $_POST['f_oldpwd'];
else
	// ou nouveau mot de passe crypté
	$new_pwd = crypt($_POST['f_pass1'],$_POST['username']);
// ouverture en écriture du fichier inc.config.php
if(!$fichier = @fopen('inc.config.php', 'w')) {
	// si erreur on revient vers l'édition
	header("Location: config.php?msg=7");
	exit;
}
// en-tête du fichier
fwrite($fichier, "<?\n// Paramètres générés par ".$_SERVER['PHP_SELF']."\n");
fwrite($fichier, "// Source Pierre Pesty http://dev.ppan.net\n");
// écriture de variables fixes
fwrite($fichier, "\$ladate = time();\n");
fwrite($fichier, "\$lapage = basename(\$_SERVER['PHP_SELF']);\n");
fwrite($fichier, "\$adminpwd = \"$new_pwd\";\n");
// écriture des variables du formulaire
foreach($_POST as $key=>$val) {
	// passer certaines entrées de formulaire (préfixées par 'f_')
	if(strstr($key,"f_")) continue;
	// traitement des constantes (en majuscule)
	elseif(strstr($key,"DB")) fwrite($fichier, "define(\"$key\", \"$val\");\n");
	// traitement des variables numériques ou booléennes en valeur
	elseif(is_numeric($val) || preg_match("/true|false/",$val)) fwrite($fichier, "\$$key = $val;\n");
	// sinon entre guillemets
	elseif(!empty($val)) fwrite($fichier, "\$$key = \"".preg_replace("/[\n|\r|\r\n]+/", " ", trim($val))."\";\n");
}
// tag PHP
fwrite($fichier, "?>\n");
// fermeture du fichier
fclose($fichier);
// retour à l'édition
header("Location: config.php?msg=8");
?>

http://dev.ppan.net [Haut de page]