2010-moteur-site-simple/cms2/code/bdd.php
2010-10-11 00:03:14 +02:00

160 lines
5.4 KiB
PHP

<?php
// Le widget w_img doit gérer le stockage de l'image dans un dossier, la création de la miniature et le stockage dans la BDD du chemin vers l'image.
/*
Base de données :
table page (uid autoincrement primary key, nomSysteme, composantUrl, parent)
Racine : (?,'racine','',NULL)
table propriétés(uid auto pk, fk uid_page, bool systeme, nom, valeur)
(?,true,dateCréation,?)
(?,true,dateModification,?)
(?,false,publier,?)
(?,true,nomSysteme,?)
(?,true,composantUrl,?)
*/
// Lors d'une requête, ne renvoyer que les éléments que l'utilisateur a
// le droit de voir. Filtrage après la requête (attention au LIMIT et OFFSET !) ?
// ou y a-t-il moyen d'exprimer ça directement dans la requête ?
class BDD {
private static $handle = null;
public static function get() {
if (!is_resource(self::$handle)) {
self::$handle = @mysql_connect(
Config::get('db_hôte'),
Config::get('db_utilisateur'),
Config::get('db_mot_de_passe')
);
if (!is_resource(self::$handle)) {
Debug::error("Échec à la connexion à la base de données");
}
self::init();
}
return self::$handle;
}
// ATTENTION : Ré-initialise toute la base de données !!!
public static function reset() {
self::unbuf_query('drop table if exists ' . self::table("pages"));
self::unbuf_query('drop table if exists ' . self::table("enfants"));
self::unbuf_query('drop table if exists ' . self::table("proprietes"));
self::init();
}
public static function init() {
self::unbuf_query("create database if not exists " . Config::get('db_base'));
mysql_select_db(Config::get('db_base'), self::$handle) or Debug::sqlerror();
self::unbuf_query('create table if not exists ' . self::table("pages") . ' ('
. 'uid_page integer auto_increment primary key'
. ')');
self::unbuf_query('create table if not exists ' . self::table("enfants") . ' ('
. 'uid_page integer,'
. 'uid_page_parent integer,'
. 'groupe char(10)'
. ')');
self::unbuf_query('create table if not exists ' . self::table("proprietes") . ' ('
. 'uid_prop integer auto_increment primary key,'
. 'uid_page integer,'
. 'systeme bool,'
. 'nom char(30),'
. 'valeur char'
.')');
self::test();
}
public static function test() {
// Insertion de la racine :
self::modify("insert into " . self::table("pages") . " values(0)");
self::modify("insert into " . self::table("proprietes") . " values(0, 0, true, 'date_creation', 0)");
self::modify("insert into " . self::table("proprietes") . " values(0, 0, true, 'date_modification', 0)");
self::modify("insert into " . self::table("proprietes") . " values(0, 0, true, 'publier', 'true')");
self::modify("insert into " . self::table("proprietes") . " values(0, 0, true, 'nom_systeme', 'racine')");
self::modify("insert into " . self::table("proprietes") . " values(0, 0, true, 'composant_url', '')");
}
public static function unbuf_query($q) {
debug::info("sql : " . $q . ";");
mysql_unbuffered_query($q . ";", self::get()) or Debug::sqlerror();
}
public static function select($cols, $table, $filter = "") {
$q = "select $cols from " . self::table($table) . " $filter;";
debug::info("sql : " . $q);
$qres = mysql_query($q, self::get()) or Debug::sqlerror();
$ret = array();
while ($row = mysql_fetch_array($qres)) {
$ret[] = $row;
}
return $ret;
}
public static function modify($q) {
debug::info("sql : $q;");
mysql_query($q . ";", self::get()) or Debug::sqlerror();
}
public static function table($nom) {
return Config::get('db_prefixe') . $nom;
}
public static function close() {
mysql_close(self::get()) or Debug::sqlerror();
self::$handle = null;
}
}
/*
class DB extends Selectable {
private static $handle = null;
public function __construct() {
if (self::$handle === null) {
niy("Connexion à la BDD");
} else {
return self::$handle;
}
}
}
class Selectable {
// TODO : comment faire un select sur la table page ?
// TODO : comment créer une nouvelle page ?
function select($qw_champs, $qw_ordre = "", $limit = 0, $offset = 0) {
// Retourne un selectable, qui a une méthode run() (la méthode run renvoie la liste d'éléments. Chaque élément a une méthode set()).
// Une limit de 0 signifie qu'on prend tous les éléments à partir de $offset.
}
function set($valeur, $qw_champs) {
// Appelle set(valeur) sur chaque élément de $this->select(champs, ordre, 0, 0)->run()
}
function set_with_uid($valeur, int $uid) {
// Appelle set(valeur) sur la ligne de la base de données avec cet uid.
// Les <form> des pages ont des champ <input type="hidden" name"_uid_"> et un bouton submit.
// Lorsqu'on active ce submit, les lignes correspondant aux _uid_ dans la base de données reçoivent la bonne valeur.
}
function sql() {
}
function add_setter($condition, $fonction_setter) {
// Si on fait un set qui remplit la condition, la fonction_setter est appellée au lieu de modifier directement la bdd.
// Condition peut être :
// true // toujours appellé (pour les permissions, les dates de modification etc.).
// type de page parente // lorsqu'on récupère la liste des enfants d'une page de ce type.
// type de page, nom attribut // lorsqu'on récupère cet attribut d'une page de ce type.
}
function add_getter($condition, $fonction_getter) {
// Comme add_setter().
}
}
*/
?>