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 ! Erreur : '.$msg.' '.$msg.'
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);
}
?>
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 '