Kihagyás

8. fejezet

A fejezet anyaga

PHP - Függvények

Függvénydefiníció, függvényhívás

Természetesen PHP-ban is van lehetőségünk arra, hogy saját függvényeket definiáljunk. A függvénydefiníció szintaxisa a következőképpen néz ki:

1
2
3
4
5
<?php
  function fuggveny_neve($param1, $param2, ...) {
    // függvénytörzs (utasítások)
  }
?>

Ha egy függvényt meg szeretnénk hívni, akkor ezt a szokásos szintaxissal tehetjük meg.

1
2
3
<?php
  fuggveny_neve(/* paraméterek átadása */);
?>

PHP-ban a globális scope-ban létrehozott függvények már a definiálásuk előtt is meghívhatók. Ez a szelekciós vezérlési ágakon (pl. if-en) belül definiált függvényekre nem vonatkozik, ők ugyanis csak akkor jönnek létre, amikor a vezérlés eljut hozzájuk.

Változók hatóköre

PHP-ban a fájlban létrehozott változók a globális scope-ba kerülnek. A függvényeken belül létrehozott változók lokálisak lesznek a függvény törzsében, tehát ezeket nem lehet a függvényen kívülről elérni.

Fontos megjegyezni, hogy PHP-ban a függvényen kívüli (globális) változók alapértelmezett módon nem láthatóak a függvény törzsében.

1
2
3
4
5
6
7
<?php
  $val = 10;

  function egy_klassz_fuggveny() {
    // $val innen nem elérhető!
  }
?>

Ha egy függvény törzsében el szeretnénk érni egy függvényen kívüli változót, akkor ezt kétféle módon tehetjük meg:

  • a global kulcsszóval globálisként újradeklaráljuk a változót a függvényben
  • a $GLOBALS szuperglobális tömb elemeként hivatkozunk a változóra (a szuperglobális tömbökről hamarosan részletesebben tanulunk).

Példa: Függvényen kívüli változó elérése a függvény törzséből

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
  $val = 10;

  function globalis_modosit1() {    // 1. módszer: global kulcsszó
    global $val;
    $val = 20;
  }

  function globalis_modosit2() {    // 2. módszer: $GLOBALS szuperglobális tömb
    // a $GLOBALS kulcs-érték párokként tárolja a program globális változóinak nevét és értékét
    $GLOBALS["val"] = 42;   // a "val" nevű globális változó értékét módosítjuk
  }

  globalis_modosit1();          // $val új értéke: 20
  globalis_modosit2();          // $val új értéke: 42
?>

A static kulcsszóval létrehozhatunk statikus változókat is. Ezek a létrehozó blokkon belül (jelen esetben a függvényen belül) lokálisak lesznek, viszont a blokkon kívül is megőrzik az értéküket, így a blokkba visszatérve a korábbi, megőrzött érték újra felhasználható.

Példa: Írjunk egy olyan függvényt, amely kiírja, hogy eddig hány alkalommal hívták meg!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
  function szamol() {
    static $count = 0;   // statikus változó ("megőrzi a korábbi értékét")
    $count++;
    echo "Ezt a függvényt $count alkalommal hívták meg. <br/>";
  }

  szamol();
  szamol();
  szamol();
?>

A kód kimenete

Ezt a függvényt 1 alkalommal hívták meg. Ezt a függvényt 2 alkalommal hívták meg. Ezt a függvényt 3 alkalommal hívták meg.

Paraméterátadás

PHP-ban a függvényhíváskor alapértelmezett módon érték szerinti paraméterátadás történik (kivéve objektumok esetén). Ekkor az átadott változónak egy másolatával dolgozunk a függvényen belül.

Ha az eredeti változóval szeretnénk dolgozni a függvényben, akkor referencia szerinti paraméterátadást használunk. Ezt az & (és-jel) operátorral tehetjük meg.

Példa: Érték és referencia szerinti paraméterátadás

1
2
3
4
5
6
7
8
<?php
  function modosit1($x) { $x = 42; }      // érték szerinti paraméterátadás
  function modosit2(&$x) { $x = 42; }     // referencia szerinti paraméterátadás

  $val = 10;
  modosit1($val);   // $val értéke továbbra is 10 (hiszen csak egy másolatát módosítottuk)
  modosit2($val);   // $val új értéke 42 lesz
?>

Visszatérési érték

Természetesen PHP-ban is lehet a függvényeinknek visszatérési értékük. A függvény által visszaadott érétket a return kulcsszó után adhatjuk meg.

Ha a függvény referenciával tér vissza, akkor a függvény neve elé egy &-jelet írunk mind a függvénydefiníció, mind a függvényhívás helyén.

Példa: Visszatérési érték

