Jak uzyskać dostęp do danych przesłanych formularzem?

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

Wszelkie dane uzyskane z przeglądarki pobieramy z tablic $_REQUEST (czyli tablice $_POST i $_GET), $_FILES, $_COOKIE, oraz tablic sesyjnych $_SESSION.


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


Jest to element FAQ, czyli zestawienia odpowiedzi na najczęściej zadawane pytania.

Zestawienie: Informacje | Podstawy PHP | Porady praktyczne | Pytania z forum | Bezpieczeństwo