// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
0=>'There is no error, the file uploaded with success',
1=>'The uploaded file exceeds the upload max filesize allowed.',
2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
3=>'The uploaded file was only partially uploaded',
4=>'No file was uploaded',
6=>'Missing a temporary folder'
);
Jakieś pomysły? Po 2 dniach wciąż utknąłem.
Odpowiedzi:
Przypisz wynik
explode
do zmiennej i przekaż tę zmienną doend
:Problem polega na tym, że
end
wymaga odwołania, ponieważ modyfikuje wewnętrzną reprezentację tablicy (tzn. Powoduje, że wskaźnik bieżącego elementu wskazuje na ostatni element).Wynik
explode('.', $file_name)
nie może zostać przekształcony w odniesienie. Jest to ograniczenie w języku PHP, które prawdopodobnie istnieje ze względu na prostotę.źródło
error_reporting
. Czy to jest bezpieczne?error_reporting
. Ślepe ignorowanie błędów nie jest bezpieczne. Wyłączenieerror_reporting
to duży krok w kierunku ślepego ignorowania błędów. W środowisku produkcyjnymdisplay_errors
zamiast tego wyłącz i zapisz błędy w pliku dziennika.Właściwe użycie zgodne z php 7:
źródło
@
przedrostek?Wszyscy inni podali już powód, dla którego wystąpił błąd, ale oto najlepszy sposób na zrobienie tego, co chcesz:
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
źródło
zapisz tablicę z explode () do zmiennej, a następnie wywołaj end () na tej zmiennej:
btw: używam tego kodu, aby uzyskać rozszerzenie pliku:
gdzie
strrchr
wyodrębnia ciąg po ostatnim.
isubstr
odcina.
źródło
Spróbuj tego:
Powodem jest to, że argument argumentu
end
jest przekazywany przez odwołanie, ponieważend
modyfikuje tablicę, przesuwając jej wewnętrzny wskaźnik do końcowego elementu. Jeśli nie przekazujesz zmiennej, nic nie wskazuje na odniesienie.Więcej informacji znajduje się
end
w podręczniku PHP.źródło
PHP narzeka, ponieważ
end()
oczekuje odniesienia do czegoś, co chce zmienić (może to być tylko zmienna). Jednak przekazujesz wynikexplode()
bezpośrednio doend()
bez zapisywania go najpierw w zmiennej. W momencie, gdyexplode()
zwraca twoją wartość, istnieje ona tylko w pamięci i żadna zmienna na nią nie wskazuje. Nie można utworzyć odwołania do czegoś (lub do czegoś nieznanego w pamięci), co nie istnieje.Innymi słowy: PHP nie wie, czy podana mu wartość jest wartością bezpośrednią, czy tylko wskaźnikiem do wartości (wskaźnik jest również zmienną (liczbą całkowitą), która przechowuje przesunięcie pamięci, gdzie rzeczywista wartość rezyduje). Więc PHP oczekuje tutaj wskaźnika (odwołania) zawsze.
Ponieważ jednak w PHP 7 jest to tylko powiadomienie (nawet przestarzałe), możesz spokojnie ignorować powiadomienia i używać operatora ignorowania zamiast całkowicie wyłączać raportowanie błędów dla powiadomień:
źródło
explode
zmiennej tymczasowej, jak napisali tutaj inni. Ale znowu: to nie jest błąd, więc można użyć tego operatora. PHP jest ogólnie kiepski w obsłudze błędów. Dlatego sugerowałbym użycieset_error_handler
iset_exception_handler
do obsługi błędów oraz jako najczystszego rozwiązania.Tak jak nie możesz od razu zindeksować tablicy, nie możesz również na niej wywoływać końca. Przypisz najpierw do zmiennej, a następnie wywołaj koniec.
źródło
end(...[explode('.', $file_name)])
działa od PHP 5.6. Jest to udokumentowane w RFC, choć nie w samych dokumentach PHP.źródło
Ponieważ podnosi flagę przez ponad 10 lat, ale działa dobrze i zwraca oczekiwaną wartość, mały operator stfu to najlepsza zła praktyka, jakiej wszyscy szukacie:
źródło
Oficjalna instrukcja PHP: end ()
Parametry
Tablica Tablica jest przekazywana przez odwołanie, ponieważ jest modyfikowana przez funkcję. Oznacza to, że musisz przekazać mu rzeczywistą zmienną, a nie funkcję zwracającą tablicę, ponieważ tylko rzeczywiste zmienne mogą być przekazywane przez referencję.
źródło
Najpierw musisz zapisać wartość w takiej zmiennej
Następnie możesz użyć funkcji zakończenia, aby uzyskać ostatni indeks z tablicy takiej jak ta
Mam nadzieję, że ci się uda.
źródło
źródło