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:
id | nev | megjelenesi_ev |
---|---|---|
1 | PHP | 1995-06-08 |
2 | JavaScript | 1995-12-04 |
3 | Java | 1996-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.