Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt "komentarze"
Forum PHP.pl > Forum > PHP
majestiq
Znalazłem w siecie taki prosty skrypcik:

  1. <?php
  2. */
  3. if ($message)
  4.    {
  5.    /* uncomment the next two lines to strip out html from input */
  6.    /* $name = strip_tags($name); */
  7.    /* $message = strip_tags($message); */
  8.    $message = ereg_replace("r\nr\n", "\n<P>", $message);
  9.    $date = date("l, F j Y, h:i a");
  10.    $message = "<B>$name </B> -- $date<P> $message <BR><HR>";
  11.    $fp = fopen (basename($PHP_SELF) . ".comment", "a");
  12.    fwrite ($fp, $message);
  13.    fclose ($fp);
  14.    }
  15. @readfile(basename(($PHP_SELF . ".comment")));
  16. ?>
  17. <FORM method="post">
  18. <b>Your name:</b><BR><INPUT name="name" type="text" size="55"><BR>
  19. <b>Your comment:</b><BR><TEXTAREA name="message" rows=10 cols=55 wrap=virtual>
  20. </TEXTAREA><BR>
  21. <INPUT name="submit" type="submit" value="Post your comments">
  22. </FORM>
  23.  
  24. </body>
  25. </html>


Działa on w ten sposób, że kod dokleja się do każdej podstrony na której ma znajdować się możliwość dodania komentarza, i jeżeli komentarz zostanie dodany
to skrypt tworzy spobie plik: nazwa_danej_podstrony.php.comment i na tej podstawie wiadomo, że dany komentarz ma się wyświetlić tylko na danej stronie.
Niestety skrypt nie działa dla stron z parametrami np: nazwa_danej_podstrony?action=file&id=10 bo wtedy utworzy tak jak wyzej poprostu plik nazwa_danej_podstrony.php.comment

Chyba trzeba by tutaj zamiast PHP_SELF użyć REQUEST_URI albo coś w tym stylu.

Czy ktoś mógłby mi pomóc to przerobić ?
thornag
Dodaj do funkcji parametr z customowa nazwa pliku i uzyj go pozniej do zapisania go pod odpowiednia nazwa.
majestiq
Ale nazwa pliku jest już z góry ustalona, więc on sam powinien sobie ją pobrać, tylko tak jak mówie pobiera ale pomija wszystkie dodatkowe parametry po "?".
misiek172
wydaje mi sie że chodzi tutaj o parametr:

basename

http://pl.php.net/manual/pl/function.basename.php

pobiera on główną nazwe pliku obcinając reszte
majestiq
No chyba tutaj właśnie leży problem, tylko jak to poprawić ?
erix
Cytat
ale pomija wszystkie dodatkowe parametry po "?".

$_SERVER['QUERY_STRING']. I proponowałbym dodatkowo ubezpieczyć ten ciąg, bo ktoś może Ci narobić kuku. tongue.gif
majestiq
Zajebiście, działa biggrin.gif
Co do ubezpieczenia ciągu to chodzi ci np. o htmlspecialchars ?

No i jeszcze jedna sprawa, jakby to przerobić, żeby nie korzystać z plików .txt
tylko z bazy danych.

Do podmiany byłoby tylko to:

  1. <?php
  2. $fp = fopen (basename($_SERVER['QUERY_STRING']) . ".comment", "a");
  3.   fwrite ($fp, $message);
  4.   fclose ($fp);
  5.   }
  6. @readfile(basename(($_SERVER['QUERY_STRING'] . ".comment")));
  7. ?>
erix
Cytat
Co do ubezpieczenia ciągu to chodzi ci np. o htmlspecialchars ?

Nie. Rób tak, aby nikt nie mógł nadpisać Ci dowolnego pliku albo zapisywać go gdzie ktoś inny zechce, a nie Ty. tongue.gif

Cytat
No i jeszcze jedna sprawa, jakby to przerobić, żeby nie korzystać z plików .txt
tylko z bazy danych.

To już wtedy przerób cały skrypt, bo w takiej strukturze będzie on po prostu mało efektywny. Jak? Skryptów komentarzy masz sporo, właściwie, to wystarczy Ci parę podstawowych zapytań, które są opisane w pierwszym lepszym kursie MySQL. winksmiley.jpg
majestiq
Cytat(erix @ 17.12.2008, 09:59:55 ) *
Nie. Rób tak, aby nikt nie mógł nadpisać Ci dowolnego pliku albo zapisywać go gdzie ktoś inny zechce, a nie Ty. tongue.gif


Łatwo powiedziec tongue.gif

