Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Księga gości
Forum PHP.pl > Forum > Przedszkole
_bezimienny
Mam pewien problem. Chcę zrobić księgę gości opartą na plikach. Zatem...
Mam bazę danych w pliku baza.txt:
Cytat
user1|user1@mail.pl|wpis1
user2|user2@mail.pl|wpis2


Nastęnie zrobiłem skrypt czytający poszczególne dane:
  1. <?php
  2.  
  3. $j=1; // 1, bo są 2 wpisy
  4. for($i=$j; $i>0;$i--) // $i jest inkrementowane, żeby najnowsze były pierwsze
  5. {
  6. $user = file("baza.txt");
  7. $data = $user[$i];
  8. list($nick, $email, $wpis) = explode("|", $data);
  9. echo "$nick<br>";
  10. echo "$email<br>";
  11. echo "$wpis<br>";
  12. }
  13.  
  14. ?>

Chyba jest zrozumiały...

Teraz mój problem. Wyświetla mi tylko 1 wpis. Za pierwszym obiem $i=1, ok, skrypt działa, za drugim razem $i=0 - nie działa sad.gif

Nie wiem też jaką użyć funkcję, aby zczytało ile jest linijek w pliku :/ Być może lepiej użyć jakąś inną pętlę :?:

Prosze o pomoc!
pozdr
maverickkk
No bo z tego co widze to działa w druga stronę biggrin.gif

masz zwiększac a nie zmienszjać liczbe wyświetlanych wiadomości

Zresztą jak dasz $i=0 to przeanalizuj wygląd pętli $i=$j; $i>0;$i--) i co widzisz ?

pętla wykonuj się do puki $i jest większa od 0 to wiadomo oco chodzi

Co do liczby wierszy w pliku:

echo count(file('plik.php'));


... aha i $i jest Dekrementowana nie inkrementowana guitar.gif
siemakuba
zeby nie kombinowac za wiele:

1. wczytaj plik, jak napisal maverickkk, do tablicy
  1. <?php
  2.  
  3. $baza = file('baza.txt');
  4.  
  5. ?>


2. zaleznie od potrzeby odwroc sobie otrzymana tablice (nie pamietam w jakiej kolejnosci bedziesz mial dane wczytane przez file(), czy od konca czy poczatku pliku - sprawdz)

  1. <?php
  2.  
  3. $baza = array_reverse($baza);
  4.  
  5. ?>


3. dalej juz iteracja tablicy i wyswietlenie danych
  1. <?php
  2.  
  3.  
  4. for ($i = 0, $n=count($baza); $i < $n; $i++)
  5. {
  6. // list($nick, $email, $wpis) = explode('|', $baza[$i]);
  7. // itd.
  8. }
  9.  
  10. ?>


co musisz wiedziec?
file" title="Zobacz w manualu php" target="_manual, array_reverse" title="Zobacz w manualu php" target="_manual

dobrze by bylo sprawdzic na poczatku czy plik zostal wczytany i czy masz potrzebne dane, ale z tym z pewnoscia sobie poradzisz :)

pozdr.
_bezimienny
Wielkie dzięki, działa!
Na teraz wygląda od tak:
  1. <?php
  2.  
  3. $filename = "baza.txt";
  4. if(file_exists($filename)){
  5. $baza = file("baza.txt");
  6. $baza = array_reverse($baza);
  7. for ($i = 0, $n=count($baza); $i  < $n; $i++)
  8. {
  9. list($nick, $email, $wpis) = explode('|', $baza[$i]);
  10. echo "$nick<br>";
  11. echo "$email<br>";
  12. echo "$wpis<br><br>";
  13. }
  14. }
  15. else { echo "Baza nie istnieje!"; }
  16.  
  17. ?>

Na początku sprawdzam tylko czy plik istnieje. Dlaczego mam sprawdzać czy jest pusty albo czy się wczytał? Jest taka możliwość, żeby się nie wczytał?
Cytat
.. aha i $i jest Dekrementowana nie inkrementowana

Tak wiem, pomyliłem się worriedsmiley.gif rolleyes.gif
maverickkk
"Tak wiem, pomyliłem się"
tak wiem poprawiłem cie snitch.gif

"Dlaczego mam sprawdzać czy jest pusty"

Nigdzie niema warunku na sprawdzenie czy jest pusty? count($baza) w pętli służy do zliczenia ilości wierszy.

