// // This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. // // To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/1.0/ // // or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. // // Francais (brouillon): http://creativecommons.org/projects/international/fr/translated-license // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Gestion des journaux // v0.2.0 class forum { var $parpage = 20; var $floodLimit = 30; var $listNb; var $chemin = "../datas/"; var $err = array( "stop" => "non", "log" => "oui", "debug" => "oui"); // Gestion des erreurs function _err($err,$debug="") { // Si le debug est activé if($this->err[debug] == "oui" && !empty($debug)) $err.= "\n// DEBUG //\n".$debug; // Si on log les erreurs if($this->err[log] == "oui") $this->erreurs[] = $err; // Si on s'arrête sur les erreurs if($this->err[stop] == "oui") { echo "
".htmlentities(stripslashes($err))."
"; exit; } $this->erreur = $err; return FALSE; } function getName($name) { if(is_numeric($name)) return ""; $name = strtr($name,array("à"=>"a","é"=>"e","è"=>"e","ç"=>"c","ù"=>"u","ê"=>"e","û"=>"u","ô"=>"o")); $name = ereg_replace("[^a-zA-Z0-9_ -]","",$name); $name = ereg_replace("(^[^a-zA-Z0-9]|[^a-zA-Z0-9]$)","",$name); if(strlen($name) > 30) { $name = substr($name,0,30); $name = substr($name,0,strrpos($name," ")); } $name = explode(" ",$name); foreach($name as $k=>$v) { $name[$k] = strtolower(trim($v)); } $name = implode("-",$name); if(empty($name) || $name == "sans-sujet") unset($name); return $name; } function parseText($texte) { $texte = htmlspecialchars(trim($texte)); $texte = eregi_replace( "(^|[ \t\r\n>])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|peercast|ed2k):". "[A-Za-z0-9/](([A-Za-z0-9$|.+!*(),;/?:@&~=_#-])|%[A-Fa-f0-9]{2})+)","\\1\\2",$texte); $texte = eregi_replace("(^|[ \t\r\n>])([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)", "\\0", $texte); $texte = nl2br($texte); return $texte; } function checkFlood($ip,$host) { $res = mysql_query('SELECT date FROM forums WHERE ip="'.$ip.'" OR host="'.$host.'" ORDER BY date DESC'); if(!$res) return FALSE; if(mysql_num_rows($res) < 1) return TRUE; $rec = mysql_fetch_row($res); if($rec[0] > (time() - $this->floodLimit)) return FALSE; return TRUE; } function cleanText($texte) { $unicode = array("–" => "-", "—" => "-", "‘" => "'", "’" => "'", "…" => "...", "“" => "\"", "”" => "\"", " "=>" ", "<"=>"<", ">"=>">","œ"=>"oe","…"=>"..."); $texte = strtr($texte,$unicode); return trim($texte); } function add($journal,$rec) { if(empty($rec['parent'])) $rec['parent'] = "0"; if(empty($rec['titre']) && $rec['parent'] == "0") return $this->_err("Le champ titre est vide."); elseif(empty($rec['texte'])) return $this->_err("Le champ texte est vide."); $date = time(); $ip = $_SERVER['REMOTE_ADDR']; $host = @gethostbyaddr($ip); $rec['texte'] = $this->cleanText($rec['texte']); if(!$this->checkFlood($ip,$host)) return $this->_err("Vous ne pouvez poster qu'un message toutes les ".$this->floodLimit." secondes."); if($rec['parent'] == "0") { $name = $this->getName($rec['titre']); $uri = date("Y-m-d-").$name; $res = mysql_query('SELECT id FROM forums WHERE journal="'.$journal.'" AND parent="0" AND uri="'.$uri.'"'); if(mysql_num_rows($res) > 0) $uri = date("Y-m-d-His"); mysql_free_result($res); } $requete = 'INSERT INTO forums SET journal="'.$journal.'", parent="'.$rec['parent'].'", uri="'.$uri.'", ip="'.$ip.'", host="'.$host.'", nom="'.$rec['nom'].'", email="'.$rec['email'].'", titre="'.$rec['titre'].'", date="'.$date.'", tempo="'.$date.'"'; $res = mysql_unbuffered_query($requete); if(!$res) return $this->_err("Problème technique.",mysql_error()); $newId = mysql_insert_id(); $requete = 'INSERT INTO forums_textes SET id="'.$newId.'", texte="'.$rec['texte'].'"'; $res = mysql_unbuffered_query($requete); if(!$res) return $this->_err("Problème technique.",mysql_error()); if($rec['parent'] < 1) $id = $newId; else $id = $rec['parent']; $this->cleanCache($journal); if($rec['parent'] > 0) { $rec2 = $this->getPostLight($journal,$rec['parent']); $this->updateCache($journal,$rec2['uri']); mysql_unbuffered_query('UPDATE forums SET tempo="'.$date.'", reponses = reponses + 1 WHERE id="'.$rec['parent'].'" AND journal="'.$journal.'"'); } return $id; } function modify($journal,$id,$rec) { $datas = $this->getPost($journal,$id); if(empty($rec['titre']) && $datas['parent'] == "0") return $this->_err("Le champ titre est vide."); elseif(empty($rec['texte'])) return $this->_err("Le champ texte est vide."); $rec['texte'] = $this->cleanText($rec['texte']); $requete = 'UPDATE forums SET nom="'.$rec['nom'].'", email="'.$rec['email'].'", titre="'.$rec['titre'].'", status="'.$rec['status'].'" WHERE id="'.$id.'" AND journal="'.$journal.'"'; $res = mysql_unbuffered_query($requete); if(!$res) return $this->_err("Problème technique.",mysql_error()); $requete = 'UPDATE forums_textes SET texte="'.$rec['texte'].'" WHERE id="'.$id.'"'; $res = mysql_unbuffered_query($requete); if(!$res) return $this->_err("Problème technique.",mysql_error()); $this->updateCache($journal,$datas['uri']); if($datas['parent'] == 0 && $rec['titre'] != $datas['titre']) $this->cleanCache($journal); return TRUE; } function getList($journal,$debut=0) { $res = mysql_query('SELECT * FROM forums WHERE journal="'.$journal.'" AND parent="0" ORDER BY tempo DESC LIMIT '.$debut.','.$this->parpage); if(!$res) return $this->_err("Problème technique.",mysql_error()); $nb = mysql_num_rows($res); if($nb < 1) return array(); else $this->listNb = $nb; while($rec = mysql_fetch_assoc($res)) $out[] = $rec; mysql_free_result($res); return $out; } function getPost($journal,$id) { $res = mysql_query('SELECT * FROM forums AS f,forums_textes AS t WHERE f.journal="'.$journal.'" AND f.id="'.$id.'" AND f.id=t.id'); if(!$res) return $this->_err("Problème technique.",mysql_error()); $out = @mysql_fetch_assoc($res); mysql_free_result($res); if(empty($out['id'])) return FALSE; $out['texte_html'] = $this->parseText($out['texte']); return $out; } function getPostLight($journal,$id) { $res = mysql_query('SELECT id,titre,parent,uri FROM forums WHERE journal="'.$journal.'" AND id="'.$id.'"'); if(!$res) return $this->_err("Problème technique.",mysql_error()); $out = @mysql_fetch_assoc($res); mysql_free_result($res); if(empty($out['id'])) return FALSE; return $out; } function getTopic($journal,$id) { $res = mysql_query("SELECT * FROM forums AS f,forums_textes AS t WHERE f.journal=\"{$journal}\" AND f.parent=\"{$id}\" AND f.id=t.id ORDER BY f.date"); if(!$res) return $this->_err("Problème technique.",mysql_error()); while($rec = mysql_fetch_assoc($res)) { $rec['texte_html'] = $this->parseText($rec['texte']); $out[] = $rec; } mysql_free_result($res); return $out; } function getPostFromUri($journal,$uri) { $res = mysql_query('SELECT id FROM forums WHERE journal="'.$journal.'" AND uri="'.$uri.'"'); list($id) = @mysql_fetch_row($res); if($id < 1) return FALSE; $rec = $this->getPost($journal,$id); return $rec; } function countTopics($journal) { $res = @mysql_fetch_row(mysql_unbuffered_query("SELECT COUNT(id) FROM forums WHERE journal=\"{$journal}\" AND parent=\"0\"")); return $res[0]; } function listPages($journal,$debut=0) { $total = $this->countTopics($journal); $nb = $this->listNb; $parpage = $this->parpage; if(empty($debut)) $debut = 0; if($total < $parpage) return array(); $total_pages = ceil($total / $parpage); $current = floor(($debut + $parpage) / $parpage); for($i=1;$i <= $total_pages;$i++) $out[$i] = ($i * $parpage) - $parpage; $out['current'] = $current; return $out; } function getTopicPostsIds($journal,$id) { $requete = 'SELECT id,uri FROM forums WHERE journal="'.$journal.'" AND (id="'.$id.'" OR parent="'.$id.'");'; $res = mysql_query($requete); $out = array(); while($rec = mysql_fetch_assoc($res)) $out[] = $rec; mysql_free_result($res); return $out; } function delete($journal,$id) { if(!is_array($id)) return FALSE; foreach($id as $i) { $rec = $this->getPostLight($journal,$i); if($rec['parent'] == "0") { $childIds = $this->getTopicPostsIds($journal,$i); foreach($childIds as $c) { mysql_unbuffered_query('DELETE FROM forums_textes WHERE id="'.$c['id'].'"'); $this->updateCache($journal,$c['uri']); } } $requete = 'DELETE FROM forums WHERE journal="'.$journal.'" AND (id="'.$i.'" OR parent="'.$i.'")'; $res = mysql_unbuffered_query($requete); $requete = 'DELETE FROM forums_textes WHERE id="'.$i.'"'; $res = mysql_unbuffered_query($requete); if($rec['parent'] > 0) { $requete = 'SELECT date FROM forums WHERE journal="'.$journal.'" AND (id="'.$rec['parent'].'" OR parent="'.$rec['parent'].'") ORDER BY date DESC LIMIT 0,1'; $rec2 = mysql_fetch_row(mysql_query($requete)); $requete = 'UPDATE forums SET reponses = reponses - 1, tempo="'.$rec2[0].'" WHERE journal="'.$journal.'" AND id="'.$rec['parent'].'"'; $res = mysql_unbuffered_query($requete); } $this->updateCache($journal,$rec['uri']); $this->cleanCache($journal); } return TRUE; } function getId($journal,$val) { if(is_numeric($val)) return $val; else { $res = mysql_query("SELECT id FROM forums WHERE journal=\"{$journal}\" AND uri=\"{$val}\""); if(@mysql_num_rows($res) < 1) return FALSE; $rec = mysql_fetch_row($res); @mysql_free_result($res); return $rec[0]; } return FALSE; } function updateCache($journal,$uri) { $path = $this->chemin."cache/".$journal."/"; $post = $path."forum_".str_replace("/","_",$uri); if(file_exists($post)) @unlink($post); return TRUE; } function cleanCache($journal) { $path = $this->chemin."cache/".$journal."/"; $dir = opendir($path); while($file = readdir($dir)) { if((substr($file,0,6) == "forum_+") || ($file == "forum")) @unlink($path.$file); } closedir($dir); return TRUE; } } ?>