Autor Zpráva
peklis
Profil *
Ahoj,
rád bych dal na web (bez RS) možnost primitivního komentování článků. Na Googlu jsem hledal, ale nikde jen jednoduchý kód. Já se s php teprv učím, a zatim mi to moc nejde :D.
Představoval bych si to nějak takhle, ale jednodušeji, v tom formuláři na přidávání by stačilo jen jméno a text komentáře..
Pomůžete mi pls?
Díky
ninja
Profil
Můžete využít třeba Facebook komentáře, nepotřebujete ani PHP.
Chamurappi
Profil
Reaguji na ninju:
Čímž si odřízne nemalou část lidí, kteří kašlou na Facebook.
peklis
Profil *
To je zajímavé řešení, ale radši bych měl ten php kód, protože se php učím a postupně bych to vylepšoval..
nemeja
Profil
Tady jsem ti napsal na rychlo jednoduchý systém na komentáře, kde se to ukládá do souboru.
Kod vlož do souboru.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>
  <?php 
    $delimeter="/*f1f*\\"; // delimeter můžeš ponechat 
    $cesta_souboru="log.txt"; // cesta k souboru TXT, do kterého se budou daný komentáře ukládat
    $umisteni_scriptu=""; //umístění tohoto souboru
    if(isset($_POST['komentar'])){  //pokud kliknou na odeslat tak se to začne zpracovávat
      if(!in_array("",array($_POST['jmeno'],$_POST['email'],$_POST['text']))){   //zkontroluje, zda vyplnili všechny položky 
        $soubor=file_get_contents($cesta_souboru);  // načtu si soubor s předchozíma komentářema 
        $zapis=$soubor."\n".$_POST['jmeno'].$delimeter.$_POST['email'].$delimeter.$_POST['text']; //přidám starý text + si dám delimetr mezi jednotlivé nové stringy
        file_put_contents($cesta_souboru, $zapis); //přepíšu soubor 
      } else {
        echo "<b>Nemáte zadané všechny hodnoty.</b><br>"; // pokud nejsou zadané všechny hodnoty, vypíše to tuto hlášku
      }    
    }
    $komentare=file_get_contents($cesta_souboru); // načtení souboru do proměnné
    $rozdeleni_radky=explode("\n",$komentare); // rozdělení dle řádků => na jednotlivé příspěvky
    if(count($rozdeleni_radky)!=0){ // pokud je v něm víc jak jeden komentář
      for($i=0;$i<count($rozdeleni_radky);$i++){ // cyklus, pro všechny komentáře
        $roztrzeni=explode($delimeter,$rozdeleni_radky[$i]); // roztržení dle delimetru
        $koment=array("jmeno" => $roztrzeni[0] , "email" => $roztrzeni[1], "text" => $roztrzeni[2]); // pro hezčí vypisování přidáno do array 
        echo "<b>Jmeno:</b> ".$koment['jmeno']."<br>";     // jednoduché vypsání 
        echo "<b>Email:</b> ".$koment['email']."<br>";
        echo "<b>Text:</b> ".$koment['text']."<br>";
        echo "<hr><br>";
      }
    } else {
      echo "Nebyl zatím zadán žádný komentář"; // vypsání hlášky, že zatím nebyl zadán žádný komentář
    }                                       
  ?>  
    
    <form method="POST">
      Jmeno:<input type="text" name="jmeno"><br>
      Email:<input type="email" name="email"><br>
      Text:<textarea name="text"></textarea><br>
      <input type="submit" value="Odeslat" name="komentar">   
    </form>
  </body>
