Exemplo n.º 1
0
/**
 * 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);
    }
  }
}
Exemplo n.º 2
0
/**
 * 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';
    }
}
Exemplo n.º 3
0
// 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 &rarr; décocher une fois les tests terminés</span>', 'SQL' => 'console FirePHP &rarr; résultats des requêtes SQL <span class="now">double le besoin en mémoire &rarr; risqué pour les générations de bilans</span>', 'SESSION' => 'console FirePHP &rarr; valeurs de $_SESSION <span class="now">diminue la sécurité en rendant accessible certaines informations</span>', 'POST' => 'console FirePHP &rarr; valeurs de $_POST', 'GET' => 'console FirePHP &rarr; valeurs de $_GET', 'FILES' => 'console FirePHP &rarr; valeurs de $_FILES', 'COOKIE' => 'console FirePHP &rarr; valeurs de $_COOKIE <span class="now">diminue la sécurité en rendant accessible certaines informations</span>', 'SERVER' => 'console FirePHP &rarr; valeurs de $_SERVER <span class="now">diminue la sécurité en rendant accessible certaines informations</span>', 'CONST' => 'console FirePHP &rarr; 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);
}
// ////////////////////////////////////////////////////////////////////////////////////////////////////
Exemplo n.º 5
0
  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
   {
Exemplo n.º 7
0
/**
 * 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>
Exemplo n.º 9
0
  /**
   * 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="">&nbsp;</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);