7.2. fejezet
A fejezet anyaga
Szuperglobális tömbök
PHP-ban sokszor használunk úgynevezett szuperglobális tömböket. Ezek olyan speciális beépített változók, amelyek a program minden pontjáról elérhetők, scope-tól függetlenül.
A PHP-ban használatos szuperglobális tömbök:
$GLOBALS
: az adott program globális változóit tárolja
$_GET
: a HTTP GET metódussal továbbított űrlapmezők neveit és értékeit tárolja
$_POST
: a HTTP POST metódussal továbbított űrlapmezők neveit és értékeit tárolja
$_COOKIE
: a böngészősütikre vonatkozó információkat tartalmazza
$_REQUEST
: a $_GET
, $_POST
és $_COOKIE
tömbök értékeit tartalmazza
$_FILES
: a feltöltött fájlokra vonatkozó információkat tárolja
$_SESSION
: a munkamenet-változókat és azok értékeit tartalmazza
$_ENV
: a környezeti változókra vonatkozó információkat tárolja
$_SERVER
: a szerver által elérhetővé tett változókat tartalmazza.
Űrlapfeldolgozás PHP-ban
HTML űrlapok - Ismétlés
A 4. fejezetben részletesen tárgyaltuk a HTML űrlapokat és azok fontosabb vezérlőelemeit. Ismétlésképpen: űrlapokat a <form>...</form>
tagpárral hozhatunk létre.
A <form>
tag action
attribútumának értékeként megadjuk annak a PHP fájlnak a nevét, aminek az utasításait végre szeretnénk hajtani az űrlap elküldésekor. Ez lehet ugyanaz a fájl, mint amiben az űrlap szerepel, vagy akár egy másik állomány is.
A <form>
tag method
attribútumával megadható az űrlapadatok továbbításának módja. Az attribútum a GET
vagy POST
értékek valamelyikét veheti fel.
- A
method="GET"
attribútum használatakor az űrlapadatok az URL-ben lesznek továbbítva. Az egyes űrlapmezők neveit és értékeit mezőnév=érték
formátumban, &
-jelekkel elválasztva fogja tartalmazni az URL.
- A
method="POST"
attribútum használata esetén az űrlapadatok a háttérben, a HTTP üzenet törzsében kerülnek továbbításra.
Ahogy azt a 4. fejezetben kimondtuk, a method="GET"
attribútum NEM alkalmas bizalmas adatok (pl. jelszavak) biztonságos továbbítására (valószínűleg nem örülnénk neki, ha a jelszavunkat bárki láthatná az URL-ben). Ha bizalmas űrlapadatokat (pl. jelszavakat) továbbítunk, akkor mindig a method="POST"
attribútumot használjuk!
Fontos, hogy a feldolgozni kívánt űrlapelemek rendelkezzenek egy-egy name
attribútummal, ugyanis ez alapján fogjuk tudni lekérni szerveroldalon az űrlapelembe írt értéket!
Példa: A method="GET"
használata esetén az űrlapmezőbe írt érték az URL-ben továbbítódik, míg method="POST"
esetén a háttérben kerül továbbításra
Űrlapadatok elérése
Miután a felhasználó elküldte a kitöltött űrlapot a szervernek, természetesen el is szeretnénk érni az űrlapon megadott adatokat. Ezt PHP-ban a következőképpen tehetjük meg:
- ha az űrlap GET metódussal lett továbbítva, akkor a
name="valami"
attribútummal rendelkező űrlapelem értékét a $_GET["valami"]
használatával kérhetjük le
- ha az űrlapot POST metódussal továbbították, akkor a
name="valami"
attribútummal rendelkező űrlapelem értéke a $_POST["valami"]
segítségével érhető el.
Űrlapadatok ellenőrzése
Sajnos az űrlapadatokra vonatkozó kliensoldali ellenőrzések nem megbízhatók. Például ha egy űrlapmező kitöltését kötelezővé tesszük a required
attribútummal, akkor a felhasználó ezt az ellenőrzést kicselezheti: a weboldal HTML forráskódjában kitörölheti a required
attribútumot. Emiatt fontos, hogy ezeket az ellenőrzéseket szerveroldalon is elvégezzük!
Két fontos PHP-beli függvény, űrlapadatok szerveroldali ellenőrzésére:
isset($val)
: igazat ad vissza, ha $val
NULL
-tól különböző értéket tárol
empty($val)
: igazat ad vissza, ha $val
üresnek tekinthető.
Az empty($val)
lényegében a !isset($val) || $val == FALSE
tömörebb írásmódja. Tehát akkor ad vissza igazat, ha a változó nem tárol (NULL
-tól különböző) értéket, vagy az értéke a FALSE
logikai értéknek felel meg (a FALSE
érték, az üres string, a 0
, 0.0
, "0"
értékek és az üres tömb mind ilyenek). Ez nem feltétlenül a legjobb megoldás, hiszen ha egy űrlapmezőbe a 0 számot írjuk bele, akkor nem szeretnénk a mezőt üresnek tekinteni.
Ekkor érdemes lehet egy másik megoldást használni az űrlapmező ürességének ellenőrzésére: először isset()
-tel megnézzük, hogy az űrlapmező létezik-e, majd megvizsgáljuk, hogy az űrlapmező tartalma az üres stringtől különböző-e. Ez előtt érdemes a trim()
függvénnyel eltávolítani a beírt érték elejéről és a végéről a fölösleges whitespace karakterket.
Példa: Másoljuk bele a test.php
fájlba az alábbi kódot! Ha az űrlapmezőt kitöltjük, akkor az űrlap elküldése után kiírjuk a beírt szöveget, egyébként pedig hibaüzenetet jelenítünk meg.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | <?php
$uzenet = ""; // változó az űrlap alatt megjelenő üzenetnek
if (isset($_GET["elkuld"])) { // csak azután dolgozzuk fel az űrlapot, miután az el lett küldve
if (isset($_GET["szoveg"]) && trim($_GET["szoveg"]) !== "") {
// ha az űrlapmezőt kitöltötték adattal, akkor eltároljuk az értékét egy változóban
$beirt_szoveg = $_GET["szoveg"]; // itt a $_GET szuperglobálist használjuk, hiszen az űrlapunk a method="GET" attribútummal rendelkezik
$uzenet = "A beírt szöveg: $beirt_szoveg"; // a kiírandó üzenet ekkor a beírt szöveg lesz
} else {
// ha az űrlapmezőt nem töltötték ki, akkor hibaüzenetet szeretnénk kiíratni
$uzenet = "<strong>Hiba!</strong> Írj be valamit az űrlapmezőbe!";
}
}
?>
<!DOCTYPE html>
<html lang="hu">
<head>
<title>Űrlapfeldolgozás</title>
<meta charset="UTF-8"/>
</head>
<body>
<form action="test.php" method="GET">
<input type="text" name="szoveg"/>
<input type="submit" name="elkuld"/> <br/>
</form>
<?php echo "<p>" . $uzenet . "</p>"; ?>
</body>
</html>
|
Többértékű űrlapmezők feldolgozása
Emlékezzünk vissza a jelölőnégyzetekre! Ők azért voltak különlegesek, mert itt (a választógombokkal ellentétben) egyszerre több válaszlehetőséget is meg lehetett jelölni.
Ha PHP-ban fel szeretnénk dolgozni a bejelölt opciókat, akkor a HTML kódban az egy csoportba tartozó jelölőnégyzetek name
értékeként egy, minden négyzet esetén azonos nevű tömböt adunk meg. A megadott name
értéket felhasználva lekérhetjük PHP-ban az adott csoportba tartozó összes bejelölt jelölőnégyzet value
értékét egy tömbbe.
Példa: A bejelölt jelölőnégyzetek értékeinek kiíratása
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | <?php
$uzenet = ""; // változó az űrlap alatt megjelenő üzenetnek
if (isset($_POST["elkuld"])) { // itt a $_POST szuperglobálist használjuk, hiszen az űrlapunk a method="POST" attribútummal rendelkezik
if (isset($_POST["gyumolcsok"])) {
// ha legalább egy opciót kiválasztottak, akkor eltároljuk a bejelölt értékeket egy változóban
$kivalasztott = $_POST["gyumolcsok"]; // ez egy tömb lesz, ami a bejelölt jelölőnégyzetek value értékeit tartalmazza
$uzenet = "A kiválasztott gyümölcsök: " . implode(", ", $kivalasztott) . "<br/>"; // tömbelemek egyesítése egy stringgé
}
}
?>
<!DOCTYPE html>
<html lang="hu">
<head>
<title>Űrlapfeldolgozás</title>
<meta charset="UTF-8"/>
</head>
<body>
<form action="test.php" method="POST">
<input type="checkbox" name="gyumolcsok[]" value="alma"/> Alma
<input type="checkbox" name="gyumolcsok[]" value="banán"/> Banán
<input type="checkbox" name="gyumolcsok[]" value="citrom"/> Citrom
<input type="submit" name="elkuld"/> <br/>
</form>
<?php echo "<p>" . $uzenet . "</p>"; ?>
</body>
</html>
|
Megjegyzés
A multiple
attribútummal ellátott választólistában (<select>
) kiválasztott opciók ehhez teljesen hasonló módon kérdezhetők le.
Egy teljes példa: Regisztrációs űrlap feldolgozása
Hozzunk létre egy signup.php
nevű állományt, és másoljuk bele az alábbi kódot!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | <?php
// ide jön az űrlapot feldolgozó PHP kód...
?>
<!DOCTYPE html>
<html lang="hu">
<head>
<title>Regisztráció</title>
<meta charset="UTF-8"/>
</head>
<body>
<form action="signup.php" method="POST">
<label>Felhasználónév: <input type="text" name="felhasznalonev"/></label> <br/>
<label>Jelszó: <input type="password" name="jelszo"/></label> <br/>
<label>Jelszó ismét: <input type="password" name="jelszo2"/></label> <br/>
<label>Életkor: <input type="number" name="eletkor"/></label> <br/>
Nem:
<label><input type="radio" name="nem" value="F"/> Férfi</label>
<label><input type="radio" name="nem" value="N"/> Nő</label>
<label><input type="radio" name="nem" value="E"/> Egyéb</label> <br/>
Hobbik:
<label><input type="checkbox" name="hobbik[]" value="programozás"/> Programozás</label>
<label><input type="checkbox" name="hobbik[]" value="főzés"/> Főzés</label>
<label><input type="checkbox" name="hobbik[]" value="macskázás"/> Macskázás</label>
<label><input type="checkbox" name="hobbik[]" value="mémnézegetés"/> Mémnézegetés</label>
<label><input type="checkbox" name="hobbik[]" value="alvás"/> Alvás</label> <br/>
<input type="submit" name="regiszt" value="Regisztráció"/> <br/><br/>
</form>
</body>
</html>
|
Írjuk meg az űrlap feldolgozását végző PHP kódot! Az űrlap feldolgozásakor a következőket ellenőrizzük:
- A felhasználónevet, a két jelszót, az életkort és a nemet kötelező legyen megadni!
- Ne lehessen foglalt felhasználónévvel regisztrálni!
- A jelszó legalább 5 karakter hosszú legyen!
- A két jelszónak meg kell egyeznie!
- Csak 18 éves kortól lehessen regisztrálni!
- Legalább 2 hobbit kötelező legyen kiválasztani!
A regisztráció pontosan akkor sikeres, ha a fenti előírások közül mindegyik teljesül.
Az egyszerűség kedvéért a regisztrált felhasználók legyenek előre rögzítettek. Ezeket a felhasználókat az alábbi kétdimenziós tömbben tároljuk! Minden felhasználót egy asszociatív tömb reprezentál, amely tartalmazza a felhasználónevet, a jelszót, a nemet és a hobbikat (a hobbikat egy tömbben tároljuk).
| <?php
$fiokok = [
["felhasznalonev" => "admin", "jelszo" => "Macska123", "nem" => "F", "hobbik" => ["macskázás", "programozás"]],
["felhasznalonev" => "guest", "jelszo" => "guest1", "nem" => "E", "hobbik" => ["alvás", "mémnézegetés"]],
["felhasznalonev" => "TestUser", "jelszo" => "test99", "nem" => "N", "hobbik" => ["macskázás", "főzés"]]
];
?>
|
Egy lehetséges megoldás
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 | <?php
// a rendszer által ismert felhasználókat tartalmazó 2-dimenziós tömb
$fiokok = [
["felhasznalonev" => "admin", "jelszo" => "Macska123", "nem" => "F", "hobbik" => ["macskázás", "programozás"]],
["felhasznalonev" => "guest", "jelszo" => "guest1", "nem" => "E", "hobbik" => ["alvás", "mémnézegetés"]],
["felhasznalonev" => "TestUser", "jelszo" => "test99", "nem" => "N", "hobbik" => ["macskázás", "főzés"]]
];
// az űrlapfeldolgozás során keletkező hibákat ebbe a tömbbe fogjuk gyűjteni
$hibak = [];
// űrlapfeldolgozás
if (isset($_POST["regiszt"])) { // ha az űrlapot elküldték...
// a kötelezően kitöltendő mezők ellenőrzése
if (!isset($_POST["felhasznalonev"]) || trim($_POST["felhasznalonev"]) === "")
$hibak[] = "A felhasználónév megadása kötelező!";
if (!isset($_POST["jelszo"]) || trim($_POST["jelszo"]) === "" || !isset($_POST["jelszo2"]) || trim($_POST["jelszo2"]) === "")
$hibak[] = "A jelszó és az ellenőrző jelszó megadása kötelező!";
if (!isset($_POST["eletkor"]) || trim($_POST["eletkor"]) === "")
$hibak[] = "Az életkor megadása kötelező!";
if (!isset($_POST["nem"]) || trim($_POST["nem"]) === "")
$hibak[] = "A nem megadása kötelező!";
// legalább 2 hobbit kötelező kiválasztani
if (!isset($_POST["hobbik"]) || count($_POST["hobbik"]) < 2)
$hibak[] = "Legalább 2 hobbit kötelező kiválasztani!";
// űrlapadatok lementése változókba
$felhasznalonev = $_POST["felhasznalonev"];
$jelszo = $_POST["jelszo"];
$jelszo2 = $_POST["jelszo2"];
$eletkor = $_POST["eletkor"];
$nem = NULL;
$hobbik = NULL;
if (isset($_POST["nem"])) // csak akkor kérjük le a nemet, ha megadták
$nem = $_POST["nem"];
if (isset($_POST["hobbik"])) // csak akkor kérjük le a hobbikat, ha megadták
$hobbik = $_POST["hobbik"]; // (ez egy tömb lesz)
// foglalt felhasználónév ellenőrzése
foreach ($fiokok as $fiok) {
if ($fiok["felhasznalonev"] === $felhasznalonev) // ha egy regisztrált felhasználó neve megegyezik az űrlapon megadott névvel...
$hibak[] = "A felhasználónév már foglalt!";
}
// túl rövid jelszó
if (strlen($jelszo) < 5)
$hibak[] = "A jelszónak legalább 5 karakter hosszúnak kell lennie!";
// a két jelszó nem egyezik
if ($jelszo !== $jelszo2)
$hibak[] = "A jelszó és az ellenőrző jelszó nem egyezik!";
// 18 év alatti életkor
if ($eletkor < 18)
$hibak[] = "Csak 18 éves kortól lehet regisztrálni!";
// regisztráció sikerességének ellenőrzése
if (count($hibak) === 0) { // ha nem történt hiba a regisztráció során, hozzáadjuk az újonnan regisztrált felhasználót a $fiokok tömbhöz
$fiokok[] = ["felhasznalonev" => $felhasznalonev, "jelszo" => $jelszo, "eletkor" => $eletkor, "nem" => $nem, "hobbik" => $hobbik];
$siker = TRUE;
} else { // ha voltak hibák, akkor a regisztráció sikertelen
$siker = FALSE;
}
}
?>
|
Tájékoztassuk a felhasználót arról, hogy sikeres volt-e a regisztráció! Ha igen, akkor írassuk ki a "Sikeres regisztráció!" szöveget az űrlap alatt! Ha nem, akkor írassuk ki a regisztráció során észrevett hibákat!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | ...
<form action="signup.php" method="POST">
...
</form>
<?php
if (isset($siker) && $siker === TRUE) { // ha nem volt hiba, akkor a regisztráció sikeres
echo "<p>Sikeres regisztráció!</p>";
} else { // az esetleges hibákat kiírjuk egy-egy bekezdésben
foreach ($hibak as $hiba) {
echo "<p>" . $hiba . "</p>";
}
}
?>
...
|
Űrlapadatok megőrzése
A fenti regisztrációs űrlapon több adatot is meg kell adnia a felhasználónak. Ha a regisztráció sikertelen, akkor ezeket az adatokat mindig újból be kell gépelnie.
Egy hasznos kényelmi funkció lehet a weboldalunkon, ha a sikertelen regisztráció után bizonyos űrlapadatokat megőrzünk, és ezeket visszaírjuk az űrlapmezőkbe. Ennek egy egyszerű módja, ha az űrlapmező value
értékét beállítjuk a megfelelő szuperglobális tömbben ($_GET
vagy $_POST
) tárolt értékre.
Példa: Űrlapadatok megőrzése és visszaírása
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | ...
<form action="signup.php" method="POST">
<label>Felhasználónév: <input type="text" name="felhasznalonev" value="<?php if (isset($_POST['felhasznalonev'])) echo $_POST['felhasznalonev']; ?>"/></label> <br/>
<label>Jelszó: <input type="password" name="jelszo"/></label> <br/>
<label>Jelszó ismét: <input type="password" name="jelszo2"/></label> <br/>
<label>Életkor: <input type="number" name="eletkor" value="<?php if (isset($_POST['eletkor'])) echo $_POST['eletkor']; ?>"/></label> <br/>
Nem:
<label><input type="radio" name="nem" value="F" <?php if (isset($_POST['nem']) && $_POST['nem'] === 'F') echo 'checked'; ?>/> Férfi</label>
<label><input type="radio" name="nem" value="N" <?php if (isset($_POST['nem']) && $_POST['nem'] === 'N') echo 'checked'; ?>/> Nő</label>
<label><input type="radio" name="nem" value="E" <?php if (isset($_POST['nem']) && $_POST['nem'] === 'E') echo 'checked'; ?>/> Egyéb</label> <br/>
Hobbik:
<label><input type="checkbox" name="hobbik[]" value="programozás" <?php if (isset($_POST['hobbik']) && in_array('programozás', $_POST['hobbik'])) echo 'checked'; ?>/> Programozás</label>
<label><input type="checkbox" name="hobbik[]" value="főzés" <?php if (isset($_POST['hobbik']) && in_array('főzés', $_POST['hobbik'])) echo 'checked'; ?>/> Főzés</label>
<label><input type="checkbox" name="hobbik[]" value="macskázás" <?php if (isset($_POST['hobbik']) && in_array('macskázás', $_POST['hobbik'])) echo 'checked'; ?>/> Macskázás</label>
<label><input type="checkbox" name="hobbik[]" value="mémnézegetés" <?php if (isset($_POST['hobbik']) && in_array('mémnézegetés', $_POST['hobbik'])) echo 'checked'; ?>/> Mémnézegetés</label>
<label><input type="checkbox" name="hobbik[]" value="alvás" <?php if (isset($_POST['hobbik']) && in_array('alvás', $_POST['hobbik'])) echo 'checked'; ?>/> Alvás</label> <br/>
<input type="submit" name="regiszt" value="Regisztráció"/> <br/><br/>
</form>
...
|
A teljes forráskód letöltése
Az elkészített forráskód egyben is letölthető ide kattintva.
Megjegyzés
A példában csak az űrlapfeldolgozáson van a hangsúly. Mivel a regisztráció után az adatokat csak ideiglenesen tároljuk el a memóriában, ezért egyelőre még olyat nem tudunk csinálni, hogy az űrlapon regisztrált felhasználók nevével már ne lehessen újból regisztrálni. A következő fejezetben megnézzük, hogy hogyan lehet elmenteni egy regisztráló felhasználó adatait, és ténylegesen működőképessé tesszük a regisztrációt.
Utolsó frissítés:
2024-02-10 17:56:22