PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); } catch (PDOException $e) { die('Impossible d\'accéder à la base de donnée ! ' . htmlspecialchars($e->getMessage())); } // affiche les erreurs SQL si true $debugSQL = true; $DS = DIRECTORY_SEPARATOR; $dir_user = dirname(__FILE__) . $DS; $dir_pages = $dir_user . 'pages' . $DS; $dir_pages2 = $dir_user . 'pages2' . $DS; $dir_admin = $dir_user . 'admin' . $DS; $dir_onglets_admin = $dir_admin . 'onglets' . $DS; $dir_images = $dir_user . 'images' . $DS; $task = isset($_REQUEST['task']) ? trim(strtolower($_REQUEST['task'])) : ''; $action = isset($_REQUEST['action']) ? trim(strtolower($_REQUEST['action'])) : ''; define('ALAIN_GERAULT', 1); // empêche l'accès direct aux pages des onglets // ------------------ UTILITAIRES TEXTE ------------------ function enleveAccents($texte) { $texte = strtr( $texte, 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ-\'', 'AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn ' ); return $texte; } function trimEx($s){ $s = str_replace(' ', ' ', $s); while (strpos($s,' ') !== false) { $s = str_replace(' ',' ',$s); } return $s; } function getTraduction($table,$id,$champ=1) { $t = $champ==2 ? 'traduction_2' : 'traduction'; return corrigeLangue(selectOneValue("SELECT $t FROM traduction WHERE `table`='$table' AND id_table=$id")); } function camera($lichen,$parasite=false) { $table = $parasite ? "images_parasites" : "images_lichens"; $col = $parasite ? "parasite" : "lichen"; $photos = selectOneValue("SELECT COUNT(*) FROM $table WHERE $col=" . intval($lichen)); if ($photos) { echo ''; } } function propreNomScien($s) { return trim(strip_tags( str_replace('

','

