Parse error: syntax error, unexpected T_STRING in

ethanl Messages postés 3 Statut Membre -  
jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

J'héberge SACoche sur mon serveur mais quand j'appelle le dossier, mon navigateur m'affiche cela : Erreur d'analyse : erreur de syntaxe, T_STRING inattendu dans /mnt/115/sda/4/6/acces.eval.sacoche/SACoche/index.php à la ligne 107

Pourriez vous m'aider svp ?

Merci

3 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     

    bonjour

    partage le code du fichier....  sinon aucune aide ne sera possible 


    0
  2. ethanl Messages postés 3 Statut Membre
     

    session::execute();

    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       

      Nan mais.... il faut aussi les lignes précédentes !!

      Poste tout le code du fichier concerné .. ça sera plus simple !

      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         

        Bon, je suis allé voir sur le github du projet.

        Il n'y a rien d'anormal dessus.

        De ton côté, n'as tu rien modifié dans le fichier dans les lignes qui précédent la ligne 107 ?

        Peux tu retélécharger le fichier et remplacer celui que tu as actuellement ?

        https://git.sesamath.net/sesamath/sacoche/-/blob/main/index.php?ref_type=heads

        0
  3. ethanl Messages postés 3 Statut Membre
     
    <?php
    /**
     * @version $Id$
     * @author Thomas Crespin <***@***>
     * @copyright Thomas Crespin 2009-2022
     *
     * ****************************************************************************************************
     * SACoche <https://sacoche.sesamath.net> - Suivi d’Acquisitions de Compétences
     * © Thomas Crespin pour Sésamath <https://www.sesamath.net> - Tous droits réservés.
     * Logiciel placé sous la licence libre Affero GPL 3 <https://www.gnu.org/licenses/agpl-3.0.html>.
     * ****************************************************************************************************
     *
     * Ce fichier est une partie de SACoche.
     *
     * SACoche est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant les termes
     * de la “GNU Affero General Public License” telle que publiée par la Free Software Foundation :
     * soit la version 3 de cette licence, soit (à votre gré) toute version ultérieure.
     *
     * SACoche est distribué dans l’espoir qu’il vous sera utile, mais SANS AUCUNE GARANTIE :
     * sans même la garantie implicite de COMMERCIALISABILITÉ ni d’ADÉQUATION À UN OBJECTIF PARTICULIER.
     * Consultez la Licence Publique Générale GNU Affero pour plus de détails.
     *
     * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ;
     * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>.
     *
     */
    
    // Fichier appelé pour l’affichage de chaque page.
    // Passage en GET des paramètres pour savoir quelle page charger.
    
    // Constantes / Configuration serveur / Autoload classes / Fonction de sortie
    require('./_inc/_loader.php');
    
    // En théorie, si l’utilisateur refuse les cookies de SACoche mais accepte ceux de l’ENT, une demande de connexion SSO peut entraîner des boucles de redirections (la session n’étant pas retrouvée).
    if(empty($_COOKIE[COOKIE_TEST]))
    {
      Cookie::definir( COOKIE_TEST , 'ok' );
      if(isset($_GET['sso']))
      {
        if(!isset($_GET['cookie']))
        {
          exit_redirection(URL_BASE.$_SERVER['REQUEST_URI'].'&cookie');
        }
        else
        {
          exit_error( 'Risque de redirections en boucle' /*titre*/ , 'Pour utiliser <em>SACoche</em> vous devez configurer l’acceptation des cookies par votre navigateur.' /*contenu*/ );
        }
      }
    }
    else
    {
      if(isset($_GET['cookie']))
      {
        // Maintenant qu’on a vérifié que les cookies sont ok, on recharge sans le GET ajouté dans l’URL, sinon Itop demande une ré-authentification (service considéré différent...).
        exit_redirection( str_replace( '&cookie' , '' , URL_BASE.$_SERVER['REQUEST_URI'] ) );
      }
    }
    
    // Mémorisation de paramètres multiples transmis en GET pour les retrouver par la suite dans le cas où le service d’authentification externe en perd
    // C’est le cas lors de l’appel d’un IdP de type RSA FIM, application nationale du ministère...
    if(isset($_GET['memoget']))
    {
      Cookie::save_get_and_exit_reload( urldecode($_GET['memoget']) );
    }
    // Récupération de paramètres multiples transmis en GET et mémorisés temporairement dans un cookie (pour le cas où le service d’authentification externe en perd).
    if(isset($_COOKIE[COOKIE_MEMOGET]))
    {
      Cookie::load_get();
    }
    
    // Page et section appelées ; normalement transmis en $_GET mais $_POST possibles depuis GEPI
        if(isset($_GET['page']))     { $PAGE = Clean::get('page', 'id'); }
    elseif(isset($_POST['page']))    { $PAGE = Clean::post('page', 'id'); }
    elseif(isset($_GET['code_mdp'])) { $PAGE = 'public_nouveau_mdp'; }
    elseif(isset($_GET['stop_code'])){ $PAGE = 'public_stop_mail'; }
    elseif(isset($_GET['sso']))      { $PAGE = 'compte_accueil'; }
    else                             { $PAGE = 'public_accueil'; }
        if(isset($_GET['section']))  { $SECTION = Clean::get('section', 'id'); }
    elseif(isset($_POST['section'])) { $SECTION = Clean::post('section', 'id'); }
    else                             { $SECTION = ''; }
    
    // Besoin pour infobulle()
    if( !isset($_COOKIE[COOKIE_ISTOUCH]) )
    {
      // Définition provisoire en attendant que la valeur soit fixée par javascript
      $_COOKIE[COOKIE_ISTOUCH] = FALSE;
    }
    
    // Fichier d’informations sur l’hébergement (requis avant la gestion de la session).
    if(is_file(CHEMIN_FICHIER_CONFIG_INSTALL))
    {
      require(CHEMIN_FICHIER_CONFIG_INSTALL);
    }
    elseif($PAGE!='public_installation')
    {
      exit_error( 'Informations hébergement manquantes' /*titre*/ , 'Les informations relatives à l’hébergeur n’ont pas été trouvées.<br>C’est probablement votre première installation de SACoche, ou bien le fichier "'.FileSystem::fin_chemin(CHEMIN_FICHIER_CONFIG_INSTALL).'" a été supprimé.<br>Cliquer sur le lien ci-dessous.' /*contenu*/ , 'install' /*lien*/ );
    }
    
    // Le fait de lister les droits d’accès de chaque page empêche de surcroit l’exploitation d’une vulnérabilité "include PHP" (https://www.cert.ssi.gouv.fr/alerte/CERTA-2003-ALE-003/).
    if(!Session::recuperer_droit_acces($PAGE))
    
      Session::$tab_message_erreur ( 'Droits de la page "'.$PAGE.'" manquants !<br>Paramètre "page" transmis en GET incorrect, ou droits non attribués dans le fichier "'.FileSystem::fin_chemin(CHEMIN_DOSSIER_INCLUDE.'tableau_droits.php').'".'
      // La page vers laquelle rediriger sera définie après ouverture de la session
    
    
    // Ouverture de la session et gestion des droits d’accès
    session::execute();
    if(count(Session::$tab_message_erreur))
    {
      $PAGE = ($_SESSION['USER_PROFIL_TYPE'] == 'public') ? 'public_accueil' : 'compte_accueil' ;
    }
    
    // Traductions
    if($_SESSION['USER_PROFIL_TYPE']!='public')
    {
      Lang::setlocale( LC_MESSAGES, Lang::get_locale_used() );
      Lang::bindtextdomain( LOCALE_DOMAINE, LOCALE_DIR );
      Lang::bind_textdomain_codeset( LOCALE_DOMAINE, LOCALE_CHARSET );
      Lang::textdomain( LOCALE_DOMAINE );
    }
    
    // Alerte si navigateur trop ancien
    if(!empty($_SESSION['BROWSER']['alerte']))
    {
      Session::$tab_message_erreur[] = $_SESSION['BROWSER']['alerte'];
    }
    
    // Infos DEBUG en console
    if (DEBUG>3) afficher_infos_debug_console();
    
    // Blocage éventuel par le webmestre ou un administrateur ou l’automate (on ne peut pas le tester avant car il faut avoir récupéré les données de session)
    LockAcces::stopper_si_blocage( $_SESSION['BASE'] , FALSE /*demande_connexion_profil*/ );
    
    // Autres fonctions à charger
    require(CHEMIN_DOSSIER_INCLUDE.'fonction_divers.php');
    
    // MAJ fichier de config hébergement si besoin
    if(is_file(CHEMIN_FICHIER_CONFIG_INSTALL))
    {
      require(CHEMIN_DOSSIER_INCLUDE.'maj_fichier_constantes_hebergement.php');
    }
    
    // Interface de connexion à la base, chargement et config (test sur CHEMIN_FICHIER_CONFIG_INSTALL car à éviter si procédure d’installation non terminée).
    if(is_file(CHEMIN_FICHIER_CONFIG_INSTALL))
    {
      // Choix des paramètres de connexion à la base de données adaptée...
      // ...multi-structures ; base sacoche_structure_*** (si connecté sur un établissement)
      if( (HEBERGEUR_INSTALLATION=='multi-structures') && ($_SESSION['BASE']>0) )
      {
        $fichier_sql_param    = 'serveur_sacoche_structure_'.$_SESSION['BASE'];
        $fichier_class_config = 'class.DB.config.sacoche_structure';
      }
      // ...multi-structures ; base sacoche_webmestre (si non connecté ou connecté comme webmestre)
      elseif(HEBERGEUR_INSTALLATION=='multi-structures')
      {
        $fichier_sql_param    = 'serveur_sacoche_webmestre';
        $fichier_class_config = 'class.DB.config.sacoche_webmestre';
      }
      // ...mono-structure ; base sacoche_structure
      elseif(HEBERGEUR_INSTALLATION=='mono-structure')
      {
        $fichier_sql_param    = 'serveur_sacoche_structure';
        $fichier_class_config = 'class.DB.config.sacoche_structure';
      }
      else
      {
        exit_error( 'Configuration anormale' /*titre*/ , 'Une anomalie dans les données d’hébergement empêche l’application de se poursuivre.<br>HEBERGEUR_INSTALLATION vaut '.HEBERGEUR_INSTALLATION /*contenu*/ );
      }
      // Chargement du fichier de connexion à la BDD
      define('CHEMIN_FICHIER_CONFIG_SQL',CHEMIN_DOSSIER_PRIVATE_SQL.$fichier_sql_param.'.php');
      if(is_file(CHEMIN_FICHIER_CONFIG_SQL))
      {
        require(CHEMIN_FICHIER_CONFIG_SQL);
        require(CHEMIN_DOSSIER_INCLUDE.$fichier_class_config.'.php');
      }
      elseif($PAGE!='public_installation')
      {
        exit_error( 'Paramètres BDD manquants' /*titre*/ , 'Les paramètres de connexion à la base de données n’ont pas été trouvés.<br>C’est probablement votre première installation de SACoche, ou bien le fichier "'.FileSystem::fin_chemin(CHEMIN_FICHIER_CONFIG_SQL).'" a été supprimé.<br>Cliquer sur le lien ci-dessous.' /*contenu*/ , 'install' /*lien*/ );
      }
    }
    
    // Authentification requise par SSO
    if(Session::$_sso_redirect)
    {
      require(CHEMIN_DOSSIER_PAGES.'public_sso_login.php');
      // En cas de redirection pour cause de profil incompatible, il faut vérifier que l’on n’est pas encore identifié avec le mauvais profil.
      if( !Session::verifier_droit_acces($_SESSION['USER_PROFIL_TYPE']) && !Session::verifier_droit_acces('public') )
      {
        Session::$tab_message_erreur[] = 'Appel incompatible avec votre identification actuelle.'.' Veuillez vous (re)connecter.';
        $PAGE = 'public_accueil';
      }
    }
    
    // Suppression du cookie provisoire ayant servi à mémoriser des paramètres multiples transmis en GET dans le cas où le service d’authentification externe en perd.
    // C’est le cas lors de l’appel d’un IdP de type RSA FIM, application nationale du ministère...
    if(isset($_COOKIE[COOKIE_MEMOGET]))
    {
      Cookie::effacer(COOKIE_MEMOGET);
    }
    
    // Authentification pour le compte d’une application tierce
    if(isset($_GET['url_redirection']))
    {
      $url_redirection = urldecode($_GET['url_redirection']);
      if($_SESSION['USER_PROFIL_SIGLE'] == 'OUT')
      {
        // User non connecté -> Retenir la demande en attendant qu’il se connecte
        Session::_set('MEMO_GET','url_redirection',$url_redirection);
      }
      else
      {
        // User connecté -> Redirection vers l’application, avec une clef (ticket) pour attester du login et permettre de récupérer ses infos
        $clef = FileSystem::fabriquer_fichier_user_infos_for_appli_externe();
        Session::_unset('MEMO_GET');
        $separateur = (strpos($url_redirection,'?')===FALSE) ? '?' : '&' ;
        exit_redirection($url_redirection.$separateur.'clef='.$clef);
      }
    }
    
    // Page CNIL-RGPD si message d’information CNIL-RGPD non validé.
    if(isset($_SESSION['STOP_CNIL']))
    {
      Session::$tab_message_erreur[] = 'Avant d’utiliser <em>SACoche</em>, vous devez valider le formulaire ci-dessous.';
      $PAGE = 'compte_cnil';
    }
    
    // Fichier de données de la page concernée
    $filename_php = CHEMIN_DOSSIER_PAGES.$PAGE.'.php';
    if(!is_file($filename_php))
    {
      Session::$tab_message_erreur[] = 'Fichier '.FileSystem::fin_chemin($filename_php).' manquant ; redirection vers une page d’accueil.';
      $PAGE = ($_SESSION['USER_PROFIL_TYPE']=='public') ? 'public_accueil' : ( (isset($_SESSION['STOP_CNIL'])) ? 'compte_cnil' : 'compte_accueil' ) ;
      $filename_php = CHEMIN_DOSSIER_PAGES.$PAGE.'.php';
    }
    
    // Contenu à afficher récupéré dans une variable
    ob_start();
    require($filename_php);
    $CONTENU_PAGE = ob_get_contents();
    ob_end_clean();
    
    // Jeton CSRF ; ne peut pas être généré avant car $PAGE peut être changé par le code inclus ci-dessus.
    Session::generer_jeton_anti_CSRF($PAGE);
    
    // Fermeture de session (mais pas destruction, juste écriture et libération des données pour éviter un verrouillage en écriture)
    Session::write_close();
    
    // Titre du navigateur
    $browser_title = ($TITRE) ? $TITRE : Layout::TITLE_DEFAULT ;
    Layout::add( 'browser_title' , $browser_title );
    
    // Css personnalisé
    if(!empty($_SESSION['CSS']))
    {
      Layout::add( 'css_inline' , $_SESSION['CSS'] );
    }
    
    // Fichiers css & js
    $tab_pages_graphiques = array('officiel_accueil','livret_edition','releve_bilan_chronologique','releve_graphique');
    $tab_pages_graphiques_export = array('releve_bilan_chronologique','releve_graphique');
    $filename_js_normal = './pages/'.$PAGE.'.js';
    Layout::add( 'css_file' , './_css/style.css'           , 'mini' );
    Layout::add( 'js_file'  , './_js/jquery-librairies.js' , 'comm' );
    Layout::add( 'js_file'  , './_js/script.js'            , 'mini' );
    if(in_array($PAGE,$tab_pages_graphiques))
    {
      Layout::add( 'js_file' , './_js/highcharts.js' , 'comm' );
    }
    if(in_array($PAGE,$tab_pages_graphiques_export))
    {
      Layout::add( 'js_file' , './_js/highcharts_exporting.js'         , 'comm' );
      Layout::add( 'js_file' , './_js/highcharts_exporting_offline.js' , 'comm' );
    }
    if(is_file($filename_js_normal))
    {
      Layout::add( 'js_file' , $filename_js_normal , 'mini' );
    }
    
    // Ultimes constantes javascript
    Layout::add( 'js_inline_before' , 'var LOG_ID            = "'.$_SESSION['BASE'].'_'.$_SESSION['USER_ID'].'";' );
    Layout::add( 'js_inline_before' , 'var PAGE              = "'.$PAGE.'";' );
    Layout::add( 'js_inline_before' , 'var CSRF              = "'.Session::$_CSRF_value.'";' );
    Layout::add( 'js_inline_before' , 'var PROFIL_TYPE       = "'.$_SESSION['USER_PROFIL_TYPE'].'";' );
    Layout::add( 'js_inline_before' , 'var CONNEXION_USED    = "'.((isset($_COOKIE[COOKIE_AUTHMODE])) ? html($_COOKIE[COOKIE_AUTHMODE]) : 'normal').'";' );
    Layout::add( 'js_inline_before' , 'var DUREE_AUTORISEE   = '.$_SESSION['USER_DUREE_INACTIVITE'].';' );
    Layout::add( 'js_inline_before' , 'var DUREE_AFFICHEE    = '.$_SESSION['USER_DUREE_INACTIVITE'].';' );
    Layout::add( 'js_inline_before' , 'var DECONNEXION_REDIR = "'.((isset($_SESSION['DECONNEXION_ADRESSE_REDIRECTION'])) ? html($_SESSION['DECONNEXION_ADRESSE_REDIRECTION']) : '').'";' );
    Layout::add( 'js_inline_before' , 'var BASE_MAJ_DECALEE  = '.((empty($_SESSION['VERSION_BASE_MAJ_COMPLEMENTAIRE'])) ? 'false' : 'true').';' );
    
    // Affichage
    $body_class = ($_COOKIE[COOKIE_ISTOUCH]) ? 'touch' : 'mouse' ;
    echo Layout::afficher_page_entete('prog-'.$body_class);
    if( substr($PAGE,0,7) !== 'public_' )
    {
      $class_page_tactile = ($_COOKIE[COOKIE_ISTOUCH]) ? 'dispositif_tactile' : 'dispositif_pointage' ;
      $texte_page_tactile = ($_COOKIE[COOKIE_ISTOUCH]) ? 'Dispositif tactile activé.'.BRJS.'Basculer en mode pointage.' : 'Dispositif de pointage activé.'.BRJS.'Basculer en mode tactile.' ;
      $lien_page_langue  = ($_SESSION['USER_ETABLISSEMENT'])     ? ' <a href="./index.php?page=compte_langue">['.Lang::get_locale_used().']</a>' : '' ;
      $lien_page_switch  = (!empty($_SESSION['USER_SWITCH_ID'])) ? '<a href="./index.php?page=compte_switch"><span class="top switch">'.$_SESSION['USER_PROFIL_NOM_COURT'].'</span></a>' : $_SESSION['USER_PROFIL_NOM_COURT'] ;
      $lien_page_assistance = in_array($_SESSION['USER_PROFIL_TYPE'],array('administrateur','directeur','professeur','parent','eleve')) ? ' [<a href="#" class="no_puce"><span class="top assistance" id="lien_assistance">assistance</span></a>]' : '' ;
      // Espace identifié : cadre_haut (avec le menu) et cadre_bas (avec le contenu).
      echo'<div id="cadre_haut">'.NL;
      echo  '<a target="_blank" rel="noopener noreferrer" href="'.SERVEUR_PROJET.'" class="no_puce"><img id="logo" alt="SACoche" src="./_img/logo_petit_menu.png" width="154" height="39"></a>'.NL;
      echo  '<div id="top_info">'.NL;
      echo    $_SESSION['MENU'];
      echo    '<div>'.NL;
      echo      '<span class="top home">'.html($_SESSION['ETABLISSEMENT']['DENOMINATION']).' <a href="./index.php?page=compte_accueil">['.html(Lang::_('accueil')).']</a></span>'.$lien_page_assistance.'<br>'.NL;
      echo      '<span class="top profil_'.$_SESSION['USER_PROFIL_TYPE'].'">'.html($_SESSION['USER_PRENOM'].' '.$_SESSION['USER_NOM']).' ['.$lien_page_switch.']'.$lien_page_langue.' [<a href="#" id="touchchange"'.infobulle($texte_page_tactile,FALSE,TRUE).'><span class="top '.$class_page_tactile.'"></span></a>]</span>'.NL;
      echo    '</div>'.NL;
      echo    '<div>'.NL;
      echo      '<span class="top clock_fixe"><span id="clock">'.$_SESSION['USER_DUREE_INACTIVITE'].' min</span></span><br>'.NL;
      echo      '<a href="#"><span class="top deconnexion" id="lien_deconnecter">'.html(Lang::_('Déconnexion')).'</span></a>'.NL;
      echo    '</div>'.NL;
      echo  '</div>'.NL;
      echo  '<audio id="audio_bip" preload="none" class="hide">'.NL;
      // On pourrait bien sur laisser le navigateur se débrouiller et prendre le format qui lui convient, il me semble que dans ce cas j’avais noté des avertissements en console.
      if(!in_array( $_SESSION['BROWSER']['modele'] , array('firefox','opera') ))
      {
        echo    '<source src="./_audio/bip.mp3" type="audio/mpeg">'.NL;
      }
      if(!in_array( $_SESSION['BROWSER']['modele'] , array('explorer','safari') ))
      {
        echo    '<source src="./_audio/bip.ogg" type="audio/ogg">'.NL;
      }
      echo  '</audio>'.NL;
      echo'</div>'.NL;
      echo'<div id="cadre_navig"><a id="go_haut" href="#cadre_haut"'.infobulle('Haut de page').'></a><a id="go_bas" href="#ancre_bas"'.infobulle('Bas de page').'></a></div>'.NL;
      echo'<div id="cadre_bas">'.NL;
      if(!empty($SOUS_MENU))
      {
        echo'<div class="sousmenu">'.$SOUS_MENU.'</div>';
      }
      echo  '<h1>'.$TITRE.'</h1>'.NL;
    }
    else
    {
      // Accueil (identification ou procédure d’installation ou génération de nouveaux identifiants) : cadre unique (avec image SACoche & image hébergeur).
      echo'<div id="cadre_milieu">'.NL;
      if($PAGE=='public_accueil')
      {
        $tab_image_infos = ( (defined('HEBERGEUR_LOGO')) && (is_file(CHEMIN_DOSSIER_LOGO.HEBERGEUR_LOGO)) ) ? getimagesize(CHEMIN_DOSSIER_LOGO.HEBERGEUR_LOGO) : array() ;
        $hebergeur_img   = isset($tab_image_infos[3]) ? '<img alt="Hébergeur" src="'.URL_DIR_LOGO.HEBERGEUR_LOGO.'" '.$tab_image_infos[3].' style="max-width:300px;max-height:200px;">' : '' ;
        $hebergeur_lien  = ( (defined('HEBERGEUR_ADRESSE_SITE')) && HEBERGEUR_ADRESSE_SITE && ($hebergeur_img) ) ? '<a href="'.html(HEBERGEUR_ADRESSE_SITE).'">'.$hebergeur_img.'</a>' : $hebergeur_img ;
        $SACoche_lien    = '<a href="'.SERVEUR_PROJET.'"><img alt="Suivi d’Acquisition de Compétences" src="./_img/logo_grand.gif" width="208" height="71"></a>' ;
        echo  '<div id="titre_logo">'.$SACoche_lien.$hebergeur_lien.'</div>'.NL;
      }
      else
      {
        echo  '<div class="hc"><img src="./_img/logo_grand.gif" alt="SACoche" width="208" height="71"></div>'.NL;
        echo  '<h1>'.$TITRE.'</h1>'.NL;
      }
    }
    // Alerte si pas de javascript activé, et autres messages d’erreurs (ceux relatifs à l’acceptation des cookies et/ou l’usage d’iframe sont ajoutés par script.js)
    echo  '<noscript>Pour utiliser <em>SACoche</em> vous devez activer JavaScript dans votre navigateur.</noscript>'.NL;
    if(count(Session::$tab_message_erreur))
    {
      echo  '<div class="probleme">'.implode('</div><div class="probleme">',Session::$tab_message_erreur).'</div>'.NL;
      Session::$tab_message_erreur = array();
    }
    echo  '<hr>'.NL;
    echo   $CONTENU_PAGE;
    echo  '<div id="ancre_bas"></div>'.NL; // Il faut un div et pas seulement un span pour le navigateur Safari (sinon href="#ancre_bas" ne fonctionne pas).
    echo'</div>'.NL;
    echo Layout::afficher_page_pied();
    ?>
    

    EDIT MODERATION : AJOUT DES BALISES DE CODE !!

    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       

      Ligne 102 ....  tu as oublié un point-virgule visiblement

      0