Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odczytanie pliku
Forum PHP.pl > Forum > Przedszkole
rabit1111
Witam
Mam takie małe pytanie dlaczego funkcja readfile(); zwraca zawartość pliku z jedynką na końcu.
Oto skrypt:
<?
$banner[] = "banner1.htm";
$banner[] = "banner2.htm";
$banner[] = "banner3.htm";
//banner[] = "nazwapliku4.htm"; itd
srand(time());
$i = rand(0,count($banner) - 1);
if(file_exists($banner[$i])) echo readfile($banner[$i]) or die ("Brak pliku bannera.");
?>

a to jego wynik:

<html><head>
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-2" />
<title>[ Tytul dokumentu ]</title></head><body>
<img src="banner1.gif" width="300" height="200" border="0" />
</body></html>
1 <-------i ta własnie jedynka wyświetla się obok banera.

Następna sprawa to funkcja file_get_contents(); , która z kolei w tym samym skrypcie zwraca tylko jedynkę zamiast pliku.
Oto skrypt:
<?
$banner[] = "banner1.htm";
$banner[] = "banner2.htm";
$banner[] = "banner3.htm";
//banner[] = "nazwapliku4.htm"; itd
srand(time());
$i = rand(0,count($banner) - 1);
if(file_exists($banner[$i])) echo file_get_contents($banner[$i]) or die ("Brak pliku bannera.");
?>

Jeśli ktoś wie cokolwiek na ten temat proszę o wyjaśnienie tej kwestii, z góry dziękuję.
nospor
file_get_contents(); zwraca ci treść pliku. A że treścią jest html, to echo przetwarza html i wyświetlany jest html, anie jego treść. A że ten html nic nie wyświetla to się nie dziw. Widzisz 1 po jest poza html i jest wysietlana normalnie.
A co do tej jedynki. To nie wiem skąd się bierze. MOże jest w pliku zapisana?
dr_bonzo
A co masz w plikach banner*.html?

W manualu pisze

int readfile ( string filename [, bool use_include_path [, resource context]] )
Reads a file and writes it to the output buffer.
Returns the number of bytes read from the file

  1. <?php
  2. echo readfile($banner[$i])
  3. ?>