',$s), '' )); } // ------------------ UPLOAD IMAGE ------------------ function copieImage($champ) { if (!isset($_FILES[$champ]) || $_FILES[$champ]['name'] == '') return ''; // un fichier a-t-il été sélectionné ? if ($_FILES[$champ]['size'] <= 0) { $alerte = 'Aucun fichier n\'a été sélectionné !\n'; } // erreur d'upload if ($_FILES[$champ]['error'] > 0) { erreur('Erreur lors du transfert du fichier...'); return ''; } // taille max 1 Mo if ($_FILES[$champ]['size'] > 1024000) { erreur('Votre fichier dépasse la limite autorisée (1 Mo) !'); return ''; } // extensions autorisées $ext_allow = ['jpg','jpeg','png','gif']; // extension réelle $ext_file = strtolower(pathinfo($_FILES[$champ]['name'], PATHINFO_EXTENSION)); if(!in_array($ext_file,$ext_allow) && $_FILES[$champ]['size'] > 0){ erreur('Votre fichier n\'est pas autorisé (pas au format JPEG, GIF ou PNG) !'); } else { // normaliser le nom du fichier $search = [ '@[ËÊÈÉéèëê]@i','@[ÄÂÀÁäâàá]@i','@[ÏÎÌÍïîìí]@i', '@[ÜÛÙÚüûùúµ]@i','@[ÖÔÒÓöôòó]@i','@[ç]@i','@[ñ]@i','@[ \'"]@i' ]; $replace = ['e','a','i','u','o','c','n','_']; $_FILES[$champ]['name'] = enleveAccents( preg_replace($search, $replace, $_FILES[$champ]['name']) ); $DS = DIRECTORY_SEPARATOR; $rep = dirname(__FILE__) . $DS . 'images' . $DS; if (!is_dir($rep)) { mkdir($rep); } chmod($rep,0755); if (file_exists($rep.$_FILES[$champ]['name'])) { // déjà existant echo erreur( 'Le nom : '.$_FILES[$champ]['name'].' a déjà été choisi pour une autre image !
Veuillez en trouver un autre SVP ...' ); } else { // on tente l'upload if ( in_array($ext_file,$ext_allow) && $_FILES[$champ]['size'] > 0 && move_uploaded_file($_FILES[$champ]['tmp_name'],$rep.$_FILES[$champ]['name']) ) { return $_FILES[$champ]['name']; } else { erreur('Une erreur s\'est produite lors du transfert de votre fichier...'); } } } return ''; } // ------------------ TITRES / HEADER ------------------ function getTitrePage($task){ global $lang; switch($task){ case 'accueil': return $lang=='en'?'Home':'Accueil'; case 'liens': return $lang=='en'?'Links':'Liens'; case 'news': return $lang=='en'?'News':'Nouveautés'; case 'contact': return 'Contact'; case 'introduction': return 'Introduction'; } return ''; } function header_($title,$admin=true,$couleurFond='#FFFFFF',$traduc=false) { global $lang; $lichen = isset($_REQUEST['lichen']) ? intval($_REQUEST['lichen']) : 0; $parasite = isset($_REQUEST['parasite']) ? intval($_REQUEST['parasite']) : 0; $lichen_ = selectOne("SELECT * FROM lichen WHERE id=$lichen"); $parasite_ = selectOne("SELECT * FROM parasite WHERE id=$parasite"); if ($lichen_) $title .= ' - ' . strip_tags($lichen_['nom_latin']); if ($parasite_) $title .= ' - ' . strip_tags($parasite_['nom_latin']); $id = isset($_REQUEST['habitat']) ? intval($_REQUEST['habitat']) : 0; $habitat = selectOne("SELECT * FROM habitat WHERE id=$id"); if ($habitat){ if ($lang=='en') $title .= ' - ' . strip_tags(getTraduction('habitat',$id,1)); else $title .= ' - '.$habitat['nom']; } $task = isset($_REQUEST['task']) ? trim($_REQUEST['task']) : ''; if (in_array($task, ['accueil','liens','news','contact','introduction'])) { $title .= ' - ' . getTitrePage($task); } ?> <?php echo $title; ?> bgcolor=""> '; echo ''; foreach ($lichens as $id=>$nom_latin){ echo ''; } echo ''; } function selectGroupement($groupement_=0,$onChange) { $groupements_ = select("SELECT * FROM groupement ORDER BY nom"); $groupements = []; foreach($groupements_ as $groupement){ $id = $groupement['id']; $nom = trim(str_replace(chr(160),' ',strip_tags(html_entity_decode($groupement['nom'])))); $groupements[$id] = $nom; } asort($groupements); echo ''; } function selectParasite($parasite_=0,$onChange) { $parasites = select("SELECT id,nom_latin FROM parasite ORDER BY nom_latin"); echo ''; } function selectTypeLichen($type_lichen_=0) { $lichens = select("SELECT id,nom FROM type_lichen ORDER BY nom"); echo ''; } function selectHabitat($nomChamp,$habitat_=0,$onChange='') { $habitats = select("SELECT id,nom FROM habitat ORDER BY nom"); echo ''; } // ------------------ ONGLETS ------------------ function onglet($titre,$lien,$rowspan=false) { ?> onmouseover="this.style.backgroundColor='#CCCC99'" onmouseout="this.style.backgroundColor='#FFFFCC'" onClick="location.href=''" style="border:1px solid black;cursor:pointer;background-color:#FFFFCC;text-align:center;vertical-align:middle">  (.+)<\/span>/','$1',$s); $s = str_replace('','',$s); $s = str_replace('lang=fr','lang='.$lang, str_replace('lang=en','lang='.$lang,$s) ); return $s; } // ------------------ FONCTIONS D'ENTRÉE / PROPRETÉ TEXTE ------------------ // NOTE IMPORTANTE : on NE fait plus de mysql_real_escape_string ici. // getTexte() et echappeSQL() deviennent de la "nettoyage" texte. // Les requêtes elles-mêmes doivent utiliser des requêtes préparées si on insère ces valeurs. function getTexte($champ) { if (!isset($_REQUEST[$champ])) { return ''; } // Ancien code : // trim(mysql_real_escape_string(stripslashes(htmlspecialchars_decode( // htmlentities(utf8_encode($_REQUEST[$texte]))) // ))); // // Version PDO-friendly : on nettoie pour usage interne, // mais pour la BDD tu DOIS utiliser des requêtes préparées. $val = $_REQUEST[$champ]; // uniformiser encodage if (!mb_detect_encoding($val, 'UTF-8', true)) { $val = utf8_encode($val); } $val = str_replace('’', "'", $val); $val=str_replace("'",'&apos',$val); $val = str_replace(chr(160), ' ', $val); // espace insécable -> espace normal return trim($val); } function corrigeAccents($s){ if (strpos($s,'Ã')!==false) $s=utf8_decode($s); if (strpos($s,'Â')!==false) $s=utf8_decode($s); return htmlentities($s); } // Anciennement: retourne une version échappée pour concaténer dans SQL. // En PDO moderne, il faut PAS concaténer dans le SQL, mais utiliser bindParam. // Je garde la fonction pour compatibilité, mais elle ne protège pas contre l'injection. // => tu dois migrer progressivement les appels vers des requêtes préparées. function echappeSQL($champ) { $champ = str_replace(chr(160),' ',$champ); $champ = str_replace('’',"'",$champ); $champ = stripslashes($champ); return trim($champ); } // ------------------ GETTERS D'IDS ------------------ function getGroupementId($nom_latin) { $nom_latin = echappeSQL($nom_latin); $row = selectOne("SELECT id FROM groupement WHERE nom = :nom", [':nom'=>$nom_latin]); return $row ? intval($row['id']) : 0; } function getLichenId($nom_latin) { $nom_latin = echappeSQL($nom_latin); $row = selectOne("SELECT id FROM lichen WHERE nom_latin = :nom", [':nom'=>$nom_latin]); return $row ? intval($row['id']) : 0; } function getParasiteId($nom_latin) { $nom_latin = echappeSQL($nom_latin); $row = selectOne("SELECT id FROM parasite WHERE nom_latin = :nom", [':nom'=>$nom_latin]); return $row ? intval($row['id']) : 0; } function getHabitatId($nom) { $nom = echappeSQL($nom); $row = selectOne("SELECT id FROM habitat WHERE nom = :nom", [':nom'=>$nom]); return $row ? intval($row['id']) : 0; } // ------------------ ACCÈS BDD (VERSION PDO) ------------------ // Ces fonctions remplacent les anciennes mysql_* // Elles acceptent maintenant un tableau $params facultatif pour les bind. function select($requete, $params = []) { global $pdo, $debugSQL; try { $stmt = $pdo->prepare($requete); $stmt->execute($params); return $stmt->fetchAll(); // FETCH_ASSOC par défaut (défini à la connexion) } catch (PDOException $e) { if ($debugSQL) { erreur('Requête SQL : '.$requete.'
'.$e->getMessage()); } else { erreur('Erreur SQL.'); } return false; } } function selectSingleValues($requete, $params = []) { global $pdo, $debugSQL; try { $stmt = $pdo->prepare($requete); $stmt->execute($params); $vals = []; while ($row = $stmt->fetch(PDO::FETCH_NUM)) { $vals[] = $row[0]; } return $vals; } catch (PDOException $e) { if ($debugSQL) { erreur('Requête SQL : '.$requete.'
'.$e->getMessage()); } else { erreur('Erreur SQL.'); } return false; } } function selectOne($requete, $params = []) { global $pdo, $debugSQL; try { $stmt = $pdo->prepare($requete); $stmt->execute($params); $row = $stmt->fetch(); // FETCH_ASSOC par défaut if ($row === false) { return false; } return $row; } catch (PDOException $e) { if ($debugSQL) { erreur('Requête SQL : '.$requete.'
'.$e->getMessage()); } else { erreur('Erreur SQL.'); } return false; } } function selectOneValue($requete, $params = []) { global $pdo, $debugSQL; try { $stmt = $pdo->prepare($requete); $stmt->execute($params); $row = $stmt->fetch(PDO::FETCH_NUM); if ($row === false) { return false; } return $row[0]; } catch (PDOException $e) { if ($debugSQL) { erreur('Requête SQL : '.$requete.'
'.$e->getMessage()); } else { erreur('Erreur SQL.'); } return false; } } // requête INSERT / UPDATE / DELETE function requete($requete, $params = []) { global $pdo, $debugSQL; try { $stmt = $pdo->prepare($requete); return $stmt->execute($params); } catch (PDOException $e) { if ($debugSQL) { erreur('Requête SQL : '.$requete.'
'.$e->getMessage()); } else { erreur('Erreur SQL.'); } return false; } } // ------------------ MESSAGES ------------------ function erreur($msg) { echo '

