fork(1) download
  1. <?php
  2. /* Fichier PHP: "gestioncommentaires.php"
  3. +------------------------------------------------------------------------------+
  4. | Extension pour une fonction "ajout de commentaires" |
  5. | Tedheu 2009, version 1.0 (fr), mise à jour le 09 novembre 2009 |
  6. | Module script PHP de gestion des commentaires |
  7. | fonctionne de paire avec le module JavaScript "commentaires.js" |
  8. +------------------------------------------------------------------------------+
  9. */
  10. /*========= Paramètres de personnalisation ===================================*/
  11. // Chaque message a un parametre de validation (index 'v' du tableau $Message)
  12. // avec une valeur de 0 le message est stocké mais ne sera pas affiché
  13. // avec une valeur de 1 le message est stocké et sera affiché
  14. // avec une valeur de -1 le message sera retiré du fichier de stockage
  15. $validmesdef= 1; // validation par défaut des messages
  16. //
  17. /*========= Variables (initialisation) =======================================*/
  18. $jeton= NULL; // normalement communiqué par variables GET
  19. $sujet= NULL; // normalement communiqué par variables GET
  20. $action= NULL; // normalement communiqué par variables GET
  21. //---
  22. $entetedef= '|=== Fichier de commentaires, T² 09 novembre 2009 - version 1.0 ===|'."\n";
  23. $nouveau= false; // message pas nouveau par défaut
  24. $imesnou= -1; // indice nouveau message mis à -1
  25. //--- messages => tableau de tableaux
  26. // le visteur envoi un commentaire avec d'autres informations l'ensemble forme un message
  27. $Message= array();
  28. $Message['*']= array(); // * > jeton
  29. $Message['s']= array(); // s > sujet
  30. $Message['v']= array(); // v > validation, -1, 0 ou 1 , 0 > non validé, -1 > rejeté
  31. $Message['i']= array(); // i > numéro IP
  32. $Message['d']= array(); // d > date du jour
  33. $Message['h']= array(); // h > heure
  34. $Message['n']= array(); // n > nom
  35. $Message['c']= array(); // c > commentaire
  36. $Message['r']= array(); // r > réservé pour usage futur
  37. //--- deux actions possibles: lecture, écriture
  38. $Actionliste= array('lecture','ecriture');
  39. //--- données pour traitement de sécurisation
  40. $tagspermis= '<b><i><u><a><br><small><img>';
  41. $Evenements= array('onAbort','onBlur','onChange','onClick','onDbclick','onDragdrop','onError','onFocus','onKeydown','onKeypress','onKeyup','onLoad','onMouseOver','onMouseOut','onReset','onResize','onSelect','onSubmit','onUnload');
  42. foreach ($Evenements as $evenement){$Clefs[]= '/'.$evenement.'/i';}
  43. $Car_nr= array("\n\r","\r\n","\n","\r");
  44. $Carspe= array('&','ç','¨','£','µ','§','²','³','¤','¿','±');
  45. array_push($Carspe,'à','â','ä','ã','é','è','ê','ë','î','ï','ô','ö','õ','ù','û','ü');
  46. array_push($Carspe,'Â','Ä','Ã','Ê','Ë','Î','Ï','Ô','Ö','Õ','Û','Ü');
  47. array_push($Carspe,'ñ','Ñ');
  48. foreach ($Carspe as $car){$Carchgs[]= htmlentities($car);}
  49. array_push($Carspe,'%','^');
  50. array_push($Carchgs,'%','^');
  51. //-----------------------------------------------------------------------------/
  52. /*========= Récupération d'informations ======================================*/
  53. //--- informations générales
  54. $ipc=$_SERVER['REMOTE_ADDR']; // numéro IP du visiteur
  55. $jour= date('d.m.Y');
  56. $heure= date('H:i');
  57. //--- variables passées par méthode GET
  58. (!empty($_GET['sujet']))? $sujet=$_GET['sujet']: $sujet='aucun';
  59. (!empty($_GET['action']))? $action=$_GET['action']: $action='rien';
  60. (!empty($_GET['jeton']))? $jeton= $_GET['jeton']: $jeton= '0';
  61. //--- traitements des informations GET entrantes
  62. $sujet= substr(strip_tags($sujet),0,30);
  63. $sujet_r= substr(strip_tags($sujet),0,10);
  64. if (!in_array($action,$Actionliste)) $action='rien';
  65. $jeton= preg_replace('/[^0-9]/','',$jeton); // que des chiffres
  66. $jeton= substr($jeton,0,10);
  67. //-----------------------------------------------------------------------------/
  68. /*========= Validation de la requête =========================================*/
  69. $valide= true;
  70. if ($sujet=='aucun') $valide= false;
  71. if ($action=='rien') $valide= false;
  72. if ($jeton=='0') $valide= false;
  73. if (!$valide) {
  74. // arret du script par sécurité si requête non valide
  75. }
  76. /*========= Créations de fichiers si inexistants =============================*/
  77. $nomfichier_verrou= 'verrou_'.$sujet_r.'.txt';
  78. $nomfichier_messag= 'messages_'.$sujet_r.'.txt';
  79. if (!file_exists($nomfichier_verrou)) touch($nomfichier_verrou);
  80. if (!file_exists($nomfichier_messag)){
  81. $pf0=fopen($nomfichier_messag,'w');
  82. fwrite($pf0,$entetedef);
  83. fclose($pf0);
  84. }
  85. //-----------------------------------------------------------------------------/
  86. //
  87. /*========= Mode écriture ($action= 'ecriture') ==============================*/
  88. if ($action=='ecriture'){
  89. $nouveau= true; // on suppose un nouveau message
  90. //
  91. //=== variables passées par méthode POST ----------------------------------/
  92. (!empty($_POST['nom']))? $nom= $_POST['nom']: $nom= 'inconnu';
  93. (!empty($_POST['message']))? $commentaire= $_POST['message']: $commentaire= '';
  94. //--- traitements des informations POST entrantes
  95. $nom= strip_tags($nom);
  96. $nom= str_replace($Car_nr,'',$nom);
  97. $nom= htmlentities(substr($nom,0,20));
  98. $commentaire= strip_tags($commentaire,$tagspermis);
  99. $commentaire= preg_replace($Clefs,'none',$commentaire);
  100. $commentaire= str_replace($Carspe,$Carchgs,$commentaire);
  101. $commentaire= str_replace($Car_nr,'<br>',$commentaire);
  102. $commentaire= preg_replace('/\\\/','',$commentaire); // plus d'anti-slash
  103. //-------------------------------------------------------------------------/
  104. //=== accès au fichier des messages en lecture/écriture -------------------/
  105. //--- mise en place du verrou -------------------------
  106. $deb= time(); $tempo= 2; $erreur= '';
  107. do{
  108. $verrou= file($nomfichier_verrou);
  109. if (count($verrou)==0) break;
  110. }while((time()-$deb)<=$tempo);
  111. if (count($verrou)!=0){ // (le verrou est resté bloqué)
  112. $erreur.= '-- blocage-verrou --';
  113. if ((time()-trim($verrou[0]))>=10){
  114. $erreur.= ' -- deblocage-force --';
  115. $pfv=fopen($nomfichier_verrou,'w');
  116. fwrite($pfv,'');
  117. fclose($pfv);
  118. }
  119. }
  120. else{ // (si pas d'erreur fermeture du verrou)
  121. $pfv=fopen($nomfichier_verrou,'w');
  122. fwrite($pfv,time());
  123. fclose($pfv);
  124. }
  125. if ($erreur!='') die('ERREUR: '.$erreur);
  126. //-----------------------------------------------------
  127. //--- lecture du fichier de messages ligne par ligne
  128. $pf1= fopen($nomfichier_messag,'r');
  129. $n=-1;
  130. while (!feof($pf1)) $ligne[++$n]=fgets($pf1,1024);
  131. fclose($pf1);
  132. $nlgn= $n;
  133. //-------------------------------------------------------------------------/
  134. //=== analyse du contenu et traitement ------------------------------------/
  135. $entete=$ligne[0]; // la première ligne est une entête
  136. $imesnou= 0; // indice nouveau message = 0
  137. if ($nouveau){
  138. $Message['*'][0]= $jeton;
  139. $Message['s'][0]= $sujet;
  140. $Message['v'][0]= $validmesdef;
  141. $Message['i'][0]= $ipc;
  142. $Message['d'][0]= $jour;
  143. $Message['h'][0]= $heure;
  144. $Message['n'][0]= $nom;
  145. $Message['c'][0]= $commentaire;
  146. $Message['r'][0]= 'RFU';
  147. }
  148. //--- traitement ligne par ligne
  149. $imes= 1;
  150. $jeton_tst= false; $ipc_tst= false; $heure_tst= false;
  151. for ($ilgn=1; $ilgn<=$nlgn; $ilgn++){
  152. $clef= substr($ligne[$ilgn],0,3);
  153. $contenu= str_replace($Car_nr,'',substr($ligne[$ilgn],3));
  154. switch($clef){
  155. case '\\*\\': // jeton
  156. $Message['*'][$imes]= $contenu;
  157. ($jeton==$contenu)? $jeton_tst= true: $jeton_tst= false; break;
  158. case '\\s\\':
  159. $Message['s'][$imes]= $contenu;
  160. case '\\v\\':
  161. $Message['v'][$imes]= $contenu;
  162. case '\\i\\':
  163. $Message['i'][$imes]= $contenu;
  164. ($ipc==$contenu)? $ipc_tst= true: $ipc_tst= false; break;
  165. case '\\d\\':
  166. $Message['d'][$imes]= $contenu;
  167. ($jour==$contenu)? $d_tst= true: $d_tst= false; break;
  168. case '\\h\\':
  169. $Message['h'][$imes]= $contenu;
  170. $mindif= substr($heure,3,4) - substr($contenu,3,4);
  171. ($mindif<=5)? $heure_tst= true: $heure_tst= false;
  172. $heudif= substr($heure,0,2) - substr($contenu,0,2);
  173. if ($heudif!=0) $heure_tst= false;
  174. break;
  175. case '\\n\\':
  176. $Message['n'][$imes]= $contenu; break;
  177. case '\\c\\':
  178. $Message['c'][$imes]= $contenu; break;
  179. case '\\r\\':
  180. $Message['r'][$imes]= $contenu; break;
  181. case '\\-\\':
  182. // fin de message
  183. if ($nouveau AND $jeton_tst AND $ipc_tst AND $heure_tst){
  184. // le même que le nouveau
  185. $imesnou= $imes; // indice nouveau message
  186. $Message['h'][$imes]= $heure;
  187. $Message['n'][$imes]= $nom;
  188. $Message['c'][$imes]= $commentaire;
  189. }
  190. $imes++; // au suivant
  191. $jeton_tst= false; $ipc_tst= false; $heure_tst= false;
  192. break;
  193. }
  194. }
  195. $nmes= $imes-1;
  196. //--- réduction des messages si le champ $commentaire est vide
  197. if ($commentaire==''){
  198. $Message['v'][$imesnou]= -1;
  199. $nouveau= 0;
  200. }
  201. //-------------------------------------------------------------------------/
  202. //=== reecriture du fichier de messages -----------------------------------/
  203. $pf2=fopen($nomfichier_messag,'w');
  204. fwrite($pf2,$entete);
  205. ($nouveau AND ($imesnou==0))? $imesdeb=0: $imesdeb=1;
  206. for ($imes=$imesdeb; $imes<=$nmes; $imes++){
  207. if ($Message['v'][$imes]== -1) continue; // '-1'> le message est effacé
  208. fwrite($pf2,'\\*\\'.$Message['*'][$imes]."\n");
  209. fwrite($pf2,'\\s\\'.$Message['s'][$imes]."\n");
  210. fwrite($pf2,'\\v\\'.$Message['v'][$imes]."\n");
  211. fwrite($pf2,'\\i\\'.$Message['i'][$imes]."\n");
  212. fwrite($pf2,'\\d\\'.$Message['d'][$imes]."\n");
  213. fwrite($pf2,'\\h\\'.$Message['h'][$imes]."\n");
  214. fwrite($pf2,'\\n\\'.$Message['n'][$imes]."\n");
  215. fwrite($pf2,'\\c\\'.$Message['c'][$imes]."\n");
  216. fwrite($pf2,'\\r\\'.$Message['r'][$imes]."\n");
  217. fwrite($pf2,'\\-\\----------'."\n");
  218. }
  219. fclose($pf2);
  220. //-------------------------------------------------------------------------/
  221. //=== libération du verrou ------------------------------------------------/
  222. $pfv=fopen($nomfichier_verrou,'w');
  223. fwrite($pfv,'');
  224. fclose($pfv);
  225. //-------------------------------------------------------------------------/
  226. }// $action== 'ecriture'
  227. //
  228. /*========= Mode lecture ($action= 'lecture') ================================*/
  229. if ($action=='lecture'){
  230. $nouveau= false; // pas de nouveau message
  231. //--- lecture du fichier de messages lignes par lignes
  232. $pf1= fopen($nomfichier_messag,'r');
  233. $n=-1;
  234. while (!feof($pf1)) $ligne[++$n]=fgets($pf1,1024);
  235. fclose($pf1);
  236. $nlgn= $n;
  237. //-------------------------------------------------------------------------/
  238. //=== analyse du contenu et traitement ------------------------------------/
  239. $entete=$ligne[0]; // la première ligne est une entête
  240. //--- traitement ligne par ligne
  241. $imes= 1;
  242. for ($ilgn=1; $ilgn<=$nlgn; $ilgn++){
  243. $clef= substr($ligne[$ilgn],0,3);
  244. $contenu= substr($ligne[$ilgn],3);
  245. $contenu= str_replace($Car_nr,'',$contenu);
  246. switch($clef){
  247. case '\\v\\':
  248. $Message['v'][$imes]= $contenu; break;
  249. case '\\d\\':
  250. $Message['d'][$imes]= $contenu; break;
  251. case '\\h\\':
  252. $Message['h'][$imes]= $contenu; break;
  253. case '\\n\\':
  254. $Message['n'][$imes]= $contenu; break;
  255. case '\\c\\':
  256. $Message['c'][$imes]= $contenu; break;
  257. case '\\-\\': // fin de message
  258. $imes++; // au suivant
  259. break;
  260. }
  261. }
  262. $nmes= $imes-1;
  263. }// $action== 'lecture'
  264. //-----------------------------------------------------------------------------//
  265.  
  266. /*========= Affichage ========================================================*/
  267. if ($nouveau){
  268. $imes= $imesnou;
  269. echo('<hr><fieldset>');
  270. echo('<legend>Votre nouveau message est enregistré : <i>( vous pouvez encore le modifier )</i></legend>');
  271. echo(' Nom: '.$Message['n'][$imes].'<br>');
  272. echo($Message['c'][$imes]);
  273. echo('</fieldset>');
  274. }
  275. //
  276. echo('<hr>');
  277. for ($imes=1; $imes<=$nmes; $imes++){
  278. if ($Message['v'][$imes]== 0) continue; // '0'> le message n'est pas affiché
  279. if ($imes != $imesnou){
  280. echo('<b>Nom :</b> '.$Message['n'][$imes].' ');
  281. echo('<b>Date :</b> '.$Message['d'][$imes].' '.$Message['h'][$imes].'<br>');
  282. echo($Message['c'][$imes].'<br>');
  283. echo('<hr>'."\n");
  284. }
  285. }
  286. //-----------------------------------------------------------------------------/
  287. ?>
Success #stdin #stdout #stderr 0.01s 20568KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Notice:  Undefined index: REMOTE_ADDR in /home/hclKyK/prog.php on line 54