Jak uzyskać dostęp do danych przesłanych formularzem?
Z PHPEdia.pl
Wszelkie dane uzyskane z przeglądarki pobieramy z tablic $_REQUEST (czyli tablice $_POST i $_GET), $_FILES, $_COOKIE, oraz tablic sesyjnych $_SESSION.
Spis treści |
Dostęp do danych tekstowych
Tworzymy formularz z polem text o nazwie "poletekstowe"
<form action="dane.php" method="POST"> <input type="text" name="poletekstowe" /> <input type="submit" /> </form>
Aby po wysłaniu formularza przez przeglądarkę odczytać z niego dane, musimy odwołać się do tablicy $_POST (Z formularzy dane są wysyłane metodą post lub get i na podstawie tego umieszczane w tablicach $_POST i $_GET) np. tak:
<?php print($_POST['poletekstowe']); ?>
Wszystko jest w porządku dopóki nie zechcemy korzystać z pól formularzy wielokrotnego wyboru (list lub radiobuttonów). W pojedynczej komórce tablicy $_POST lub $_GET nie jesteśmy w stanie przechowywać kilku zmiennych. Co zrobić, aby zamiast elementu tablicy przesyłać wielowymiarowy obiekt?
Wystarczy tylko dodać w nazwie pola formularza "[]" (otwarcie i zamknięcie nawiasu kwadratowego) np.:
<form action="dane.php" method="POST"> <input type="radio" name="radiobutton[]" value="rb1" /> <input type="radio" name="radiobutton[]" value="rb2" /> <input type="radio" name="radiobutton[]" value="rb3" /> <input type="submit" /> </form>
i odczytywać dane:
<?php print($_POST['radiobutton'][0]); //wyświetli pierwszy zaznaczony element ?>
Dostęp do danych binarnych (pliki)
Jeżeli w formularzu chcemy przesłać plik, należy przygotować odpowiednio formularz:
<form enctype="multipart/form-data" action="." method="POST"> <!-- Maksymalna wielkość pliku, jaki możemy przesłać --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- Nazwa elelemntu, która będzie miaś odwzorowanie w tablicy $_FILES --> Send this file: <input name="userfile" type="file" /> <input type="submit" value="Wyślij plik" /> </form>
Tablica $_FILES
Po przesłaniu formularza mamy w tablicy $_FILES takie oto wartości:
- $_FILES['userfile']['name']
- Oryginalna nazwa pliku przesłana przez użytkownika.
- $_FILES['userfile']['type']
- Typ pliku, jeżeli przeglądarka obsługuje takie informacje, np: "image/gif".
- $_FILES['userfile']['size']
- Wielkość uploadowanego pliku w bajtach.
- $_FILES['userfile']['tmp_name']
- Nazwa tymczasowego pliku utworzonego na serwerze.
- $_FILES['userfile']['error']
- Kod błędu dla konkretnego pliku. Zostało dodane w PHP 4.2.0
Kody błędów
| Stała | Wartość | Opis |
| UPLOAD_ERR_OK | 0 | plik przesłany poprawnie, bez błędu |
| UPLOAD_ERR_INI_SIZE | 1 | wielkość pliku przekroczyła maksymalną wielkość z pliku konfiguracyjnego (upload_max_filesize) |
| UPLOAD_ERR_FORM_SIZE | 2 | wielkość pliku przekroczyła MAX_FILE_SIZE z formularza HTML. |
| UPLOAD_ERR_PARTIAL | 3 | plik nie został załadowany w całości |
| UPLOAD_ERR_NO_FILE | 4 | plik nie został wybrany |
| UPLOAD_ERR_NO_TMP_DIR | 6 | brak katalogu tymczasowego, wartość dodana w wersji: 4.3.10 oraz 5.0.3 |
Od wersji 4.3.0 można używać stałych.
Obsługa plików w PHP
Po załadowaniu pliku przez przeglądarkę, należy plik wgrać do naszego odpowiedniego katalogu.
Przykład 1
<?php $uploaddir = 'uploads/'; //katalog gdzie będą pliki, musi mieć prawa 777 $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); // nazwa pliku, pobieramy tutaj oryginalną przesłaną przez użytkownika //sprawdzamy czy można przenieść plik. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Plik został poprawnie załadowany.\n"; } else { echo "błędny plik.\n"; } echo 'Zrzut całej tablicy $_FILES'; print_r($_FILES); ?>
W przykładzie sprawdzamy poprawność załadowanego pliku poprzez funkcją move_uploaded_file. W przypadku, gdy chcemy mieć bardziej szczegółową informację, co jest źle, sprawdzamy $_FILES['userfile']['error']. Oto przykład:
Przykład 2: obsługa błędów
<?php $uploaddir = 'uploads/'; //katalog gdzie będą pliki, musi mieć prawa 777 $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); // nazwa pliku, pobieramy tutaj oryginalną przesłaną przez użytkownika //sprawdzamy kod błędu: switch($_FILES['userfile']['error']){ case 0: //wszystko ok, brak reakcji break; case 1: //za duży plik case 2: echo 'przesłany plik jest za duży. Spróbuj wybrać inny.'; break; case 3: //nie załadowany cały plik echo 'Plik nie został załadowany poprawnie. Proszę spróbować ponownie.'; break; case 4: //brak wybranego pliku echo 'Brak pliku. Proszę wybrać plik.'; break; case 6: //brak katalogu na pliki tymczasowe echo 'Błąd wewnętrzny. Prosimy o kontakt z administratorem'; break; } //sprawdzamy czy można przenieść plik. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Plik został poprawnie załadowany.\n"; } else { echo "błędny plik.\n"; } echo 'Zrzut całej tablicy $_FILES'; print_r($_FILES); ?>
Zobacz także
- Metoda GET
- Metoda POST
- Jak uzyskać dostęp do danych przesłanych formularzem?
Jest to element FAQ, czyli zestawienia odpowiedzi na najczęściej zadawane pytania.
Zestawienie: Informacje | Podstawy PHP | Porady praktyczne | Pytania z forum | Bezpieczeństwo
