Tartalomjegyzék
PHP Űrlapfeldolgozás
- Szerző: Sallai András
- Copyright © Sallai András, 2011, 2014
- Licenc: GNU Free Documentation License 1.3
- Web: http://szit.hu
Űrlap
<form action="feldolgoz.php" method="POST" > <input type="radio" name="nem" value="ferfi" /> Férfi<br /> <input type="radio" name="nem" value="no" /> Nő</br /> <input type="submit" value="Mehet" /> </form>
A GET és a POST metódus
A metódusokról
Az böngésző egy űrlap tartalmát két módon küldheti el a webszervernek:
- GET metódus
- POST metódus
A legszembetűnőbb, hogy a GET metódus használata esetén az átadott paraméterek a böngésző címsorában is látszanak. A POST metódus esetén, nem.
Az URL maximális hossza
A HTTP protokoll nem határozza meg egy URL hosszát.
A böngészők adatai | ||||
---|---|---|---|---|
IE | Firefox | Safari | Opera | Chrome |
2048 | 65 536 | 80 000 | 190000 | ? |
Webszerverek | ||
---|---|---|
Apache | IIS | Perl HTTP::Daemon |
4000 alapértelmezetten | 16 384 | 8000 |
A w3schools 2048 karakterben adja meg maximumot. Nagy Gusztáv a könyvében 2000 körül adja meg a határt. A W3C konzorcium a 256 karakteres határt weboldalukon tévhitként kezeli, amelyet néhány webszerveren beállított limit miatt vált ismerté, a denial-of-service támadások korlátozására.
Az apache webszerveren a LimitRequestLine direktíva szolgál az érték beállítására. Használatára két példa:
LimitRequestLine 4094
LimitRequestLine 8190
1855 karakteres URL:
GET | POST | |
---|---|---|
Adathossz-korlát | maximum 2048 | Nincs korlátozás |
Kedvencek | Kedvencekbe tehető | A kedvencekben nem menthető |
Vissza gomb/frissítés | Nincs | Az adatok újra elküldésre kerülnek |
Kódolás | application/x-www-form-urlencoded | application/x-www-form-urlencoded multipart/form-data bináris adatok számára multipart kódolás |
Előzmények | A paraméterek megmaradnak az előzményben | A paraméterek nem szerepelnek az előzményben. |
Adattípus-korlát | csak ASCII | Nincs korlátozás, bináris adat is megengedett |
Biztonság | A paraméterek látszanak az URL-ben | Paraméterek nem látszanak, nem tárolódnak, és az előzményekben sem szerepelnek |
Űrlap feldolgozó
- feldolgoz.php
$valasz = $_POST['nem'];
Annak ellenőrzése, hogy tartalmaz-e értéket egy változó:
empty($_POST["nev"])
empty($_GET["nev"])
if(empty($_GET['valami'])) { echo "Nincs ilyen"; }
Fájlfeltöltés
Űrlap
<form method="post" action="upload.php" enctype="multipart/form-data"> <input type="file" name="kep" /> <input type="submit" value="Feltöltés" /> </form>
A $_FILES változó
Az első paraméter a form input elemének a name értéke, a második pedig az index, amely „name”, „type”, „size”, „tmp_name” vagy „error” lehetnek. Az alábbiakhoz hasonlóan használhatjuk:
$_FILES["file"]["name"] - A feltöltött fájl neve. $_FILES["file"]["type"] - A feltöltött fájl típusa. $_FILES["file"]["size"] - A feltöltött fájl mérete byte-okban. $_FILES["file"]["tmp_name"] - Az ideiglenes fájl neve, amelyen a szerveren tárolásra kerül. $_FILES["file"]["error"] - A feltöltés ezzel a kóddal tér vissza hiba esetén.
Fogadó script
- upload.php
<?php if ($_FILES["file"]["error"] > 0) { echo "Hiba: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Feltöltés: " . $_FILES["file"]["name"] . "<br />"; echo "Típus: " . $_FILES["file"]["type"] . "<br />"; echo "Méret: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Tárolva itt: " . $_FILES["file"]["tmp_name"]; } ?>
Feldolgozó script korlátozásokkal
- upload.php
<?php print <<< EOT <!DOCTYPE html> <html> <head> <title>Feltöltő</title> <meta charset="utf-8" /> </head> <body> EOT; $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["kepfile"]["name"])); if(empty($_FILES["kepfile"]["name"])) { echo "Nem adtál meg fájlt!"; } else { if (!( ($_FILES["kepfile"]["type"] == "image/gif") || ($_FILES["kepfile"]["type"] == "image/jpeg") || ($_FILES["kepfile"]["type"] == "image/pjpeg") || ($_FILES["kepfile"]["type"] == "image/png")) ) { echo "Tiltott fájltípus"; } else { if (!($_FILES["kepfile"]["size"] < 20000)) { echo "Túl nagy fájlméret"; } else { if(!in_array($extension, $allowedExts)) { echo "Tiltott kiterjesztés"; } else { if ($_FILES["kepfile"]["error"] > 0) { echo "Hiba: " . $_FILES["kepfile"]["error"] . "<br />"; } else { echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "<br />"; echo "Típus: " . $_FILES["kepfile"]["type"] . "<br />"; echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb<br />"; echo "Eltárolva itt: " . $_FILES["kepfile"]["tmp_name"]; } } } } } print "</body></html>"; ?>
Feltöltött fájl elmentése
- upload.php
<?php print <<< EOT <!DOCTYPE html> <html> <head> <title>Feltöltő</title> <meta charset="utf-8" /> </head> <body> EOT; $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["kepfile"]["name"])); if(empty($_FILES["kepfile"]["name"])) { echo "Nem adtál meg fájlt!"; } else { if (!( ($_FILES["kepfile"]["type"] == "image/gif") || ($_FILES["kepfile"]["type"] == "image/jpeg") || ($_FILES["kepfile"]["type"] == "image/pjpeg") || ($_FILES["kepfile"]["type"] == "image/png")) ) { echo "Tiltott fájltípus"; } else { if (!($_FILES["kepfile"]["size"] < 200000)) { echo "Túl nagy fájlméret"; } else { if(!in_array($extension, $allowedExts)) { echo "Tiltott kiterjesztés"; } else { if ($_FILES["kepfile"]["error"] > 0) { echo "Hiba: " . $_FILES["kepfile"]["error"] . "<br />"; } else { echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "<br />"; echo "Típus: " . $_FILES["kepfile"]["type"] . "<br />"; echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb<br />"; echo "Ideiglenesen tárolva itt: " . $_FILES["kepfile"]["tmp_name"]."<br />"; if (file_exists("upload/" . $_FILES["kepfile"]["name"])) { echo "A " .$_FILES["kepfile"]["name"] . " fájl már létezik. "; } else { move_uploaded_file($_FILES["kepfile"]["tmp_name"], "upload/" . $_FILES["kepfile"]["name"]); echo "Végleg tárolva itt: " . "upload/" . $_FILES["kepfile"]["name"]; } } } } } } print "</body></html>"; ?>
Esetleg így:
- upload2.php
<?php print <<< EOT <!DOCTYPE html> <html> <head> <title>Feltöltő</title> <meta charset="utf-8" /> </head> <body> EOT; $maxmeret = 20000; $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["kepfile"]["name"])); if(empty($_FILES["kepfile"]["name"])) { echo "Nem adtál meg fájlt!"; } else { $upload = true; if (!( ($_FILES["kepfile"]["type"] == "image/gif") || ($_FILES["kepfile"]["type"] == "image/jpeg") || ($_FILES["kepfile"]["type"] == "image/pjpeg") || ($_FILES["kepfile"]["type"] == "image/png")) ) { echo "Tiltott fájltípus<br />"; $upload = false; } if ($_FILES["kepfile"]["size"] > $maxmeret) { echo "Túl nagy fájlméret<br />"; $upload = false; } if(!in_array($extension, $allowedExts)) { echo "Tiltott kiterjesztés<br />"; $upload = false; } if ($upload) { if ($_FILES["kepfile"]["error"] > 0) { echo "Hiba: " . $_FILES["kepfile"]["error"] . "<br />"; $upload = false; } else { echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "<br />"; echo "Típus: " . $_FILES["kepfile"]["type"] . "<br />"; echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb<br />"; echo "Ideiglenesen tárolva itt: " . $_FILES["kepfile"]["tmp_name"]."<br />"; } if (file_exists("upload/" . $_FILES["kepfile"]["name"])) { echo "A " .$_FILES["kepfile"]["name"] . " fájl már létezik. <br />"; } else { move_uploaded_file($_FILES["kepfile"]["tmp_name"], "upload/" . $_FILES["kepfile"]["name"]); echo "Végleg tárolva itt: " . "upload/" . $_FILES["kepfile"]["name"]."<br />"; } } } print "</body></html>"; ?>
Ugyanaz átrendezve:
- upload2.php
<?php print <<< EOT <!DOCTYPE html> <html> <head> <title>Feltöltő</title> <meta charset="utf-8" /> </head> <body> EOT; $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["kepfile"]["name"])); if(empty($_FILES["kepfile"]["name"])) { echo "Nem adtál meg fájlt!"; }elseif (!( ($_FILES["kepfile"]["type"] == "image/gif") || ($_FILES["kepfile"]["type"] == "image/jpeg") || ($_FILES["kepfile"]["type"] == "image/pjpeg") || ($_FILES["kepfile"]["type"] == "image/png")) ) { echo "Tiltott fájltípus"; }elseif (!($_FILES["kepfile"]["size"] < 200000)) { echo "Túl nagy fájlméret"; }elseif(!in_array($extension, $allowedExts)) { echo "Tiltott kiterjesztés"; }elseif ($_FILES["kepfile"]["error"] > 0) { echo "Hiba: " . $_FILES["kepfile"]["error"] . "<br />"; }else { echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "<br />"; echo "Típus: " . $_FILES["kepfile"]["type"] . "<br />"; echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb<br />"; echo "Ideiglenesen tárolva itt: " . $_FILES["kepfile"]["tmp_name"]."<br />"; if (file_exists("upload/" . $_FILES["kepfile"]["name"])) { echo "A " .$_FILES["kepfile"]["name"] . " fájl már létezik. "; }else { move_uploaded_file($_FILES["kepfile"]["tmp_name"], "upload/" . $_FILES["kepfile"]["name"]); echo "Végleg tárolva itt: " . "upload/" . $_FILES["kepfile"]["name"]; } } print "</body></html>";
Egyéb
Esetleg tegyük a feltöltéskönyvtárat változóba:
$uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
Esetleg megvizsgálhatjuk a mentés sikerességét:
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "A fájl érvényes és sikeresen feltöltésre került\n"; } else { echo "Lehetséges fájlfeltöltés támadás!\n"; }
Időfeldolgozás
Az input elem date típusát így használjuk:
<input type="date" name="datum">
Ha megkapjuk dátumot egy másik PHP scriptben, annak formátuma:
2020-01-10T18:00:00.000Z
Ha adatbázisba akarjuk írni, át kell alakítani:
$date = $_POST['date']; $standardDate("Y-m-d H:i:s", strtotime($date)); $sql="insert into tabla1 set date=$standardDate";
Önmagát hívó script
A script vár egy számot, majd mindig eltárolja.
- index.php
<?php $osszeg = 0; if(isset($_GET['szam']) ) { $szam = $_GET['szam']; $osszeg = $_GET['osszeg']; $osszeg = $osszeg + $szam; } echo <<<EOT <p> Összeg: $osszeg </p> <form method="get"> <input type="hidden" name="osszeg" value="$osszeg"> <label>Szám</label> <input type="text" name="szam"> <br> <button type="submit">Hozzáad</button> </form> EOT;
Vegyük észre, hogy a form elemnek nincs action tulajdonsága.