"albo czy się wczytał" to nie atari że coś się wczytuje. Jest plik to z niego korzystasz. nie ma to nie korzystasz.
siemakuba
Cytat
dobrze by bylo sprawdzic na poczatku czy plik zostal wczytany i czy masz potrzebne dane


skrót myslowy - zostal wczytany == masz potrzebne dane


_bezimienny: mea culpa, nie zauwazylem file_exists na początku.

Cytat
"albo czy się wczytał" to nie atari że coś się wczytuje. Jest plik to z niego korzystasz. nie ma to nie korzystasz.


drogi maverickkk, niestety mylisz się (bynajmniej w pewnych warunkach) :)

Kod
plik jest taki:
-rw-r-----    1 kuba     kuba            0 Apr 19 21:29 testfile.txt


  1. <?php
  2.  
  3. $e = file_exists('testfile.txt');
  4. var_dump($e);  
  5.  
  6. // zwraca true, znakiem to ze "Jest plik to z niego korzystasz"
  7.  
  8.  
  9. $f = file('testfile.txt');
  10. var_dump($f);  
  11.  
  12. // niestety, zwraca false, i do tego jeszcze:
  13. // Warning: file(testfile.txt): failed to open stream: Permission denied
  14.  
  15. ?>


to chyba dowodzi ze moze sie zdarzyc, ze jest plik, ale wcale z niego nie korzystasz :P

pozdr.
_bezimienny
Chciałem dorobić do tej księgi gości formularz dodawania wpisów, ale jakoś mi to nie wychodzi. Nie wiem co mam wpisać w <form action= > oraz jaką metodą, POST czy GET. Następna sprawa to jak zrobić, żeby dane, które wprowadzi użytkownik zostały przekazane jakimś zmiennym.
Z zapisaniem tych danych do pliku dałbym sobie już rade. Any ideas?
pozdr
matrach
$row masz zapisać do pliku
  1. <?php
  2. if (!isset($_POST['submit']))//jesli nie wysłane
  3. {
  4. //formularz
  5. echo '
  6. <form action="plik.php" method="POST">
  7. User: <input type="text" name="user" value="" /><br />
  8. E-mail: <input type="text" name="mail" value="" /><br />
  9. Treść:<br />
  10. <textarea name="tresc"></textarea><br />
  11. <input type="submit" name="submit" value="Wyślij" />
  12. </form>';
  13. }
  14. else
  15. {
  16. //user - user email - mail tresc - tresc posta
  17. //zamiana znaczników
  18. $user = htmlSpecialChars($_POST['user']);
  19. $email = htmlSpecialChars($_POST['mail']);
  20. //usuwanie nowych linii
  21. $tresc = str_replace("\r\n", "<br />", htmlSpecialChars($_POST['tresc']));
  22. //zmienna do zapisania w pliku
  23. $row = $user . '|' . $email . '|' . $tresc . "\n";
  24.  
  25.  
  26. }
  27. ?>

User - Nazwa usera podana w polu
Mail - E-mail podany w polu
Tresc - Tresc posta podany w textarea
_bezimienny
Czy wtedy plik.php miałby wyglądać tak?
  1. <?php
  2. $filename = "baza.txt";
  3. $fd = fopen($filename, "a");
  4. if($fd == null){ echo "Blad: nie mozna otorzyc pliku: $filename";
  5. return; }
  6. fwrite($fd, $row);
  7. fclose($fd);
  8. ?>
matrach
"Plik.php" cały odpowiada za zapisanie (formularz z zapisaniem).
Powinien wyglądać tak
  1. <?php
  2.  
  3. /*Tamto poprzednie co dałem
  4. ...
  5. i i teraz nie zamykaj ostatniego nawiasu z else*/
  6. $filename = "baza.txt";
  7. $fd = fopen($filename, "a") or die("Blad: nie mozna otorzyc pliku: $filename");
  8. fwrite($fd, $row);
  9. fclose($fd);
  10. }
  11.  
  12. ?>
_bezimienny
Tak jak podałeś to coś nie chciało działać. Zrobiłem tak:
Plik ksiega.php...
  1. <?php
  2. if (!isset($_POST['submit']))//jesli nie wysłane
  3. {
  4. echo '
  5. <form action="plik.php" method="POST">
  6. User: <input type="text" name="user" value="" /><br />
  7. E-mail: <input type="text" name="mail" value="" /><br />
  8. Treść:<br />
  9. <textarea name="tresc"></textarea><br />
  10. <input type="submit" name="submit" value="Wyślij" />
  11. </form>';
  12. }
  13. else
  14. {
  15.  $user = $_POST['user'];
  16. $email = $_POST['mail'];
  17. $tresc = $_POST['tresc']; 
  18. }
  19. ?>