</html>
peklis
Profil *
Díky moc, jdu to vyzkoušet :)
nemeja
Profil
Jj, jako update navrhuji:
-Změna editoru na nějakej hezčí + podporu BB kodu( stačí preg_replace();
-Ošetření aby nešel vložit jscript
-přejít na databázové řešení
peklis
Profil *
Je to přesně co jsem potřeboval, díky..
Ale má to pár chybek, je tam napsane "Nemáte zadané všechny hodnoty." ještě před pokusem to komentovat, divné je že je tam Jmeno, text a email také ještě než to bylo komentovane, a je tam nějaká chyba nebo poznámka k řádku číslo 29, což je tady:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=ISO8859-2">
  <title>Komentáře</title>
  </head>
  <body>
  
  <p>Tohle je článek který má být komentován</p>
  
  <?php 
    $delimeter="  -  "; // delimeter můžeš ponechat 
    $cesta_souboru="log.txt"; // cesta k souboru TXT, do kterého se budou daný komentáře ukládat
    $umisteni_scriptu=""; //umístění tohoto souboru
    if(isset($_POST['komentar'])){  //pokud kliknou na odeslat tak se to začne zpracovávat
      if(!in_array("",array($_POST['jmeno'],$_POST['email'],$_POST['text']))){   //zkontroluje, zda vyplnili všechny položky 
        $soubor=file_get_contents($cesta_souboru);  // načtu si soubor s předchozíma komentářema 
        $zapis=$soubor."\n".$_POST['jmeno'].$delimeter.$_POST['email'].$delimeter.$_POST['text']; //přidám starý text + si dám delimetr mezi jednotlivé nové stringy
        file_put_contents($cesta_souboru, $zapis); //přepíšu soubor 
      } else {
        echo "<b>Nemáte zadané všechny hodnoty.</b><br>"; // pokud nejsou zadané všechny hodnoty, vypíše to tuto hlášku
      }    
    }
    $komentare=file_get_contents($cesta_souboru); // načtení souboru do proměnné
    $rozdeleni_radky=explode("\n",$komentare); // rozdělení dle řádků => na jednotlivé příspěvky
    if(count($rozdeleni_radky)!=0){ // pokud je v něm víc jak jeden komentář
      for($i=0;$i<count($rozdeleni_radky);$i++){ // cyklus, pro všechny komentáře
        $roztrzeni=explode($delimeter,$rozdeleni_radky[$i]); // roztržení dle delimetru
        $koment=array("jmeno" => $roztrzeni[0] , "email" => $roztrzeni[1], "text" => $roztrzeni[2]); // pro hezčí vypisování přidáno do array
        echo "<b>Jmeno:</b> ".$koment['jmeno']."<br>";     // jednoduché vypsání 
        echo "<b>Email:</b> ".$koment['email']."<br>";
        echo "<b>Text:</b> ".$koment['text']."<br>";
        echo "<hr><br>";
      }
    } else {
      echo "Nebyl zatím zadán žádný komentář"; // vypsání hlášky, že zatím nebyl zadán žádný komentář
    }                                       
  ?>
    
    <form method="POST">
      Jmeno:<input type="text" name="jmeno"><br>
      Email:<input type="email" name="email"><br>
      Text:<textarea name="text"></textarea><br>
      <input type="submit" value="Odeslat" name="komentar">   
    </form>
  </body>
</html>

přidám radši ještě screen:


ještě jednou díky
nemeja
Profil
vložte na první řádek první komentář
ninja
Profil
Kód od nemeja není ošetřen ani základně ošetřen proti zneužití, toto bych kamkoliv jinam než na localhost rozhodně nenasazoval.

Chamurappi: Sice odříznu určitou část uživatelů (v ČR je zrovna penetrace facebookem relativně velká), na druhou stranu mám ale bez práce funkční komentáře, které může další přinášet nemalou návštěvnost. O pohodlnosti pro uživatele (facebooku) ani nemluvě...
peklis
Profil *
nemeja
Tohle nechápu, ten script je funkční jen když je tam alespoň 1 komentář?
Nešlo by to udělat tak že když tem nebude žádný, vypíše to třeba "tento článek ještě nikdo nekomentoval", nebo něco podobného?

mimochodem četl jsem o těch databázích a docela mě to zaujalo, neznáte nějaký web kde je to srozumitelně vysvětleno?

ninja
zneužití mě netrápí, jsem začátečník a stejně bych to nepochopil.. navíc nevidím důvod proč by někdo chtěl zneužít můj web, nic by z toho neměl..
nemeja
Profil
ninja:
Kód od nemeja není ošetřen ani základně ošetřen proti zneužití, toto bych kamkoliv jinam než na localhost rozhodně nenasazoval.
Ano není nijak ošetřen:

peklis:
rád bych dal na web (bez RS) možnost primitivního komentování článků

To je zajímavé řešení, ale radši bych měl ten php kód, protože se php učím a postupně bych to vylepšoval..

to zabezpečení si může dát jako první vylepšení ;)
peklis
Profil *
nemeja:
vložte na první řádek první komentář
I když tam přidám komentář, nápis "nemáte zadané všechny hodnoty" zmizí, ale stejně tam zůstane toto:


Notice: Undefined offset: 1 in C:\Program Files\EasyPHP-5.3.8.1\www\komenty.php on line 29

