MySQL lekérdezés készítése PHP-ban (MySQLi objektumorientált, PDO és MySQLi procedurális módszerrel)

Ebben a leckében bemutatjuk, hogy hogyan készíthetsz MySQL lekérdezéseket PHP-ban objektumorientáltan, procedurálisan vagy PDO-val.

MySQL adatbázis-műveletek a PHP-ban (adatbázis-kapcsolat létrehozása, bezárása, tábla létrehozása, rekord hozzáadása, törlése, módosítása, lekérdezések írása) című cikk borítóképe

MySQL lekérdezés készítése PHP-ban (MySQLi objektumorientált, PDO és MySQLi procedurális módszerrel)

Egy korábbi leckében már foglalkoztunk MySQL adatbázis-műveletekkel PHP nyelv alatt, de ebben a cikkben sokkal részletesebben kifejtjük egyes adatbázis-műveletek megvalósítását. Az előző PHP leckében csak az objektumorientált megvalósítást mutattuk be, de ebben a cikkben mutatunk példát a procedurális és PDO-s megvalósításra is.

Ebben a cikkben már nem ismertetjük az adatbázis és a MySQL fogalmát, ha ezekről is szeretnél többet tudni, akkor olvasd el a korábbi PHP-MySQL leckénket.

Az előző leckében töröltünk egy már létező rekordot a táblánkból, ebben pedig bemutatjuk, hogy hogyan tudtok lekérdezéseket írni.

Mi az a MySQLi?

A MySQLi a PHP5-tel megjelenő modul, amely felületet biztosít az adatbázisszerverekkel végzett műveletek végrehajtásának. Lehetővé teszi a procedurális és az objektumorientált megvalósítást is. Ezt a modul a PHP telepítésekor általában automatikusan települ a számítógépekre. (Ha valakinek mégsem történt volna meg, akkor itt letöltheti és telepítheti.)


A MySQLi bővítmény előnyei:

  • támogatja az objektumorientált megvalósítást
  • támogatja a procedurális interfészt
  • támogatja az előkészített utasításokat
  • támogatja a nyomkövetést
  • támogatja a hibakeresést

Mi az a PDO?

A PDO a PHP Data Objects rövidítése. A PDO tulajdonképpen egy objektum az adatbázis kapcsolatok és lekérdezések egyszerűbb kezelésére. A PDO több különböző adatbázis rendszerrel képes működni, így az igazi előnye, akkor jön elő, amikor szeretnéd lecserélni az adatbázisszervered egy másikra. A PDO használatával csak apróbb módosításokat kell tennünk a kódban.


A PDO nyújtotta lehetőségek:

  • támogatja az objektumorientált megvalósítást
  • támogatja az előkészített utasításokat
  • védelmi funkciók

Mi az az objektumorientált programozás?

Az objektumorientált programozás (angolul object-oriented programming, röviden OOP) egy az objektumokra alapozott programozási elmélet vagy szemlélet. Az objektumok egységbe foglalják az adatokat és a velük kapcsolatos műveleteket. Az adatokat tulajdonságoknak, míg a műveleteket függvényeknek, illetve metódusoknak szoktuk nevezni. Az objektum az objektumorientált programozás egyik alapeleme.

Mi az a procedurális programozás?

A procedurális programozás (vagy eljárás orientált programozás) egy programozási alapelv, melynek alapja a modularitás és a hatókör. A procedurális programozás során azt az alapelvet követjük, hogy a konkrét programozási feladatot minél több kisebb egységre, avagy eljárásra tudjuk bontani. Ezek az eljárások a kódban jól körülhatárolt egységek, melyeket függvénynek vagy metódusnak nevezünk. Egy eljárásnak van elnevezése és olykor visszatérési értéke is. Az eljárás valamilyen műveletet hajt végre. A program futása során a főprogramban ezeket az elkészített eljárásokat hívjuk meg.

Lekérdezés MySQL adatbázisban (select)

Miután a táblánkban már vannak adatok, lehetőségünk van arra, hogy különböző lekérdezéseket írjunk. Ezekkel a lekérdezésekkel kilistázhatjuk egy adott feltételnek megfelelő sorokat (rekordokat). Például kilistázhatjuk az összes programnyelvet, amely 2000 után jelent meg.


SQL lekérdező szintaxis:

SELECT mező(k).neve(i) FROM táblanév
FROM feltétel
Code language: SQL (Structured Query Language) (sql)

A mezők neveihez azokat a neveket kell írnunk, amelyek a táblában léteznek és szeretnénk, hogy eredményként megjelennének. A “WHERE” feltétel elhagyható, csak abban az esetben kell használnunk, ha nem szeretnénk a tábla összes elemét kilistázni.

Például, ha írunk egy ilyen lekérdezést:

SELECT id, nev, megjelenesi_ev FROM programnyelvek
Code language: SQL (Structured Query Language) (sql)

Akkor ez lesz az eredménye:

idnevmegjelenesi_ev
1PHP1995-06-08
2JavaScript1995-12-04
3Java1996-01-23

Ez kilistázta a tábla összes rekordját, azaz sorát, mert nem tettünk semmilyen feltételt.

Az “id, nev, megjelenesi_ev” helyett írhattam volna csillagot (“*”) is, hiszen ezzel kilistázzuk az összes oszlopot. Ha csak a nevüket szerettem volna kilistázni, akkor így kellett volna írnom:

SELECT nev FROM programnyelvek
Code language: SQL (Structured Query Language) (sql)

Melynek ez lesz az eredménye:

nev
PHP
JavaScript
Java

Lekérdezés készítése MySQL táblában objektumorientált módon (MySQL select)

Legelőször nézzük meg a rendkívül népszerű objektumorientált megvalósítást.


Szintaktika:

KAPCSOLAT->query(SQL.KÓD);
Code language: CSS (css)

Objektumorientált programozás esetében bármilyen SQL utasítás (új rekord felvitele, törlése, módosítása) végrehajtása során a használni kívánt kapcsolatunkra (alábbi példánkban “$conn”) kell meghívni a “query()” függvényt, melynek az SQL utasítás az egyetlen paramétere. Az SQL utasításokat érdemes egy változóba kiszervezni és azt átadni paraméterként.


Példa lekérdezés írására MySQL-ben PHP nyelv alatt objektumorientáltan:

PHP kód

<?php
  // adatok felvétele a kapcsolathoz
  $servername = "localhost";
  $username = "felhasznalo";
  $password = "jelszo";
  $dbname = "adatbazis";

  $conn = new mysqli($servername, $username, $password, $dbname); // kapcsolat létrehozása

  // SQL lekérdezés
  $sql = "SELECT id, nev FROM programnyelvek";

  $result = $conn->query($sql);

  // eredmény kiíratása
  if ($result->num_rows > 0) { // ha a lekérdezésnek van eredménye, akkor belépünk az if-be
    while($row = $result->fetch_assoc()) { // amíg van rekord, addig kiírom őket
      echo "id: " . $row["id"]. ", név: " . $row["nev"]. "<br>";
    }
  } else {
    echo "A lekérdezésnek nincs eredménye."; // nincs eredmény
  }

  // kapcsolat lezárása
  $conn->close();
?>
Code language: PHP (php)

Eredmény

id: 1, név: PHP
id: 2, név: JavaScript
id: 3, név: Java


A fenti kódban megírtuk a lekérdezésünket, amely szerint az “id” és a “nev” mezőket szeretnénk lekérdezni. A lekérdezés eredményét eltároljuk a “$result” változóban. Majd következik az eredmény kiíratása. Először megvizsgáljuk, hogy a sorok száma nagyobb-e, mint nulla, mivel ha nem nagyobb, akkor nincs mit kiíratnunk, így fölösleges belépnünk a kiíratáshoz. Ha nagyobb, akkor a lekérdezésünk eredménnyel tért vissza, készítünk egy while ciklust, amely addig megy, amíg a “$row” nem tér vissza null értékkel. Akkor fog null értékkel visszatérni, amikor már nincs több sor. A while ciklus magjában egyszerűen kiíratjuk az id-t és a nevet.

Lekérdezés készítése procedurálisan (MySQL select)

Az objektumorientált verzió után nézzük meg a lekérdezés készítésére vonatkozó procedurális utasításokat.


Szintaxis:

mysqli_query(KAPCSOLAT, SQL.UTASÍTÁS);
Code language: CSS (css)

Emlékezzünk rá, hogy bármilyen SQL utasítást (új rekord felvitele, törlése, módosítása) szeretnénk végrehajtani procedurálisan, mindig a “mysqli_query” függvénnyel tehetjük meg, melynek az első paramétere a kapcsolat, míg a második a végrehajtandó SQL kód.