Cytat
To już wtedy przerób cały skrypt, bo w takiej strukturze będzie on po prostu mało efektywny. Jak? Skryptów komentarzy masz sporo, właściwie, to wystarczy Ci parę podstawowych zapytań, które są opisane w pierwszym lepszym kursie MySQL. winksmiley.jpg


Wlasnie specjalnie szukalem jak najmniej skomplikowanego skryptu, zeby latwo bylo go przerobic na wersje bazodanową.
Czemu myslisz, ze zamiana tej czesci kodu, ktora podalem bedzie malo efektywna ?
Narazie chyba jednak bede musial pozostac przy tej wersji.

Poprostu chcialbym w jakiejs kolumnie zapisac nazwe pliku (tak jak nazwa pliku w wersji textowej)
i do niej przyporzadkowac tresc komentarza, autora i date.
erix
Cytat
Łatwo powiedziec

Jeśli zaglądało się do manuala i odrobinę myśli, to łatwo.

Cytat
Czemu myslisz, ze zamiana tej czesci kodu, ktora podalem bedzie malo efektywna ?

Skoro zapisujesz nazwy plików, to efektywniej będzie zapisywać komentarze bezpośrednio do bazy, a nie taką hybrydę. Po to są bazy danych, aby z nich korzystać. smile.gif
majestiq
Cytat(erix @ 17.12.2008, 15:33:34 ) *
Jeśli zaglądało się do manuala i odrobinę myśli, to łatwo.

A jak np. ktos moze mi nadpisac ten plik lub zapisać go gdzieś indziej questionmark.gif

NIe wiele już brakuje.
Tylko nie mogę wyświetlić tego co chce za pomocą SELECTa :/

  1. <?php
  2. Header('Content-type: text/html; charset=utf8');
  3.  
  4.  
  5. $conn = mysql_connect('localhost, 'mp', 'pass');
  6. mysql_select_db ("mp4") or die ("Nie mozna wybrac bazy danych");
  7.  
  8. $q = 'USE mp4';
  9.  
  10.  
  11.  
  12. $ans = mysql_query($q, $conn);
  13. if (!$ans) print mysql_error($conn);
  14.  
  15.  
  16.    $strona = $_SERVER['QUERY_STRING'];
  17.   $nick = $_POST['nick'];
  18.   $message = $_POST['message'];
  19.   $message = strip_tags($message);
  20.   $message = ereg_replace("r\nr\n", "\n<P>", $message);
  21.   $date = date("l, F j Y, h:i a");
  22.  
  23. if ($message)
  24.  
  25.  
  26.  
  27.   {
  28.   $qrry = "INSERT INTO komentarze (query_string, nick, tresc, data) VALUES ('$strona', '$nick', '$message', '$data');";
  29.    $ans = mysql_query($qrry, $conn);
  30.   if (!$ans) print mysql_error($conn);
  31. }
  32.  
  33.  
  34. $wypisz = "SELECT * FROM komentarze WHERE query_string='$strona'";
  35. $answ = mysql_query($wypisz, $conn);
  36.  
  37. // wyświetlany wyniki zapytania
  38.    while($rek = mysql_fetch_array($answ)) {
  39.        echo $rek['nick]."<br />";
  40.              }
  41.  
  42. ?>
  43.  
  44.  
  45. <FORM method="post">
  46. <p style="font-size:10px; color:#000; font-family:arial;">Nick:</p><BR><INPUT name="nick" type="text" size="55"><BR>
  47. <p style="font-size:10px; color:#000; font-family:arial;">Komentarz:</p><BR><TEXTAREA name="message" rows=10 cols=55 wrap=virtual>
  48. </TEXTAREA><BR>
  49. <INPUT name="submit" type="submit" value="Dodaj komentarz">
  50. </FORM>
erix
Cytat
A jak np. ktos moze mi nadpisac ten plik lub zapisać go gdzieś indziej

Będę sobie wpisywał nazwy plików w QUERY_STRING. tongue.gif Ale widzę, że poprawiłeś basename" title="Zobacz w manualu PHP" target="_manualm.

Cytat
Tylko nie mogę wyświetlić tego co chce za pomocą SELECTa :/

Sprawdź składnię kodu.
majestiq
No wlasnie sprawdzalem juz chyba ze 100 razy i probowalem na rozne sposoby ale SELECT mi dalej nie działa :/
erix
Jak ma zadziałać, jak masz niepoprawnie skonstruowane zapytania...?

Masz funkcję mysql_error" title="Zobacz w manualu PHP" target="_manual i kursy MySQL. Korzystaj.
majestiq
E tam niepoprawnie, było bylo dobrze tylko jakos zle to testowalem smile.gif
W kazdym razie dzieki za pomoc !
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.