Notice: Undefined offset: 2 in C:\Program Files\EasyPHP-5.3.8.1\www\komenty.php on line 29
Jmeno:
Email:
Text:
nemeja
Profil
Upravil jsem to, ted stačí jen zadat název souboru, pokud neexistuje tak se vytvoří. Dále jsem udělal, že pokud je řádek prázdný, tak ho to přeskočí
upravený kod
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>
  <?php 
    $delimeter="/*f1f*\\"; // delimeter můžeš ponechat 
    $cesta_souboru="log.txt"; // cesta k souboru TXT, do kterého se budou daný komentáře ukládat
    $umisteni_scriptu=""; //umístění tohoto souboru
    if(!file_exists($cesta_souboru)){ // pokud neexistuje soubor do kterého se má zapisovat, tak ho vytvoří
      file_put_contents($cesta_souboru,"");
    }
    if(isset($_POST['komentar'])){  //pokud kliknou na odeslat tak se to začne zpracovávat
      if(!in_array("",array($_POST['jmeno'],$_POST['email'],$_POST['text']))){   //zkontroluje, zda vyplnili všechny položky 
        $soubor=file_get_contents($cesta_souboru);  // načtu si soubor s předchozíma komentářema 
        $zapis=$soubor."\n".$_POST['jmeno'].$delimeter.$_POST['email'].$delimeter.$_POST['text']; //přidám starý text + si dám delimetr mezi jednotlivé nové stringy
        file_put_contents($cesta_souboru, $zapis); //přepíšu soubor 
      } else {
        echo "<b>Nemáte zadané všechny hodnoty.</b><br>"; // pokud nejsou zadané všechny hodnoty, vypíše to tuto hlášku
      }    
    }
    $komentare=file_get_contents($cesta_souboru); // načtení souboru do proměnné
    $rozdeleni_radky=explode("\n",$komentare); // rozdělení dle řádků => na jednotlivé příspěvky
    if(count($rozdeleni_radky)!=0){ // pokud je v něm víc jak jeden komentář
      for($i=0;$i<count($rozdeleni_radky);$i++){ // cyklus, pro všechny komentáře
        if($rozdeleni_radky[$i]!=""){
          $roztrzeni=explode($delimeter,$rozdeleni_radky[$i]); // roztržení dle delimetru
          $koment=array("jmeno" => $roztrzeni[0] , "email" => $roztrzeni[1], "text" => $roztrzeni[2]); // pro hezčí vypisování přidáno do array 
          echo "<b>Jmeno:</b> ".$koment['jmeno']."<br>";     // jednoduché vypsání 
          echo "<b>Email:</b> ".$koment['email']."<br>";
          echo "<b>Text:</b> ".$koment['text']."<br>";
          echo "<hr><br>";
        } echo "Nebyl zatím zadán žádný komentář<br>"; // vypsání hlášky, že zatím nebyl zadán žádný komentář
      }
    } else {
      echo "Nebyl zatím zadán žádný komentář<br>"; // vypsání hlášky, že zatím nebyl zadán žádný komentář
    }                                       
  ?>  
    
    <form method="POST">
      Jmeno:<input type="text" name="jmeno"><br>
      Email:<input type="email" name="email"><br>
      Text:<textarea name="text"></textarea><br>
      <input type="submit" value="Odeslat" name="komentar">   
    </form>
  </body>
</html>
Dej si pozor, pokud změníš delimeter a v logu už něco bude, tak ti to nebude fungovat, můžeš si udělat ale fci, která ti to předělá na ten novej delimeter - str_replace()
Keeehi
Profil
Problém dělá (nebo bude dělat) pokud někdo v komentáři použije enter.


Nějaká vylepšení:
ř. 13-15: smazat
ř. 18-20: file_put_contents($cesta_souboru, str_replace("\n","",htmlspecialchars($_POST['jmeno'])).$delimeter. str_replace("\n","",htmlspecialchars($_POST['email'])).$delimeter. str_replace("\n","",nl2br(htmlspecialchars($_POST['text'])))."\n", FILE_APPEND);
ř. 29, 36: smazat

Po těchto úpravách nebude ani enter vadit a mělo by to být snad i bezpečné. Jinak to ošetření jsem musel udělat už při ukládání. To není správný postup, ale to by těch úprav pak muselo být více. Jinak v ostrém provozu by to chtělo vypnout vypisování chybových hlášek.
peklis
Profil *
Keeehi:
Díky moc, ale když to upravím jak jsi psal, vypíše to chbu na řádku 25, což je
$koment=array("jmeno" => $roztrzeni[0] , "email" => $roztrzeni[1], "text" => $roztrzeni[2]);
a nevím proč..
Keeehi
Profil
Důležité je znění té chyby.
peklis
Profil *
Notice: Undefined offset: 1 in C:\Program Files\EasyPHP-5.3.8.1\www\komenty.php on line 25