Czyli wypisujesz liczbe wczytanych bajtow!!!
nospor
ale @rabit1111 napisal ze mu 1 wywala. Przecież widać, że wczytał więcej niż jeden bajt.
dr_bonzo
READ FILE:
dla:
  1. <?php
  2. $banner[] = &#092;"banner1.htm\";
  3. $banner[] = &#092;"banner2.htm\";
  4. $banner[] = &#092;"banner3.htm\";
  5. $i = rand(0,count($banner) - 1);
  6. if ( file_exists( $banner[ $i ] ) )
  7. {
  8.     echo( readfile($banner[$i]) );
  9. }
  10. else
  11. {
  12.     die (&#092;"Brak pliku bannera.\");
  13. }
  14. ?>

dostaje:
  1. <html><head><meta http-equiv="Content-type" content="text/html; charset=ISO-8859-2" />
  2. <title>[ Tytul dokumentu ]</title></head><body><img src="banner1.gif" width="300" height="200" border="0" />banner1.gif</body></html>224


bannerX.htm
  1. <html><head><meta http-equiv="Content-type" content="text/html; charset=ISO-8859-2" />
  2. <title>[ Tytul dokumentu ]</title></head><body><img src="bannerX.gif" width="300" height="200" border="0" />bannerX.gif</body></html>


czyli dopisuje wielkosc pliku.
file_get_contents()
  1. <?php
  2. $banner[] = &#092;"banner1.htm\";
  3. $banner[] = &#092;"banner2.htm\";
  4. $banner[] = &#092;"banner3.htm\";
  5. //banner[] = \"nazwapliku4.htm\"; itd
  6. $i = rand(0,count($banner) - 1);
  7. //!!!!!!!!!!!!!!!!! uzywaj takich konstrukcji warunkowych a nie or!!!!!!!!!!!
  8. if ( file_exists( $banner[ $i ] ) )
  9. {
  10.     echo( file_get_contents($banner[$i]) );
  11. }
  12. else
  13. {
  14.     die (&#092;"Brak pliku bannera.\");
  15. }
  16.  
  17. ?>


no i teraz jest OK:
  1. <html><head><meta http-equiv="Content-type" content="text/html; charset=ISO-8859-2" /><title>[ Tytul dokumentu ]</title></head><body><img src="bannerX.gif" width="300" height="200" border="0" />
  2. bannerX.gif
  3. </body></html>


Wniosek
  1. <?php
  2.  
  3. //!!!!!!!!!!!!!!!!! uzywaj takich konstrukcji warunkowych a nie or!!!!!!!!!!!
  4. if ( file_exists( $banner[ $i ] ) )
  5. {
  6.     echo( file_get_contents($banner[$i]) );
  7. }
  8. else
  9. {
  10.     die (&#092;"Brak pliku bannera.\");
  11. }
  12. ?>


dlaczego?
bo
  1. <?php
  2. if ( file_exists( $banner[ $i ] ) ) echo file_get_contents($banner[$i]) or die (&#092;"Brak pliku bannera.\");
  3. ?>

jest rozumiane jako:
jesli plik istnieje to
wypisz ( tresc pliku LUB die() )

---
"tresc pliku LUB die()" bedzie mialo wartosc logiczna z powodu "or", a wypisanie
$x = true;
echo $x
wypisze 1.
ckd. tongue.gif
nospor
ja się z Twoim sposobem zgadzam, tylko się zastanawiam czemu rabit1111 napisal że mu jedynkę wywala, skoro powinno 224. Albo jest jeszcze jakiś inny błąd, albo ta jedynka z jego nicka się wzięła tongue.gif
rabit1111
Witam
Dr_bonzo masz rację readfile dopisuje wielkość pliku na jego końcu , a przy konstrukcji z or dopisuje wartość logiczną tego warunku , natomiast file_get_contents wyświetlała wartość tego warunku bez zawartości pliku, po zastosowaniu twoich modyfikacji wszystko zrobilo się jasne file_get_contents przy zastosowaniu else zamiast or normlnie wyswietla plik natomiast readfile wyświetla plik dodając na jego końcu jego wielkość czyli to jest trochę więcej niż jeden. Dzięki za wyjaśnienie tego problemu. Zastanawia mnie tylko jedno czy można za pomocą readfile wyświetlać pliki bez liczby ich bajtów? I dlaczego w manualu nic o tym nie pisze , bo zanim zrobiłem post to sprawdzałem. Jeszcze raz dzięki.
nospor
readfile ma to do siebie, że sama wyrzuca na zewnątrz dane. Czyli nie trzeba robić echo readfile(...)
ty jak robiles echo, to readfile wyrzucal tresc pliku, a ty wyrzucales to co zwracal readfile czyli liczbe bajtów
rabit1111
OK WSZYSTKO GRA DZIEKI
dr_bonzo
Cytat
Zastanawia mnie tylko jedno czy można za pomocą readfile wyświetlać pliki bez liczby ich bajtów? I dlaczego w manualu nic o tym nie pisze , bo zanim zrobiłem post to sprawdzałem


readfile" title="Zobacz w manualu PHP" target="_manual
Cytat
int readfile ( string filename [, bool use_include_path [, resource context]] )
Reads a file and writes it to the output buffer.
Returns the number of bytes read from the file.


Przeciez tu wszystko pisze (tongue.gif jest napisane).

Wypisuje zawartosc pliku i zwraca ilosc wczytanych bajtow, ktora ty wypisywales:
  1. <?php
  2. echo( readfile($banner[$i]) );
  3. ?>
rabit1111
Sorry musiałem przeoczyć.
Wielkie dzięki.
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.