Erreur : '.$msg.'

'; } function info($msg) { echo '

'.$msg.'

'; } // ------------------ SITEMAP ------------------ function creeSitemap(){ $liens = []; $debut_url = 'https://www.lichensmaritimes.org?'; $liens[]='task=accueil'; $liens[]='task=introduction'; $liens[]='task=lichens'; for ($i=2; $i<=26; $i++) { $liens[] = 'task=lichens&lettre=' . chr($i+64); } $liens[]='task=search'; $liens[]='task=liens'; $liens[]='task=news'; $liens[]='task=contact'; $liens[]='task=contact'; $habitats = selectSingleValues("SELECT id FROM habitat ORDER BY nom"); foreach($habitats as $habitat) { $liens[]='task=habitat&habitat='.$habitat; } $lichens = selectSingleValues("SELECT id FROM lichen ORDER BY nom_latin"); foreach($lichens as $lichen) { $liens[]='task=fiche&lichen='.$lichen; } $liens2 = []; foreach($liens as $lien){ $liens2[] = $debut_url.$lien.'&lang=fr'; $liens2[] = $debut_url.$lien.'&lang=en'; } file_put_contents('../sitemap.txt', implode("\n",$liens2)); } // ------------------ getNomLichen ------------------ function getNomLichen($lichenId) { $lichenId = intval($lichenId); $nom = selectOneValue("SELECT nom_latin FROM lichen WHERE id = :id", [':id'=>$lichenId]); return strip_tags($nom,''); } ?>