Notice: Undefined offset: 2 in C:\Program Files\EasyPHP-5.3.8.1\www\komenty.php on line 25
nemeja
Profil
vypiš sem co máš v proměnné cesta_souboru a pak sem hod co máš v tom souboru, dej to do uvozovek at jsou videt i prázdné řádky.
Keeehi
Profil
peklis:
Aha, asi jsem měl zdůraznit, že je potřeba ten původní soubor vymazat, protože ty staré řádky způsobují tyto hlášky. Ty nově přidané už by měly být v pořádku.
peklis
Profil *
Díky :)
Patrick
Profil *
peklis jo jen takovou maalou prozbu kde by se to mělo ukládat ty komenty co tam někdo napíše ? taky jsem takovej nováček :D
Someone
Profil
Nečetl jsem zbylé komentáře, ale asi bych tipoval, že do souboru. Nedávno jsem tvořil jednodušší návod na návštěvní knihu (může posloužit stejně jako komentáře pod článek).
zalesak05
Profil
Ahoj,
trochu jsem s tím experimentoval, ale vždy mi po odeslání vyskočila tato chyba: Fatal error: Call to undefined function: file_put_contents() in /3w/czechian.net/k/kozubova/komentare/1.php on line 15

Kód tam mám takový:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title>Komentáře</title>
  </head>
  <body>
  <?php 
    $delimeter="/*f1f*"; // delimeter můžeš ponechat 
    $cesta_souboru="koment.txt"; // cesta k souboru TXT, do kterého se budou daný komentáře ukládat
    $umisteni_scriptu="kozubova.czechian.net/komentare/"; //umístění tohoto souboru
    if(isset($_POST['komentar'])){  //pokud kliknou na odeslat tak se to začne zpracovávat
      if(!in_array("",array($_POST['jmeno'],$_POST['text']))){   //zkontroluje, zda vyplnili všechny položky 
        file_put_contents($cesta_souboru, str_replace("n","",htmlspecialchars($_POST['jmeno'])).$delimeter. str_replace("n","",htmlspecialchars($_POST['email'])).$delimeter. str_replace("n","",nl2br(htmlspecialchars($_POST['text'])))."n", FILE_APPEND); 
      } else {
        echo "<b>Nemáte zadané všechny hodnoty.</b><br>"; // pokud nejsou zadané všechny hodnoty, vypíše to tuto hlášku
      }    
    }
    $komentare=file_get_contents($cesta_souboru); // načtení souboru do proměnné
    $rozdeleni_radky=explode("n",$komentare); // rozdělení dle řádků => na jednotlivé příspěvky
    if(count($rozdeleni_radky)!=0){ // pokud je v něm víc jak jeden komentář
      for($i=0;$i<count($rozdeleni_radky);$i++){ // cyklus, pro všechny komentáře
          $roztrzeni=explode($delimeter,$rozdeleni_radky[$i]); // roztržení dle delimetru
          $koment=array("jmeno" => $roztrzeni[0] , "email" => $roztrzeni[1], "text" => $roztrzeni[2]); // pro hezčí vypisování přidáno do array 
          echo "<b>Jmeno:</b> ".$koment['jmeno']."<br>";     // jednoduché vypsání 
          echo "<b>Email:</b> ".$koment['email']."<br>";
          echo "<b>Text:</b> ".$koment['text']."<br>";
          echo "<hr><br>";
      }
    } else {
      echo "Nebyl zatím zadán žádný komentář<br>"; // vypsání hlášky, že zatím nebyl zadán žádný komentář
    }                                       
  ?>  
    
    <form method="POST">
      Jmeno:<input type="text" name="jmeno"><br>
      Email:<input type="email" name="email"><br>
      Text:<textarea name="text"></textarea><br>
      <input type="submit" value="Odeslat" name="komentar">   
    </form>
  </body>
</html>
Nevíte, proč ta chyba vyskakuje a jak ji napravit? Díky

PS: jsem úplný začátečník, tak prosím tak, abych tomu rozumněl, díky ;)
Davex
Profil
zalesak05:
Zkus jiný webhosting. Na tom tvém je zastaralá verze PHP, kde ještě nebyly funkce file_put_contents() a file_get_contents().

Nebo si je doprogramuj podle http://atom.dosimple.ch/docs/html/d6/d2/fct_8inc_8php-source.html.
zalesak05
Profil
díky :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: