diff --git a/cms2/code/TODO b/cms2/code/TODO index 2365bb2..f24c98a 100644 --- a/cms2/code/TODO +++ b/cms2/code/TODO @@ -4,4 +4,4 @@ ElementDocument, et GalerieIndex::res_c_style() renvoie du texte (CSS) pour inclusion dans le CSS principal... alors que res_c_style_supplémentaire() fait je-sais-pas-quoi... - Comment gérer tout ça ? Selon le type de ressource on envoie direct ou on récupère (html,css => récup, img => envoi). \ No newline at end of file + Comment gérer tout ça ? Selon le type de ressource on envoie direct ou on récupère (html,css => récup, img => envoi). diff --git a/cms2/code/bdd.php b/cms2/code/bdd.php index 112b99f..bf27be1 100644 --- a/cms2/code/bdd.php +++ b/cms2/code/bdd.php @@ -31,6 +31,7 @@ class BDD { if (!is_resource(self::$handle)) { Debug::error("Échec à la connexion à la base de données"); } + self::begin_transaction(); self::init(); } return self::$handle; @@ -43,7 +44,6 @@ class BDD { 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(); @@ -75,15 +75,22 @@ class BDD { self::modify("insert into " . self::table("proprietes") . " values(0, 0, true, 'composant_url', '')"); } + public static function begin_transaction() { + self::unbuf_query('begin'); + } + + public static function commit() { + self::unbuf_query('commit'); + } + 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;"; + public static function select($q) { debug::info("sql : " . $q); - $qres = mysql_query($q, self::get()) or Debug::sqlerror(); + $qres = mysql_query($q, BDD::get()) or Debug::sqlerror(); $ret = array(); while ($row = mysql_fetch_array($qres)) { $ret[] = $row; @@ -101,14 +108,15 @@ class BDD { } public static function close() { - mysql_close(self::get()) or Debug::sqlerror(); - self::$handle = null; + if (is_resource(self::$handle)) { + self::commit(); + mysql_close(self::get()) or Debug::sqlerror(); + self::$handle = null; + } } } - - - /* +/* class DB extends Selectable { private static $handle = null; @@ -155,6 +163,6 @@ class Selectable { } } - */ +*/ ?> \ No newline at end of file diff --git a/cms2/code/page.php b/cms2/code/page.php index 8e1f03f..71010fc 100644 --- a/cms2/code/page.php +++ b/cms2/code/page.php @@ -74,14 +74,46 @@ class Page { public function enfants($condition = true, $ordre = "date_creation desc", $limit = 0, $offset = 0) { // Renvoie un objet de la classe CollectionPages. // Si $condition === true, il n'y a pas de condition - // ex: $condition = "@apercu = true" + // sinon, par ex: $condition = "@apercu = true" // ordre = null => ordre = "date_creation desc" // limit = null || limit = 0 => pas de limite // offset = null => offset = 0 - var_dump(BDD::select("uid_page", "enfants", "where uid_page_parent = " . $this->uid())); + + // Deux possibilités : + // 1) On select tous les rangs qui correspondent à une des $condition, + // puis on group by having count(uid_page) = . + // 2) On met chaque "type" (galerie-index, ...) dans une table séparée, + // et on a une table des types. On select dans cette table des types + // les tables qui ont les champs sur lesquels portent les conditions, + // puis on construit une requête comme suit : + // select * from (select uid_page, prop_cond_1, prop_cond_2 from table_1) + // union (select uid_page, prop_cond_1, prop_cond_2 from table_2) + // union (... table_3) + // ... where prop_cond_1 = val_cond_1 and prop_cond_2 = val_cond_2; + + // Tous les enfants + $select = "select uid_page from " . BDD::table("enfants") . " where uid_page_parent = " . $this->uid(); + + if ($condition !== true) { + // Toutes les propriétés des enfants + $select = "select$distinct uid_page from " . BDD::table("proprietes") . " where uid_page in (" . $select . ")"; + // Liste des conditions : + $select .= "and ("; + $firstcond = true; + foreach ($conditions as $c) { + if (!$firstcond) { + $select .= " or "; + } + $select .= "(nom = '" . mysql_real_escape_string($c["cle"]) . "' and valeur = '" . mysql_real_escape_string($c["valeur"]) . "')"; + $firstcond = false; + } + $select .= ") group by uid_page having count(uid_page) = " . count($conditions); + } + + var_dump(BDD::select($select . ";")); niy("enfants__"); } - + public function ajouter_enfant($type, $groupe = "main") { // ajouter l'enfant // renvoyer une instance de la sous-classe de Page correspondant à $type.