I plik.php...
  1. <?php
  2. $filename = "baza.txt";
  3. $fd = fopen($filename, "a");
  4. if($fd == null){ echo "Blad: nie mozna otorzyc pliku: $filename";
  5. return; }
  6. fwrite($fd, $_POST['user'] . '|' . $_POST['mail'] . '|' . $_POST['tresc'] . "\n");
  7. fclose($fd);
  8. ?>

Teraz pięknie śmiga biggrin.gif THX!
Jak czegoś nie będę wiedział, to już wiem gdzie mam się pytać tongue.gif
Mam jeszcze jedno pytanie, jak sprawdzić czy zmienna $email na prawdę zawiera mail? Jest jakaś funkcja żeby szukała @ :?:
matrach
Cytat(_bezimienny)
Jest jakaś funkcja żeby szukała @ questionmark.gif

Phpedia.pl - weryfikacja maila
A odnośnie skryptu, to użytkownik jest nie obliczalny
np
- jeśli zrobi nową linię w texarea
- wpisze |

to ci sie wszystko rozwali.
dlatego powinieneś użyć czegoś takiego
  1. <?php
  2.  
  3. $zam['|'] = '|';
  4. $zam["\r\n"] = "<br />";//Nowa linia zalerzy od systemu
  5. $zam["\n"] = "<br />";
  6. //wyszukuje w stringu klucza i zamienia na wartośc tablicy
  7. $_POST['user'] = strtr($_POST['user'], $zam);
  8. $_POST['mail'] = strtr($_POST['mail'], $zam);
  9. $_POST['tresc'] = strtr($_POST['tresc'], $zam);
  10.  
  11. ?>

chociażby ze względu bezpieczeństwa.
Aby nie rozwalić układu/nie pozwolić na znaczniki użyj htmlspecialchars(), choć jeśli nie chcesz nie będe cie namawiał.
funkcja strtr()
@down spróbuj jeszcze htmlentities()
---EDIT---
Nie zauważyłem że skrypt do wyświetlania poostów na tym forum zamienia entity na zwykłe znaki/nie zamienia '&' na '&#38;'
_bezimienny
z htmlspecialchars() mi nie działało, ale jeszcze nad tym popracuję i dam znać co z tego wyszło

--EDIT--

Dzięki, skorzystałem z tego i teraz nie ma problemu.
  1. <?php
  2. zam['|'] = " ";
  3. $zam["\r\n"] = " ";//Nowa linia zalerzy od systemu
  4. $zam["\n"] = " ";
  5. //wyszukuje w stringu klucza i zamienia na wartośc tablicy
  6. $_POST['user'] = strtr($_POST['user'], $zam);
  7. $_POST['mail'] = strtr($_POST['mail'], $zam);
  8. $_POST['tresc'] = strtr($_POST['tresc'], $zam);
  9. ?>
Maveilthain
Witam.

Mam problem odnośnie księgi gości i update'u.
Wykorzystałem kod z książki "php 101 praktycznych skryptów" przerabiając go na Update do stronki aktualności. (tylko członkowie strony znają link do updatowania)

Struktura jest następująca:

- add.temp - formularz dodawania
- index.php - plik inkluduje 'main.temp'
- main.temp - cały wygląd stronki, który inkluduje na górze strony 'add.temp'a potem 'update.php'
- update.php - plik otwierający i wyświetlający wpisy
- update.txt - baza wpisów.

Wszystko działa nawet dobrze, za wyjątkiem odświerzania, bo gdy ktoś sobie wypełni formularz i klinknie na 'wyślij' to widzi nowy swój wpis, natomiast gdy klinkinie na 'odświerz' w swojej przeglądarce to kopiuje mu się ostatni wpis i jeżeli będzie tysiące razy klikał to powstanie tysiące takich samych wpisów - użyłem CHMODów i nic
może jakieś ?flock()? nie wiem jak zmodyfikować pomocy.
Oto kody:

add.temp
  1. <STYLE TYPE="text/css">
  2.    table {vertical-align: MIDDLE;}
  3.  </STYLE>
  4.  
  5. <FORM   ACTION="../update/index.php"
  6.        METHOD="post">
  7. <CENTER><TABLE  WIDTH="556" BORDER="1" CELLPADDING="0" CELLSPACING="0">
  8. <TR>
  9.    <TD>News:
  10.    </TD>
  11.    <TD>
  12.        <TEXTAREA style="overflow:hidden;" NAME="contents" ROWS="5" COLS="85"></TEXTAREA>
  13.    </TD>
  14. </TR>
  15. <TR>
  16.    <TD COLSPAN="2"><P ALIGN="RIGHT">
  17.    <INPUT TYPE="text" NAME="who">
  18.    </TD>
  19. <TR>
  20.    <TD>
  21.        <INPUT TYPE="submit" VALUE="Dodaj">
  22.    </TD>
  23. </TR>
  24. </FORM>


index.php
  1. <?php
  2.  include("main.temp")
  3. ?>


main.temp
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
  2. <HTML>
  3. <HEAD>
  4. <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=ISO-8859-2">
  5. <META NAME="author" CONTENT="Michał Ligus">
  6. <META HTTP-EQUIV="reply-to" CONTENT>
  7. <META NAME="description" CONTENT>
  8. <META NAME="keywords" CONTENT>
  9. <META NAME="copyright" CONTENT="Michał Ligus">
  10. <META HTTP-EQUIV="content-language" CONTENT="pl">
  11. <META HTTP-EQUIV="creation-date" CONTENT="2006-03-04 18:53:10">
  12. <TITLE>Dodawanie Newsów</TITLE>
  13. <STYLE TYPE="text/css">
  14. table {color: #FFFFFF;}
  15. </STYLE>
  16. </HEAD>
  17.  
  18. <BODY BGCOLOR="BLACK">
  19. <CENTER>
  20. <TABLE BORDER="0" WIDTH="780">
  21. <TR>
  22. <TD WIDTH="755" ALIGN="center" VALIGN="TOP">
  23.  
  24. Dodaj News
  25.  
  26. </TD>
  27. </TR>
  28. <TR>
  29. <TD ALIGN="center" VALIGN="TOP">
  30. <?php
  31.  
  32. include('add.temp')
  33.  
  34. ?>
  35. </TD>
  36. </TR>
  37. </TABLE>
  38. <TABLE BORDER="0" WIDTH="780">
  39. <?php
  40.  
  41. include('update.php')
  42.  
  43. ?>
  44. </TD>
  45. </TABLE>
  46. </BODY>
  47. </HTML>



update.php
  1. <?php
  2.  
  3. $contents = $_POST["contents"];
  4. $who = $_POST["who"];
  5. $data = date("d.m.");
  6. $rok = date("Y");
  7. $czas = date(" G:i");
  8. $linia01 = "<TR><TD ALIGN=\"LEFT\"><P ALIGN=\"justify\"><FONT FACE=\"EngrvrsOldEng Bd BT\" COLOR=\"#ffff00\">R</FONT>ecz, ";
  9. $linia02 = "<FONT FACE=\"EngrvrsOldEng Bd BT\"><FONT COLOR=\"#ffff00\">A.</FONT>D. ";
  10. $linia03 = "</FONT><BR><HR COLOR=\"#7093db\">";
  11. $linia04 = "<P ALIGN=\"RIGHT\"><SMALL>";
  12. $linia05 = "</SMALL></P></P></TD></TR>";
  13.  
  14. function readNews()
  15. {
  16. $contents = "";
  17. $fp = fopen("update.txt", "r");
  18. while(!feof($fp)){
  19. $contents .= fgets($fp) . "<BR>";
  20. }
  21. fclose($fp);
  22. return $contents;
  23. }
  24. function addNews($contents, $who, $data, $rok, $czas, $linia01, $linia02, $linia03, $linia04, $linia05)
  25. {
  26. chmod("update.txt". "666");
  27. $fp = fopen("update.txt", "r");
  28. $tempC = fread($fp, filesize("update.txt"));
  29. fclose($fp);
  30. $fp = fopen("update.txt", "w");
  31. fputs($fp, $linia01. $data. $linia02. $rok. $czas. $linia03. $contents. $linia04. $who. $linia05. "\r");
  32. fputs($fp, $tempC);
  33. fclose($fp);
  34. }
  35. if($contents == "" && $who == ""){
  36. print(readNews());
  37. }
  38. else{
  39. addNews($contents, $who, $data, $rok, $czas, $linia01, $linia02, $linia03, $linia04, $linia05);
  40. chmod("update.txt". "644");
  41. print(readNews());
  42. }
  43. ?>
nospor
tu masz male co nieco na temat odswierzania:
http://forum.php.pl/index.php?showtopic=44383
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.