PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/db.php

https://github.com/romainhk/ABULE
PHP | 373 lines | 307 code | 25 blank | 41 comment | 59 complexity | 21727d2c791a4197cda59839fe114373 MD5 | raw file
  1. <?php
  2. /*
  3. * Connexion à la base de données
  4. */
  5. $les_champs = array( 'niveau', 'ordre', 'contenu' ); // Les champs accessibles de la table "page"
  6. $mycnf = parse_ini_file("../mycnf");
  7. $db = mysql_connect($mycnf['host'], $mycnf['user'], $mycnf['password']);
  8. unset($mycnf);
  9. if (!$db) {
  10. die('Imposible de se connecter à la base : '.mysql_error($db));
  11. }
  12. mysql_select_db('labulefr_site', $db);
  13. mysql_query('SET NAMES UTF8', $db);
  14. /*
  15. * Fonction d'accès à la BDD #######################
  16. */
  17. // Ajoute une page dans la BDD
  18. function bdd_sauvegarder($db, $nom, $pere, $ordre, $contenu, $forcer=FALSE) {
  19. // $forcer permet de forcer la mise à jour si la page existe déjà
  20. $contenu = preg_replace("/<?php.*?>/", '', $contenu);
  21. $san_contenu = htmlspecialchars($contenu);
  22. if (!empty($pere)) {
  23. $niveau = bdd_get($db, 'niveau', $pere) + 1;
  24. } else {
  25. $niveau = 1;
  26. }
  27. $req = 'INSERT INTO page (nom, niveau, ordre, contenu) VALUES ("'.addslashes($nom).'", '.$niveau.', '.$ordre.', "'.$san_contenu.'")';
  28. $ret = mysql_query($req, $db);
  29. if (!$ret) {
  30. if (mysql_errno($db) == 1062 and $forcer) {
  31. $s = bdd_modifier($db, $nom, $pere, $niveau, $ordre, $san_contenu);
  32. if ($s) { return $s; }
  33. } else {
  34. if (!$forcer) { # la page existe dégà
  35. return "La page «".$nom."» existe déjà. Ajout interrompu";
  36. } else {
  37. return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db);
  38. }
  39. }
  40. } else {
  41. bdd_logger($db, 'Ajout de : '.$nom);
  42. if ($niveau > 1) {
  43. menu_modifier_fils($db, $pere, $nom, 'ajouter');
  44. }
  45. menu_regenerer($db);
  46. }
  47. return FALSE;
  48. }
  49. // Modifier une page dans la BDD
  50. function bdd_modifier($db, $nom, $pere, $niveau, $ordre, $contenu) {
  51. $req = 'UPDATE page SET contenu="'.$contenu.'", niveau='.$niveau.', ordre='.$ordre.' WHERE nom="'.addslashes($nom).'"';
  52. $ret = mysql_query($req, $db);
  53. if (!$ret) {
  54. return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db);
  55. }
  56. bdd_logger($db, 'Modification de : '.$nom);
  57. menu_modifier_fils($db, menu_pere($db, $nom), $nom, 'retirer');
  58. menu_modifier_fils($db, $pere, $nom, 'ajouter');
  59. menu_regenerer($db);
  60. return FALSE;
  61. }
  62. // Récupérer une page depuis la BDD
  63. function bdd_charger($db, $nom) {
  64. $get = bdd_get($db, 'contenu', $nom);
  65. return htmlspecialchars_decode($get);
  66. }
  67. // Supprimer une page
  68. function bdd_supprimer($db, $nom) {
  69. if (strcmp($nom, '')) {
  70. if (bdd_get($db, 'niveau', $nom)) { # On vérifie que la page existe
  71. $req = 'DELETE FROM page WHERE nom="'.addslashes($nom).'"';
  72. $ret = mysql_query($req, $db)
  73. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  74. bdd_logger($db, 'Suppression de : '.$nom);
  75. menu_modifier_fils($db, menu_pere($db, $nom), $nom, 'retirer');
  76. menu_regenerer($db);
  77. return FALSE;
  78. } else {
  79. return "Impossible de supprimer la page $nom";
  80. }
  81. } else return "Aucune page sélectionnée";
  82. }
  83. // Renommer une page
  84. function bdd_renommer($db, $page, $nouv) {
  85. $req = 'UPDATE page SET nom="'.addslashes($nouv).'" WHERE nom="'.addslashes($page).'"';
  86. $ret = mysql_query($req, $db)
  87. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  88. bdd_logger($db, 'Renommage de "'.$page.'" en : '.$nouv);
  89. // Remplacement par le nouveau père
  90. $pere = menu_pere($db, $page);
  91. if (!empty($pere)) {
  92. menu_modifier_fils($db, $pere, $page, 'retirer');
  93. menu_modifier_fils($db, $pere, $nouv, 'ajouter');
  94. }
  95. // Renommage pour les fils aussi
  96. $lf = menu_les_fils($db, $page);
  97. while ($f = array_pop($lf)) {
  98. menu_modifier_fils($db, $page, $f['nom'], 'retirer');
  99. menu_modifier_fils($db, $nouv, $f['nom'], 'ajouter');
  100. }
  101. menu_regenerer($db);
  102. }
  103. // Déplacer une page
  104. function bdd_deplacer($db, $page, $nvpere, $ordre) {
  105. $niveau = bdd_get($db, 'niveau', $nvpere) + 1;
  106. if ($niveau > 0 && $niveau < 4) {
  107. $req = 'UPDATE page SET niveau='.$niveau.', ordre='.$ordre.' WHERE nom="'.addslashes($page).'"';
  108. $ret = mysql_query($req, $db)
  109. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  110. bdd_logger($db, 'Déplacement de "'.$page.'" sous : '.$nvpere);
  111. $pere = menu_pere($db, $page);
  112. menu_modifier_fils($db, $pere, $page, 'retirer');
  113. menu_modifier_fils($db, $nvpere, $page, 'ajouter');
  114. menu_regenerer($db);
  115. }
  116. }
  117. // Archiver une page
  118. function bdd_archiver($db, $nom, $annee) {
  119. if (bdd_get($db, 'niveau', $nom)) {
  120. $contenu = bdd_charger($db, $nom);
  121. $req = 'INSERT INTO archives (nom, annee, contenu) VALUES ("'.addslashes($nom).'", '.$annee.', "'.$contenu.'")';
  122. $ret = mysql_query($req, $db);
  123. if (!$ret) { return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db); }
  124. $ret = bdd_supprimer($db, $nom);
  125. if ($ret) { return $ret; }
  126. bdd_logger($db, 'Archivage de "'.$nom.'" ('.$annee.')');
  127. menu_modifier_fils($db, menu_pere($db, $nom), $nom, 'retirer');
  128. menu_regenerer($db);
  129. } else {
  130. return 'Page "'.$nom.'" inexistante';
  131. }
  132. return FALSE;
  133. }
  134. // Donne les archives
  135. function bdd_les_archives($db, $annee=0) {
  136. $arch = array();
  137. $where = '';
  138. if ($annee != 0) { $where = "WHERE annee=$annee"; }
  139. $req = "SELECT nom, annee, contenu FROM archives $where ORDER BY annee";
  140. $ret = mysql_query($req, $db);
  141. while ($row = mysql_fetch_array($ret)) {
  142. array_push($arch, array('nom' => $row['nom'], 'annee' => $row['annee'], 'contenu' => $row['contenu']));
  143. }
  144. return $arch;
  145. }
  146. // Donne les annees présentes dans les archives
  147. function bdd_les_annees_en_archive($db) {
  148. $arch = array();
  149. $req = "SELECT DISTINCT annee FROM archives ORDER BY annee";
  150. $ret = mysql_query($req, $db);
  151. while ($row = mysql_fetch_row($ret)) {
  152. array_push($arch, $row[0]);
  153. }
  154. return $arch;
  155. }
  156. // Récupérer les infos d'une page
  157. function bdd_get($db, $champ, $nom) {
  158. global $les_champs;
  159. if (in_array($champ, $les_champs)) {
  160. $req = 'SELECT '.$champ.' FROM page WHERE nom="'.addslashes($nom).'"';
  161. $ret = mysql_query($req, $db)
  162. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  163. $f = mysql_fetch_row($ret);
  164. if (isset($f[0])) {
  165. return $f[0];
  166. }
  167. }
  168. return FALSE;
  169. }
  170. // Liste des fils d'une page
  171. function menu_les_fils($db, $page) {
  172. $fils = array();
  173. $req = 'SELECT fils, niveau, ordre FROM parente as p, page WHERE page="'.addslashes($page).'" AND p.fils=page.nom ORDER BY ordre ASC';
  174. $ret = mysql_query($req, $db)
  175. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  176. while ($row = mysql_fetch_array($ret)) {
  177. array_push($fils, array('nom' => $row['fils'], 'niveau' => $row['niveau'], 'ordre' => $row['ordre']));
  178. }
  179. return $fils;
  180. }
  181. /*
  182. * Admin et utilisateurs
  183. */
  184. // Créer un nouvel utilisateur
  185. function bdd_creer_utilisateur($db, $login, $mdp, $admin=0) {
  186. if ($_SESSION['admin']) {
  187. if ($admin != 1) { $admin = 0; }
  188. $req = 'INSERT INTO utilisateur (login, mdp, admin) VALUES ("'.$login.'", "'.sha1($mdp).'", "'.$admin.'")';
  189. $ret = mysql_query($req, $db);
  190. if ($ret) {
  191. if ($admin) { $mode = "Administrateur ";
  192. } else { $mode = "Utilisateur "; }
  193. return $mode.$login." créé";
  194. bdd_logger($db, 'Création du compte '.strtolower($mode).' '.$login);
  195. } else {
  196. return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db);
  197. }
  198. } else { return "Création de compte interdite avec ce compte"; }
  199. }
  200. // Supprimer un admin
  201. function bdd_supprimer_utilisateur($db, $login) {
  202. if ($_SESSION['admin']) {
  203. $req = 'DELETE FROM utilisateur WHERE login="'.$login.'"';
  204. $ret = mysql_query($req, $db);
  205. if ($ret) {
  206. return "Utilisateur ".$login." supprimé";
  207. bdd_logger($db, 'Suppression du compte '.$login);
  208. } else {
  209. return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db);
  210. }
  211. } else { return "Suppression de compte interdite avec ce compte"; }
  212. }
  213. // Liste des admins
  214. function bdd_liste_utilisateur($db) {
  215. $req = 'SELECT login FROM utilisateur';
  216. $ret = mysql_query($req, $db);
  217. if ($ret) {
  218. $r = array();
  219. while($row = mysql_fetch_array($ret)) {
  220. array_push($r, $row['login']);
  221. }
  222. return $r;
  223. } else {
  224. return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db);
  225. }
  226. }
  227. // Permet à un admin de changer son mot de passe
  228. function bdd_changer_mdp($db, $login, $mdp) {
  229. $req = 'UPDATE utilisateur SET mdp="'.sha1($mdp).'" WHERE login="'.$login.'"';
  230. $ret = mysql_query($req, $db);
  231. if ($ret) {
  232. bdd_logger($db, $login.' a modifié son mot de passe');
  233. return '';
  234. } else {
  235. return "Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db);
  236. }
  237. }
  238. /* Journal
  239. */
  240. // Enregistre l'opération au journal
  241. function bdd_logger($db, $message) {
  242. session_start();
  243. $req = 'INSERT INTO log (login, message) VALUES ("'.$_SESSION['login'].'", "'.addslashes($message).'")';
  244. $ret = mysql_query($req, $db);
  245. return $ret;
  246. }
  247. // Journal des modifications récentes
  248. function bdd_journal($db, $nb=10) {
  249. $r = array();
  250. $req = 'SELECT * FROM log ORDER BY id DESC LIMIT 0,'.$nb;
  251. $ret = mysql_query($req, $db)
  252. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  253. while($row = mysql_fetch_array($ret)) {
  254. array_push($r, $row);
  255. }
  256. return $r;
  257. }
  258. /*
  259. * Gestion du Menu #######################
  260. */
  261. // Mettre à jour le menu.html
  262. function menu_regenerer($db) {
  263. $elems = array();
  264. $req = 'SELECT page.nom, page.ordre, f.ordre as ordfils, p.fils as fils FROM page'
  265. .' LEFT JOIN parente as p ON p.page=page.nom LEFT JOIN page as f'
  266. .' ON f.nom=p.fils WHERE page.niveau=1 ORDER BY page.ordre, f.ordre';
  267. $ret = mysql_query($req, $db)
  268. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  269. $menu = '';
  270. while ($row = mysql_fetch_assoc($ret)) {
  271. $nom = $row['nom'];
  272. if (!in_array($nom, $elems)) {
  273. if (count($elems) > 0) {
  274. $menu .= "</ul>\n";
  275. }
  276. array_push($elems, $nom);
  277. $menu .= '<h2><a href="?page='.protect_url($nom).'">'.$nom."</a></h2>\n<ul>";
  278. }
  279. $fils = $row['fils'];
  280. $menu .= '<li><a href="?page='.protect_url($fils).'">'.$fils."</a></li>\n";
  281. }
  282. $menu .= "</ul>";
  283. // Écriture
  284. $fmenu = fopen('uploads/menu.html', 'w');
  285. fputs($fmenu, $menu);
  286. fclose($fmenu);
  287. }
  288. // Donne le père d'une page
  289. function menu_pere($db, $page) {
  290. $req = 'SELECT page FROM parente WHERE fils LIKE "%'.addslashes($page).'%" ESCAPE "\\\\"';
  291. $ret = mysql_query($req, $db)
  292. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  293. $f = mysql_fetch_row($ret);
  294. if (isset($f[0])) {
  295. return $f[0];
  296. } else {
  297. return '';
  298. }
  299. }
  300. // Liste des éléments pères du menu
  301. function menu_les_peres($db, $niveaux) {
  302. $peres = array();
  303. $niveau = 'niveau='.array_pop($niveaux);
  304. foreach ($niveaux as $n) {
  305. $niveau = $niveau.' OR niveau='.$n;
  306. }
  307. $req = 'SELECT nom, ordre, niveau FROM page WHERE '.$niveau.' ORDER BY ordre ASC';
  308. $ret = mysql_query($req, $db)
  309. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  310. while ($row = mysql_fetch_array($ret)) {
  311. $pair = array('nom' => $row['nom'], 'niveau' => $row['niveau'], 'ordre' => $row['ordre']);
  312. array_push($peres, $pair);
  313. }
  314. return $peres;
  315. }
  316. // Donne une liste ordonnée des pages
  317. function menu_ordonne($db, $peres, $niveau) {
  318. if ((!isset($peres) or empty($peres)) && $niveau == 1) {
  319. $peres = menu_les_peres($db, array(1));
  320. }
  321. $rep = array();
  322. foreach ($peres as $l) {
  323. array_push($rep, array('nom' => $l['nom'], 'niveau' => $l['niveau'], 'ordre' => $l['ordre']));
  324. if ($niveau < 3) {
  325. foreach (menu_ordonne($db, menu_les_fils($db, $l['nom']), $niveau+1) as $m) {
  326. array_push($rep, $m);
  327. }
  328. }
  329. }
  330. return $rep;
  331. }
  332. // Ajoute/retire la page au pere
  333. function menu_modifier_fils($db, $pere, $page, $modif='ajouter') {
  334. #echo $pere."****".$page.'----'.$modif.'<br/>';
  335. if (!empty($pere)) {
  336. switch($modif) {
  337. case 'ajouter':
  338. $req = 'INSERT INTO parente(page, fils) VALUES ("'.addslashes($pere).'", "'.addslashes($page).'")';
  339. break;
  340. case 'retirer':
  341. $req = 'DELETE FROM parente WHERE page="'.addslashes($pere).'" AND fils="'.addslashes($page).'"';
  342. break;
  343. }
  344. $ret = mysql_query($req, $db)
  345. or die("Erreur dans la requête ".mysql_errno($db)." : ".mysql_error($db));
  346. }
  347. }
  348. ?>