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.
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é :
<?
// 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) :
<?
// 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 2: $errmsg = "Mots de passe bdd différents"; break;
case 3: $errmsg = "Aucune 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> </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="dbpass1">Mot de passe base</label>
<input type="password" id="dbpass1" name="DBPASSWD" value="<?= DBPASSWD?>"></p>
<p>
<label for="dbpass2">Répéter</label>
<input type="password" id="dbpass2" name="f_dbpwd" value="<?= DBPASSWD?>"></p>
<p>
<label> </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 :
<?
// 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;
// mots de passe bdd différents
if($_POST['DBPASSWD'] != $_POST['f_dbpwd']) $msg = 2;
// 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 constantes
fwrite($fichier, "\$ladate = time();\n");
fwrite($fichier, "\$lapage = basename(\$_SERVER['PHP_SELF']);\n");
// écriture du mot de passe
fwrite($fichier, "\$adminpwd = \"$new_pwd\";\n");
// et des autres variables
foreach($_POST as $key=>$val) {
// passer certaines entrées de formulaire (préfixées par 'f_')
if(ereg("f_",$key)) continue;
// traitement des constantes (en majuscule)
elseif(ereg("DB",$key)) fwrite($fichier, "define(\"$key\", \"$val\");\n");
// traitement des variables numériques ou booléennes en valeur
elseif(is_numeric($val) || ereg("(true|false)",$val)) fwrite($fichier, "\$$key = $val;\n");
// sinon entre guillemets
elseif(!empty($val)) fwrite($fichier, "\$$key = \"".ereg_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");
?>
Excellent, ca faisait longtemps que je cherchai ce genre de chose.
ca va bien m'aider pour mon site : www.seebz.be
http://dev.ppan.net [Document mis à jour le 05.04.2007]