Kihagyás

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

GET vs. POST

Ű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>

A kód működése

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"/></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).

1
2
3
4
5
6
7
<?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