Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrzuca błąd
Forum PHP.pl > Forum > Przedszkole
dareksbs
Witam,

Ostatnio do mojego formularza kontaktowego dopisałem funkcje dodawania screenów i dopiero teraz zauważyłem że nie działa ona porawnie, a konkretniej chodzi oto że nawet gdy screen nie jest dodany, skrypt wyrzuca błąd formatu pliku :

Struktura kodu wygląda mniejwięcej tak :

  1. if (isset($_FILES['picture'])) {
  2.  
  3. $ext = end(explode(".", $_FILES["picture"]["name"]));
  4. if ((($_FILES["picture"]["type"] == "image/gif") {
  5. Tutaj funkcja bla bla bla
  6. } else {
  7.  
  8. echo 'Możesz wysłać tylko pliki graficzne';
  9.  
  10. }
  11. } elseif (empty($_FILES['picture'])) {
  12. $screen = FALSE;
  13. }
  14.  


I problem polega na tym iż gdy pliku nie ma, zamiast przejść od razu do elseif empty to skrypt wykonuje pierwszego if'a i wyrzuca błąd "Możesz wysać tylko pliki tekstowe"
minolone
Kolejność powinna być if, elseif, else

Edit: Sorki teraz zauważyłam zagnieżdżonego if-a
b4rt3kk
A weź sobie daj na samym początku var_dump($_FILES). I co się wtedy okaże? Zresztą Twoja pętla nie ma racji bytu. Zobacz:

  1. if (isset($_FILES['picture'])) { // gdy istnieje tablica FILES
  2. } elseif (empty($_FILES['picture'])) { // gdy tablica FILES nie istnieje i gdy jest jest pusta. Jak może być pusta skoro nie istnieje?



dareksbs
Cytat(b4rt3kk @ 2.07.2013, 18:55:58 ) *
A weź sobie daj na samym początku var_dump($_FILES). I co się wtedy okaże? Zresztą Twoja pętla nie ma racji bytu. Zobacz:

  1. if (isset($_FILES['picture'])) { // gdy istnieje tablica FILES
  2. } elseif (empty($_FILES['picture'])) { // gdy tablica FILES nie istnieje i gdy jest jest pusta. Jak może być pusta skoro nie istnieje?



Czyli zamiast tego końcowego elseif wystarczy że dam po prostu if ?
czyli wtedy będzie jeśli tablica FILES jest pusta, wykonaj to co w klamrach.

Zgadza się ?
com
b4rt3kk

Php to magiczny język i nie sprawdza w empty czy zmienna istnieje wiec jak nie istnieje to jest równoznaczne z tym, że jest pusta...
http://php.net/manual/en/function.empty.php tongue.gif

problem tkwi własnie w isset dlatego iż nawet jeśli zmienna jest pusta to ona istnieje i dlatego wykonuje się ten kod, wiec zamiast tego daj
  1. if (!empty($_FILES['picture'])) {
  2. ...
  3. }
dareksbs
Cytat(com @ 2.07.2013, 19:27:51 ) *
b4rt3kk

Php to magiczny język i nie sprawdza w empty czy zmienna istnieje wiec jak nie istnieje to jest równoznaczne z tym, że jest pusta...
http://php.net/manual/en/function.empty.php tongue.gif

tak jak wspomniał kolega wrzuć var_dump($_FILES) bo najprawdopodobniej jednak tą zmienna tworzy, dlatego wykonuje pierwszą cześć


Czyli dla pewności, usuwam te elseif i daje samego if'a i nad if (isset($_FILES['picture'])) { daje var_dump($_FILES);
com
to elseif nie gra roli daj po prostu tak
  1. if (!empty($_FILES['picture'])) {
  2. ...
  3. } elseif (empty($_FILES['picture'])) {
  4. $screen = FALSE;
  5. }
dareksbs
Cytat(com @ 2.07.2013, 19:35:45 ) *
to elseif nie gra roli daj po prostu tak
  1. if (!empty($_FILES['picture'])) {
  2. ...
  3. } elseif (empty($_FILES['picture'])) {
  4. $screen = FALSE;
  5. }


To samo... cały czas wyrzuca tego elsa w pierwszym if'ie...
com
to w takim razie $_FILES['picture'] nie jest pusta, a co wygenerował var_dump?
dareksbs
Cytat(com @ 2.07.2013, 19:51:46 ) *
to w takim razie $_FILES['picture'] nie jest pusta, a co wygenerował var_dump?


Wyrzuca :
array(1) { ["picture"]=> array(5) { ["name"]=> string(0) "" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(4) ["size"]=> int(0) } } Możesz wysłać tylko pliki graficzne
com
no tak czyli z tego wynika ze $_FILES['picture'] istnieje... to spróbuj może
  1. if (!empty($_FILES["picture"]["name"])) { ... }
b4rt3kk
Cytat(com @ 2.07.2013, 20:27:51 ) *
b4rt3kk

Php to magiczny język i nie sprawdza w empty czy zmienna istnieje wiec jak nie istnieje to jest równoznaczne z tym, że jest pusta...
http://php.net/manual/en/function.empty.php tongue.gif

problem tkwi własnie w isset dlatego iż nawet jeśli zmienna jest pusta to ona istnieje i dlatego wykonuje się ten kod, wiec zamiast tego daj
  1. if (!empty($_FILES['picture'])) {
  2. ...
  3. }


Nie o to idzie, jest to logiczna implikacja. Jeśli coś nie istnieje, to nie może być puste, bo tego nie ma.


Cytat(dareksbs @ 2.07.2013, 20:56:42 ) *
Wyrzuca :
array(1) { ["picture"]=> array(5) { ["name"]=> string(0) "" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(4) ["size"]=> int(0) } } Możesz wysłać tylko pliki graficzne


var_dump miałeś sobie dać przed tymi if-ami. Chciałem żebyś zobaczył, że przesłanie pustego formularza i tak powoduje utworzenie tablicy $_FILES. Sprawdzanie isset ma tylko rację bytu jeśli do podanej strony użytkownik może się dostać bez konieczności wysyłania formularza.
com
b4rt3kk

owszem, z poziomu logiki masz rację, ja temu nie przeczę, bo to jest oczywiste, że jak coś nie istnieje to wiadomo, że nie może być puste... ale tak jak powiedziałem php się tym nie przejmuje bo dla niego coś jest puste w tych przypadkach:
Cytat
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var;
co zresztą wyraźnie pieszą w manualu...

zresztą prosty przykład :
http://ideone.com/6TWHbz
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.