Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Księga gości
_bezimienny
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
maverickkk
post
Post #2





Grupa: Zarejestrowani
Postów: 181
Pomógł: 0
Dołączył: 12.11.2005

Ostrzeżenie: (0%)
-----


No bo z tego co widze to działa w druga stronę (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif)

Ten post edytował maverickkk 19.04.2006, 18:10:27
Go to the top of the page
+Quote Post
siemakuba
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
_bezimienny
post
Post #4





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

Ostrzeżenie: (0%)
-----


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ę (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif) (IMG:http://forum.php.pl/style_emoticons/default/rolleyes.gif)

Ten post edytował _bezimienny 19.04.2006, 19:39:35
Go to the top of the page
+Quote Post
maverickkk
post
Post #5





Grupa: Zarejestrowani
Postów: 181
Pomógł: 0
Dołączył: 12.11.2005

Ostrzeżenie: (0%)
-----


"Tak wiem, pomyliłem się"
tak wiem poprawiłem cie (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
siemakuba
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
_bezimienny
post
Post #7





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
matrach
post
Post #8





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

Ostrzeżenie: (0%)
-----


$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

Ten post edytował matrach 21.04.2006, 18:33:29
Go to the top of the page
+Quote Post
_bezimienny
post
Post #9





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
matrach
post
Post #10





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

Ostrzeżenie: (0%)
-----


"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. ?>
Go to the top of the page
+Quote Post
_bezimienny
post
Post #11





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) THX!
Jak czegoś nie będę wiedział, to już wiem gdzie mam się pytać (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Mam jeszcze jedno pytanie, jak sprawdzić czy zmienna $email na prawdę zawiera mail? Jest jakaś funkcja żeby szukała @ :?:

Ten post edytował _bezimienny 22.04.2006, 17:29:01
Go to the top of the page
+Quote Post
matrach
post
Post #12





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

Ostrzeżenie: (0%)
-----


Cytat(_bezimienny)
Jest jakaś funkcja żeby szukała @ (IMG:http://forum.php.pl/style_emoticons/default/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;'

Ten post edytował matrach 22.04.2006, 19:28:39
Go to the top of the page
+Quote Post
_bezimienny
post
Post #13





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 19.03.2006
Skąd: Wisła

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował _bezimienny 24.04.2006, 16:22:37
Go to the top of the page
+Quote Post
Maveilthain
post
Post #14





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 27.02.2006
Skąd: Recz

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Maveilthain 4.05.2006, 11:05:19
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




tu masz male co nieco na temat odswierzania:
http://forum.php.pl/index.php?showtopic=44383
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 10:56