Lekérdezés írása procedurális megvalósítással PHP nyelvben:

PHP kód

<?php
  // adatok felvétele a kapcsolathoz
  $servername = "localhost";
  $username = "felhasznalo";
  $password = "jelszo";
  $dbname = "adatbazis";

  $conn = mysqli_connect($servername, $username, $password, $dbname); // kapcsolat létrehozása
  
  // lekérdezés megírása
  $sql = "SELECT id, nev FROM programnyelvek";

  $result = mysqli_query($conn, $sql);

  if (mysqli_num_rows($result) > 0) { // megvizsgáljuk, hogy a lekérdezésnek van-e eredménye
    // amíg van sor, addig kiíratjuk
    while($row = mysqli_fetch_assoc($result)) { // addig megy amíg van még sor, rekord
       echo "id: " . $row["id"]. ", név: " . $row["nev"]. "<br>";
    }
  } else {
    echo "A lekérdezésnek nincs eredménye."; // nincs eredmény
  }

  mysqli_close($conn); // kapcsolat lezárása
?>
Code language: PHP (php)

Eredmény

id: 1, név: PHP
id: 2, név: JavaScript
id: 3, név: Java

A fenti kódban megírtuk a lekérdezésünket, amely szerint az “id” és a “nev” mezőket szeretnénk lekérdezni. A lekérdezés eredményét eltároljuk a “$result” változóban. Az ezt követő “if” elágazásban megvizsgáltuk a lekérdezés eredményéül kapott sorok számát, ha ez nagyobb, mint nulla, akkor kiíratjuk a sorok számát a “mysqli_fetch_assoc” segítségével. Ha a lekérdezésünk eredmény nélkül végződne, akkor is adunk visszajelzést a felhasználónak.

MySQL lekérdezés készítése, írása PHP-ban PDO-val (MySQL select)

Először megnéztük objektumorientáltan, majd procedurálisan a lekérdezés írásának módszerét, most itt az ideje, hogy szemügyre vegyük a PDO-s megvalósítást.


Lekérdezés futtató szintaxis PDO esetében:

KAPCSOLAT->exec(SQL.KÓD);
Code language: CSS (css)

Jegyezzük meg, hogy bármilyen SQL utasítást (új rekord felvitele, törlése, frissítése) szeretnénk végrehajtani PDO-s kapcsolat során, mindig az “exec” függvényt kell meghívnunk a kapcsolatra vonatkozóan, melynek egy paramétere van, az SQL utasítás.


Lekérdezés készítése PDO-s megvalósítással PHP környezetben:

PHP kód

<?php
  // adatok felvétele a kapcsolathoz
  $servername = "localhost";
  $username = "felhasznalo";
  $password = "jelszo";
  $dbname = "adatbazis"

  // megpróbáljuk végrehajtani az adatbázisműveleteket, ha nem sikerül, akkor elkapjuk a hibát a "catch"-ben
  try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // PDO kapcsolat létrehozása
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // hibakezelés beállítása

  // SQL utasítás
  $sql = "SELECT id, nev FROM programnyelvek";
  $result = $conn->query($sql); // SQL kód futtatása

  while ($row = $result->fetch()) { // amíg van sor, addig megy a while ciklus
    echo "id: " . $row["id"]. ", név: " . $row["nev"]. "<br>"; // rekord kiíratása
  }
  } catch (PDOException $e) { // ha hiba van, akkor ide lépünk be
    echo "Sikertelen művelet.: " . $e->getMessage(); // esetleges hiba kiíratása
  }

  $conn = null; // kapcsolat lezárása
?>
Code language: PHP (php)

Eredmény

id: 1, név: PHP
id: 2, név: JavaScript
id: 3, név: Java


Először megírjuk az SQL kódunkat, majd a “$result” változóba eltároljuk a kód futtatásának az eredményét. Ezt követően a “while” ciklus segítségével addig íratjuk kifele a sorokat, amíg el nem fogynak. Hogy hány sorunk van, pontosabban, hogy meddig van sorunk, azt a “$result->fetch()” biztosítja.

Ha hasznos volt számodra, akkor kérlek oszd meg másokkal is, hogy ezzel támogass minket!