1
2
3
4
5
6
7
8
<?php
  function osszead($szam1, $szam2) { return $szam1 + $szam2; }
  function &novel(&$szam) { $szam++; return $szam; }      // referenciát visszaadó függvény

  $osszeg = osszead(10, 20);      // $osszeg értéke: 30
  $a = 5;
  $b = &novel($a);    // $a és $b értéke is 6 lesz ($a értéke a referencia szerinti átadás miatt változik)
?>

Default paraméterek

A Javával ellentétben PHP-ban nem definiálhatunk a kódban több azonos nevű függvényt (még eltérő paraméterezés esetén sem), különben végzetes hibát kapunk!

A gyakorlatban viszont sokszor felmerül az igény arra, hogy egy függvényt akár eltérő paraméterszámmal is meg tudjunk hívni. Szerencsére a PHP erre is biztosít lehetőséget: a default függvényparamétereket.

A default paraméterek lényege, hogy a függvény bizonyos paramétereinek alapértelmezett értéket adunk a függvénydefiníció során. Ha a függvényhíváskor nem adjuk meg az adott paraméter értékét, akkor az az alapértelmezett értéket veszi fel.

Példa: Default paraméter használata

1
2
3
4
5
6
7
8
<?php
  function koszon($nev="Senki") {
    echo "Szia, $nev! <br/>";
  }

  koszon();
  koszon("Tamás");
?>

A kód kimenete

Szia, Senki! Szia, Tamás!

A fenti kódban először paraméter nélkül hívjuk meg a koszon függvényt. Mivel a $nev paraméterváltozónak ekkor nem adunk át értéket, ezért az a "Senki" default értéket veszi fel. A második függvényhívásnál már megadjuk a paraméter értékét ("Tamás"), így ekkor az átadott értéket fogjuk használni a függvényen belül (nem pedig a default értéket).

Egy fontos szabály, amit meg kell jegyeznünk: ha nem minden függvényparaméternek adunk alapértelmezett értéket, akkor mindig az utolsó néhány paraméternek kell default értéket adnunk. Tehát a default paraméterek mindig a paraméterlista jobb oldalán sorakoznak.

Példa: Egy összeadás függvény, amely eltérő paraméterszámmal is meghívható

1
2
3
4
5
6
7
<?php
  function osszead($a, $b=0, $c=0) { return $a + $b + $c; }

  $x = osszead(5);          // 5 + 0 + 0 = 5
  $y = osszead(5, 2);       // 5 + 2 + 0 = 7
  $z = osszead(5, 2, 3);    // 5 + 2 + 3 = 10
?>

Type hint-ek

Gyengén típusos nyelvről lévén szó, a PHP-beli függvények paramétereinek és visszatérési értékének típusa nem kötött. Tehát egy függvény alapból bármilyen típusú paramétereket képes fogadni, és a visszatérési érték is tetszőleges típusú lehet.

A type hint-ek segítségével megadhatjuk a függvényparaméterek és a visszatérési érték elvárt típusát. Ha a kapott típus nem megfelelő, akkor a PHP megpróbálja azt a type hint-tel megadott típusra konvertálni. Ha a konverzió sikertelen, akkor végzetes hibát kapunk.

Példa: Egy átlag függvény, amely két int típusú paramétert vár és egy float értékkel tér vissza

1
2
3
4
5
6
7
8
9
<?php
  function atlag(int $a, int $b) : float {
    return ($a + $b) / 2;
  }

  echo atlag(10, 5) . "<br/>";            // OK, mindkét paraméter int típusú
  echo atlag(3.5, TRUE) . "<br/>";        // OK, mindkét érték int-re konvertálható (3.5 -> 3, TRUE -> 1)
  echo atlag(101, "kiskutya") . "<br/>";  // HIBA! a "kiskutya"-t nem lehet int-re konvertálni!
?>

A kód kimenete

7.5 2 FATAL ERROR Uncaught TypeError: Argument 2 passed to atlag() must be of the type int...

Változó hosszúságú paraméterlista

PHP-ban írhatunk olyan függvényeket is, amelyek tetszőleges számú paraméterrel meghívhatók. Ezt a paraméterváltozó elé írt ... operátorral tehetjük meg. Ekkor a függvényhíváskor megadott paraméterek egy tömbként kerülnek átadásra, amit egy foreach szerkezettel egyszerűen bejárhatunk.

Példa: Egy függvény, amely tetszőleges számú, int típusú paramétert képes fogadni

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
  function atlag(int ...$szamok) : float {    // változó hosszúságú paraméterlista
    $osszeg = 0;
    foreach ($szamok as $szam) {              // paraméterek bejárása
      $osszeg += $szam;
    }
    return $osszeg / count($szamok);
  }

  $a = atlag(10, 20, 30);                       // 20
  $b = atlag(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);    // 5.5
?>

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"/> <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"/> <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: 2021-04-02 08:17:19