/** * Créer les tables de la base d'une structure et les remplir * * @param void * @return void */ public static function DB_creer_remplir_tables_structure() { $tab_files = FileSystem::lister_contenu_dossier(CHEMIN_DOSSIER_SQL_STRUCTURE); foreach($tab_files as $file) { $extension = pathinfo($file,PATHINFO_EXTENSION); if($extension=='sql') { $requetes = file_get_contents(CHEMIN_DOSSIER_SQL_STRUCTURE.$file); DB::query(SACOCHE_STRUCTURE_BD_NAME , $requetes ); // Attention, sur certains LCS ça bloque au dela de 40 instructions MySQL (mais un INSERT multiple avec des milliers de lignes ne pose pas de pb). /* La classe PDO a un bug. Si on envoie plusieurs requêtes d'un coup ça passe, mais si on recommence juste après alors on récolte : "Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute." La seule issue est de fermer la connexion après chaque requête multiple en utilisant exceptionnellement la méthode ajouté par SebR suite à mon signalement : DB::close(nom_de_la_connexion); */ DB::close(SACOCHE_STRUCTURE_BD_NAME); } } }
/** * restaurer_tables_base_etablissement * Restaurer des fichiers de svg et mettre la base à jour si besoin. * Pour une restauration individuelle, scindé en plusieurs étapes pour éviter un dépassement du max_execution_time sur de grosses bases. * Par contre pour une restauration par un webmestre d'un ensemble de structures, c'était trop compliqué à découper, on fait tout d'un coup. * * @param string $dossier_temp * @param int $etape (0 si tout d'un coup) * @return string */ function restaurer_tables_base_etablissement($dossier_temp, $etape) { // Pour chaque fichier... $tab_fichier = FileSystem::lister_contenu_dossier($dossier_temp); natsort($tab_fichier); // Si plusieurs fichiers correspondent à une table, il faut que la requête de création soit lancée avant les requêtes d'insertion $tab_fichier = array_values($tab_fichier); // Pour réindexer dans l'ordre et à partir de 0 $nb_fichiers = count($tab_fichier); if ($etape) { $nb_par_etape = 10; $i_min = ($etape - 1) * $nb_par_etape; $i_max = $etape * $nb_par_etape; $i_stop = min($i_max, $nb_fichiers); } else { $i_min = 0; $i_stop = $nb_fichiers; } for ($i = $i_min; $i < $i_stop; $i++) { $fichier_nom = $tab_fichier[$i]; // ... lancer les requêtes $requetes = file_get_contents($dossier_temp . $fichier_nom); DB_STRUCTURE_COMMUN::DB_executer_requetes_MySQL($requetes); // Attention, sur certains LCS ça bloque au dela de 40 instructions MySQL (mais un INSERT multiple avec des milliers de lignes ne pose pas de pb). /* La classe PDO a un bug. Si on envoie plusieurs requêtes d'un coup ça passe, mais si on recommence juste après alors on récolte : "Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute." La seule issue est de fermer la connexion après chaque requête multiple en utilisant exceptionnellement la méthode ajouté par SebR suite à mon signalement : DB::close(nom_de_la_connexion); */ DB::close(SACOCHE_STRUCTURE_BD_NAME); } if ($i_stop < $nb_fichiers) { // Ce n'est pas la dernière étape return 'Restauration de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée'; } else { // Toutes les étapes sont terminées ; tester si la base nécessite une mise à jour, et si oui alors la lancer $version_base_restauree = version_base_fichier_svg($dossier_temp); if ($version_base_restauree < VERSION_BASE_STRUCTURE) { DB_STRUCTURE_MAJ_BASE::DB_maj_base($version_base_restauree); // Log de l'action SACocheLog::ajouter('Mise à jour automatique de la base ' . SACOCHE_STRUCTURE_BD_NAME . '.'); return 'Restauration de la base terminée et base mise à jour'; } return 'Restauration de la base terminée'; } }
// Pas de traduction car pas de choix de langue pour ce profil. ?> <?php // Activation du débogueur $lignes_debug = ''; $tab_debug = array('PHP' => 'afficher toutes les erreurs PHP <span class="now">déconseillé en production</span>', 'PHPCAS' => 'enregistrer les dialogues avec le serveur CAS <span class="now">le fichier peut vite gonfler → décocher une fois les tests terminés</span>', 'SQL' => 'console FirePHP → résultats des requêtes SQL <span class="now">double le besoin en mémoire → risqué pour les générations de bilans</span>', 'SESSION' => 'console FirePHP → valeurs de $_SESSION <span class="now">diminue la sécurité en rendant accessible certaines informations</span>', 'POST' => 'console FirePHP → valeurs de $_POST', 'GET' => 'console FirePHP → valeurs de $_GET', 'FILES' => 'console FirePHP → valeurs de $_FILES', 'COOKIE' => 'console FirePHP → valeurs de $_COOKIE <span class="now">diminue la sécurité en rendant accessible certaines informations</span>', 'SERVER' => 'console FirePHP → valeurs de $_SERVER <span class="now">diminue la sécurité en rendant accessible certaines informations</span>', 'CONST' => 'console FirePHP → valeurs des constantes PHP <span class="now">diminue la sécurité en rendant accessible certaines informations</span>'); foreach ($tab_debug as $debug_mode => $debug_texte) { $checked = constant('DEBUG_' . $debug_mode) ? ' checked' : ''; $lignes_debug .= '<label class="tab" for="f_debug_' . $debug_mode . '">' . $debug_mode . '</label><label for="f_debug_' . $debug_mode . '"><input type="checkbox" id="f_debug_' . $debug_mode . '" name="f_debug_' . $debug_mode . '" value="1"' . $checked . ' /> ' . $debug_texte . '</label><br />' . NL; } // Fichiers de logs phpCAS $tab_fichiers = array(); $alerte_dossier_invalide = is_dir(PHPCAS_CHEMIN_LOGS) ? '' : '<p class="danger">Le dossier renseigné n\'existe plus ; veuillez le modifier !</p>'; if (!$alerte_dossier_invalide) { $tab_files = FileSystem::lister_contenu_dossier(PHPCAS_CHEMIN_LOGS); foreach ($tab_files as $file) { if (substr($file, 0, 9) == 'debugcas_') { if (HEBERGEUR_INSTALLATION == 'mono-structure') { $etabl = 'pour l\'établissement'; $id_etabl = 0; } else { $tab = explode('_', $file); $id_etabl = $tab[1]; $etabl = 'pour la base n°' . $id_etabl; } $tab_fichiers[$id_etabl] = '<li id="' . html(substr($file, 0, -4)) . '">Logs présents ' . $etabl . ', le fichier pesant ' . afficher_fichier_taille(filesize(PHPCAS_CHEMIN_LOGS . $file)) . '<q class="voir" title="Récupérer ce fichier."></q><q class="supprimer" title="Supprimer ce fichier."></q></li>' . NL; } ksort($tab_fichiers); } }
if ($action == 'importer_zip') { if (!count($_SESSION['tab_info'])) { exit('Erreur : données du fichier CSV perdues !'); } $result = FileSystem::recuperer_upload(CHEMIN_DOSSIER_IMPORT, $fichier_zip_nom, array('zip'), NULL, NULL, NULL); if ($result !== TRUE) { exit('Erreur : ' . $result); } // Dezipper dans le dossier dump (pas dans un sous-dossier "temporaire" sinon ce dossier n'est pas vidé si l'opération n'arrive pas à son terme). $code_erreur = FileSystem::unzip(CHEMIN_DOSSIER_IMPORT . $fichier_zip_nom, CHEMIN_DOSSIER_DUMP, TRUE); if ($code_erreur) { exit('<li><label class="alerte">Erreur : votre archive ZIP n\'a pas pu être ouverte (' . FileSystem::$tab_zip_error[$code_erreur] . ') !</label></li>'); } FileSystem::supprimer_fichier(CHEMIN_DOSSIER_IMPORT . $fichier_zip_nom); // Vérifier le contenu : noms des fichiers $tab_fichier = FileSystem::lister_contenu_dossier(CHEMIN_DOSSIER_DUMP); $nb_fichiers_introuvables = 0; foreach ($_SESSION['tab_info'] as $key => $tab_infos) { if (!in_array($tab_infos['fichier_nom'], $tab_fichier)) { $nb_fichiers_introuvables++; } } if ($nb_fichiers_introuvables) { $s = $nb_fichiers_introuvables > 1 ? 's' : ''; exit('Erreur : ' . $nb_fichiers_introuvables . ' fichier' . $s . ' référencé' . $s . ' dans le CSV non trouvé' . $s . ' dans le ZIP !'); } // La dernière étape consiste seulement à faire le ménage. $max = count($_SESSION['tab_info']) + 1; exit(']¤[' . $max); } // ////////////////////////////////////////////////////////////////////////////////////////////////////
exit('<label class="erreur">Application fermée : '.html($motif).'</label>'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Vérification des dossiers additionnels par établissement // //////////////////////////////////////////////////////////////////////////////////////////////////// if($action=='verif_dir_etabl') { // Récupérer les ids des structures $tab_bases = array_keys( DB_WEBMESTRE_WEBMESTRE::DB_lister_structures_id() ); // Récupérer les dossiers additionnels par établissement $tab_dossiers = array(); foreach(FileSystem::$tab_dossier_tmp_structure as $dossier_key => $dossier_dir) { $tab_dossiers[$dossier_dir] = array_fill_keys ( FileSystem::lister_contenu_dossier($dossier_dir) , TRUE ); unset($tab_dossiers[$dossier_dir]['index.htm']); ksort($tab_dossiers[$dossier_dir],SORT_NATURAL); } // Pour l'affichage du retour $thead = '<tr><td colspan="2">Vérification des dossiers additionnels par établissement - '.date('d/m/Y H:i:s').'</td></tr>'; $tbody_ok = ''; $tbody_pb = ''; // On parcourt les dossiers devant exister : ok ou création. foreach($tab_bases as $base_id) { foreach(FileSystem::$tab_dossier_tmp_structure as $dossier_key => $dossier_dir) { if(isset($tab_dossiers[$dossier_dir][$base_id])) { $tbody_ok .= '<tr class="v"><td>Dossier présent</td><td>'.$dossier_key.$base_id.'</td></tr>';
$tab_bad = array( '[sconet_id]' , '[sconet_num]' , '[reference]' , '[nom]' , '[prenom]' , '[login]' , '[ent_id]' ); $champs = 'user_id, user_id_ent, user_sconet_id, user_sconet_elenoet, user_reference, user_nom, user_prenom, user_login' ; $DB_TAB = DB_STRUCTURE_COMMUN::DB_lister_users_regroupement( 'eleve' /*profil_type*/ , 1 /*statut*/ , 'all' /*groupe_type*/ , 0 /*groupe_id*/ , 'alpha' /*eleves_ordre*/ , $champs ); if(!empty($DB_TAB)) { foreach($DB_TAB as $DB_ROW) { $tab_bon = array( $DB_ROW['user_sconet_id'] , $DB_ROW['user_sconet_elenoet'] , Clean::fichier($DB_ROW['user_reference']) , Clean::fichier($DB_ROW['user_nom']) , Clean::fichier($DB_ROW['user_prenom']) , Clean::fichier($DB_ROW['user_login']) , Clean::fichier($DB_ROW['user_id_ent']) ); $tab_fichier_masque[$DB_ROW['user_id']] = Clean::fichier(str_replace( $tab_bad , $tab_bon , $masque )); } } // Pour l'affichage du retour $thead = '<tr><td colspan="2">Import d\'un fichier de photos zippées le '.date('d/m/Y H:i:s').'</td></tr>'; $tbody = ''; // Traiter les fichier un à un $tab_fichier = FileSystem::lister_contenu_dossier($dossier_temp); foreach($tab_fichier as $fichier_nom) { // echo'*'.$fichier_nom; $tab_user_id = array_keys( $tab_fichier_masque , $fichier_nom ); $nb_user_find = count($tab_user_id); if($nb_user_find == 0) { $tbody .= '<tr><td class="r">'.html($fichier_nom).'</td><td>Pas de correspondance trouvée.</td></tr>'; } elseif($nb_user_find > 1) { $tbody .= '<tr><td class="r">'.html($fichier_nom).'</td><td>Plusieurs correspondances trouvées.</td></tr>'; } else {
/** * Créer les tables de la base du webmestre et les remplir (mode multi-structures) * * @param void * @return void */ public static function DB_creer_remplir_tables_webmestre() { $tab_files = FileSystem::lister_contenu_dossier(CHEMIN_DOSSIER_SQL_WEBMESTRE); foreach($tab_files as $file) { $extension = pathinfo($file,PATHINFO_EXTENSION); if($extension=='sql') { $requetes = file_get_contents(CHEMIN_DOSSIER_SQL_WEBMESTRE.$file); DB::query(SACOCHE_WEBMESTRE_BD_NAME , $requetes ); // Attention, sur certains LCS ça bloque au dela de 40 instructions MySQL (mais un INSERT multiple avec des milliers de lignes ne pose pas de pb). /* La classe PDO a un bug. Si on envoie plusieurs requêtes d'un coup ça passe, mais si on recommence juste après alors on récolte : "Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute." La seule issue est de fermer la connexion après chaque requête multiple en utilisant exceptionnellement la méthode ajouté par SebR suite à mon signalement : DB::close(nom_de_la_connexion); */ DB::close(SACOCHE_WEBMESTRE_BD_NAME); } } // Il est arrivé que la fonction DB_modifier_parametres() retourne une erreur disant que la table n'existe pas. // Comme si les requêtes précédentes étaient en cache, et pas encore toutes passées (parcequ'au final, quand on va voir la base, toutes les tables sont bien là). // Est-ce que c'est possible au vu du fonctionnement de la classe de connexion ? Et, bien sûr, y a-t-il quelque chose à faire pour éviter ce problème ? // En attendant une réponse de SebR, j'ai mis ce sleep(1)... sans trop savoir si cela pouvait aider... @sleep(1); // Renseigner la version de la base du webmestre DB_WEBMESTRE_WEBMESTRE::DB_modifier_parametre('version_base',VERSION_BASE_WEBMESTRE); }
} // États d'acquisitions calculés : couleurs de fond, équivalents textes, légendes $tab_acquis = array('NA' => 'r', 'VA' => 'o', 'A' => 'v'); $tab_defaut = array('NA' => '#ff9999', 'VA' => '#ffdd33', 'A' => '#99ff99'); $acquis_box = ''; foreach ($tab_acquis as $acquis => $class) { $acquis_box .= '<div class="colorpicker ' . $class . '">'; $acquis_box .= '<p><input type="text" class="hc" size="2" maxlength="3" id="acquis_texte_' . $acquis . '" name="acquis_texte_' . $acquis . '" value="' . html($_SESSION['ACQUIS_TEXTE'][$acquis]) . '" /><br /><input type="text" class="hc" size="25" maxlength="40" id="acquis_legende_' . $acquis . '" name="acquis_legende_' . $acquis . '" value="' . html($_SESSION['ACQUIS_LEGENDE'][$acquis]) . '" /></p>'; $acquis_box .= '<div><button type="button" name="color_' . $acquis . '" value="' . $_SESSION['BACKGROUND_' . $acquis] . '" class="colorer">Couleur de l\'établissement.</button></div>'; $acquis_box .= '<div><button type="button" name="color_' . $acquis . '" value="' . $tab_defaut[$acquis] . '" class="colorer">Couleur par défaut.</button></div>'; $acquis_box .= '<p><input type="text" class="stretch" size="8" id="acquis_color_' . $acquis . '" name="acquis_color_' . $acquis . '" value="' . $_SESSION['BACKGROUND_' . $acquis] . '" style="background-color:' . $_SESSION['BACKGROUND_' . $acquis] . '" /><br /></p>'; $acquis_box .= '</div>'; } // Listing des symboles colorés $chemin_dossier = CHEMIN_DOSSIER_IMG . 'note' . DS . 'choix' . DS . 'h' . DS; $tab_fichiers = FileSystem::lister_contenu_dossier($chemin_dossier); $tab_liste = array(); foreach ($tab_fichiers as $fichier_nom) { list($fichier_partie_1, $fichier_partie_2) = explode('_', $fichier_nom, 2); $image_nom = substr($fichier_nom, 0, -4); if (!isset($tab_liste[$fichier_partie_1])) { $tab_liste[$fichier_partie_1] = ''; } $tab_liste[$fichier_partie_1] .= '<div class="p"><a href="#" id="a_' . $image_nom . '"><img alt="' . $image_nom . '" src="./_img/note/choix/h/' . $fichier_nom . '" /></a></div>'; } ?> <div><span class="manuel"><a class="pop_up" href="<?php echo SERVEUR_DOCUMENTAIRE; ?> ?fichier=support_administrateur__gestion_codes_couleurs">DOC : Notation : codes, couleurs, légendes</a></span></div>
/** * zipper_fichiers * Zipper les fichiers de svg * * @param string $dossier_fichiers_a_zipper * @param string $dossier_zip_final * @param string $fichier_zip_nom * @return void */ public static function zipper_fichiers($dossier_fichiers_a_zipper,$dossier_zip_final,$fichier_zip_nom) { $zip = new ZipArchive(); $ds = (substr($dossier_zip_final,-1)==DS) ? '' : DS ; $zip->open($dossier_zip_final.$ds.$fichier_zip_nom, ZIPARCHIVE::CREATE); $tab_fichier = FileSystem::lister_contenu_dossier($dossier_fichiers_a_zipper); $ds = (substr($dossier_fichiers_a_zipper,-1)==DS) ? '' : DS ; foreach($tab_fichier as $fichier_sql_nom) { $zip->addFile($dossier_fichiers_a_zipper.$ds.$fichier_sql_nom,$fichier_sql_nom); } $zip->close(); }
$options_logo = ''; foreach ($tab_files as $file) { $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (in_array($extension, $tab_ext_images)) { $selected = $file == HEBERGEUR_LOGO ? ' selected' : ''; $options_logo .= '<option value="' . html($file) . '"' . $selected . '>' . html($file) . '</option>'; } } $options_logo = $options_logo ? '<option value=""> </option>' . $options_logo : '<option value="" disabled>Aucun fichier image trouvé !</option>'; exit($options_logo); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Contenu du ul avec la liste des logos disponibles // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'listing_logos') { $tab_files = FileSystem::lister_contenu_dossier(CHEMIN_DOSSIER_LOGO); $li_logos = ''; foreach ($tab_files as $file) { $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (in_array($extension, $tab_ext_images)) { $li_logos .= '<li>' . html($file) . ' <img alt="' . html($file) . '" src="' . URL_DIR_LOGO . html($file) . '" /><q class="supprimer" title="Supprimer cette image du serveur (aucune confirmation ne sera demandée)."></q></li>'; } } $li_logos = $li_logos ? $li_logos : '<li>Aucun fichier image trouvé !</li>'; exit($li_logos); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Uploader un logo // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'upload_logo') { $result = FileSystem::recuperer_upload(CHEMIN_DOSSIER_LOGO, NULL, $tab_ext_images, NULL, 100, NULL);