Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Warning: fclose() expects parameter 1 to be resource, integer given in
Forum PHP.pl > Forum > Przedszkole
michat34
witam, oprocz bledu zadam o razu 2. pytanie aby nie zakladac nowego watku. ale najpierw blad wink.gif
kod:
  1. echo 'Rejestracja przebiegla pomyslnie';
  2. $fp = fopen("uzytkownicy.txt",a);
  3. $login2 = $_POST['login2'];
  4. $haslo2 = $_POST['haslo2'];
  5. $fp = fwrite($fp,"$login2|");
  6. fclose($fp);
  7. $fp2 = fopen("passy.txt",a);
  8. $fp2 = fwrite($fp2,"$login2 = $haslo2|");


wyskakuje error - Warning: fclose() expects parameter 1 to be resource, integer given in...

moglby ktos wyjasnic dlaczego? wydaje mi sie ze uzylem wszystkiego jak nalezy, fclose wymaga uchwytu, jest uchwyt: $fp. ale mimo wszystko napewno cos zle zrobilem wiec prosze o wskazanie bledu. i teraz pytanie:
na kursie wyczytalem ze nalezy zamykac pliki funkcja fclose gdy skonczymy cos do nich zapisywac. bylo to dosyc mocno podkreslone. tutaj nie zamknalem ani $fp ani $fp2 i cały skrypt (wydaje sie ze) dziala jak nalezy. stad moje pytanie: co jezeli ignorowaloby sie zamykanie plikow, jakie sa konsekwencje?

dziekuje i pozdrawiam
pitu
fclose wymaga uchwytu na otwarty plik. U Ciebie $fp wskazuje na
  1. fwrite($fp,"$login2|");


untorched
Lekka poprawka, mam nadzieje, że nie poczujesz się urażony, a jedynie to co dodam pomoże Ci w dalszym pisaniu smile.gif
  1. $login2 = isset($_POST['login2']) ? $_POST['login2'] : ''; // Usunięcie notice
  2. $haslo2 = isset($_POST['haslo2']) ? $_POST['haslo2'] : ''; // j/w
  3. $errors = array(); // zmienna typu array do przechowywania błędów
  4.  
  5. $fp = fopen('uzytkownicy.txt', 'a'); // otwarcie pliku
  6. if($fp !== FALSE) // jeśli zwrot funkcji fopen jest różny od false to znaczy że się udało
  7. {
  8. fwrite($fp, $login2.'|');
  9. fclose($fp);
  10. }
  11. else // nie udało się, dopisanie błędu
  12. {
  13. $errors[] = 'Nie mozna otworzyc pliku uzytkownicy.txt ani zapisac w nim danych!';
  14. }
  15.  
  16. $fp2 = fopen('passy.txt', 'a');
  17. if($fp2 !== FALSE)
  18. {
  19. fwrite($fp2, $login2.' = '.$haslo2.'|');
  20. fclose($fp2);
  21. }
  22. else
  23. {
  24. $errors[] = 'Nie mozna otworzyc pliku passy.txt ani zapisac w nim danych!';
  25. }
  26.  
  27. if($errors == array()) // Nie dodano żadnego błędu
  28. {
  29. echo 'Rejestracja przebiegla pomyslnie';
  30. }
  31. else // Wpisanie listy błędów
  32. {
  33. implode('<br>', $errors);
  34. }


Pyt. 1#: Zapomniałeś o wpisaniu apostrofu(czy jak to się tam zwie) w drugim parametrze funkcji fopen() w obu przypadkach, co prawdopodobnie skutkowało błędem. Ooops, faktycznie, tak jak kolega wyżej zauważył to na pewno wina przypisania zmiennej $fp do funkcji fwrite, ale myślę, że konstrukcja fopen() bez apostrofów również dałaby błąd.

Pyt. 2#: Nie znam prawidłowej odpowiedzi, ale przypuszczam, że wiąże się to z zwolnieniem pamięci.
Crozin
@untorched: Formalnie, wypadałoby jeszcze sprawdzać czy fwrite i fclose wykonały się w pełni poprawnie. Ot, cudowne API PHP-owskiej biblioteki standardowej.
@michat34: W momencie gdy skrypt PHP kończy swoją pracę wszystkie zewnętrzne zasoby (m.in. uchwyty do plików) są zamykane i zwalniane. Także nawet jeżeli byś w skrypcie mocno nawalił, istnieje duże prawdopodobieństwo, że nic złego się nie stanie. Nie mniej jednak, niezamknięcie pliku:
1. Niepotrzebnie wydłuża czas, gdy jest on otwarty, czyli wydłuża czas istnienia blokady systemowej na pliku.
2. Nie jestem pewien jak wygląda dokładnie implementacja fwrite w PHP, ale istnieje szansa, że jeżeli nie zamkniesz pliku w pewnych przypadkach żadne dane nie zostaną do niego zapisane. Tu należy pamiętać, że ostatecznie PHP zwalnia wszystkie zasoby, ale istnieje możliwość, że jego praca zostanie gwałtownie przerwana (np. brak zasilania).
michat34
Cytat(pitu @ 26.08.2012, 02:18:44 ) *
fclose wymaga uchwytu na otwarty plik. U Ciebie $fp wskazuje na
  1. fwrite($fp,"$login2|");


faktycznie a jak to poprawic? powinienem po fwrite na nowo go otworzyc (fopen) i wtedy zamknac?
untorched
Cytat(michat34 @ 26.08.2012, 11:39:17 ) *
faktycznie a jak to poprawic? powinienem po fwrite na nowo go otworzyc (fopen) i wtedy zamknac?


To o czym mówisz zostało poprawione w skrypcie który podałem smile.gif
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.