Real Estate feladat
Adott egy egyszerű 1 táblás adatbázis néhány adattal:
CREATE DATABASE real_estate CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE real_estate;
CREATE TABLE apartments (
id INT AUTO_INCREMENT PRIMARY KEY,
address VARCHAR(255) NOT NULL,
city VARCHAR(100) NOT NULL,
postal_code VARCHAR(20) NOT NULL,
size INT NOT NULL COMMENT 'Méret négyzetméterben',
rooms INT NOT NULL COMMENT 'Szobák száma',
price DECIMAL(10,2) NOT NULL COMMENT 'Ár forintban',
owner_name VARCHAR(100) NOT NULL,
owner_phone VARCHAR(20) NOT NULL,
listed_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Hirdetés feladási
dátuma',
description TEXT COMMENT 'Lakás rövid leírása',
image_url VARCHAR(255) DEFAULT NULL COMMENT 'Kép URL a lakásról'
);
INSERT INTO apartments (address, city, postal_code, size, rooms, price, owner_name, owner_phone, description, image_url)
VALUES
('Kossuth Lajos utca 10.', 'Budapest', '1053', 85, 3, 75000000, 'Kovács János', '+36201234567', 'Kiváló állapotú lakás
a belvárosban', 'https://example.com/lakas1.jpg'),
('Petőfi Sándor utca 15.', 'Debrecen', '4025', 65, 2, 45000000, 'Nagy Mária', '+36203334444', 'Felújított panel lakás
parkra néző kilátással', 'https://example.com/lakas2.jpg'),
('Táncsics Mihály tér 8.', 'Szeged', '6720', 120, 4, 98000000, 'Szabó Péter', '+36204445555', 'Új építésű családi ház
csendes környezetben', 'https://example.com/lakas3.jpg');
A feladat egy realestate.php fájl létrehozása, a REST
API követelményeinek megfelelően.
Megoldás lépésről lépésre:
Adatbázis kapcsolat létrehozása a legegyszerűbb módon:
$servername = "localhost";
$username = "root";
$password = "";
$database = "real_estates";
$dbconn = new mysqli($servername,
$username, $password, $database);
if ($dbconn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$dbconn->set_charset("utf8mb4");
Sor |
Mit csinál? |
Megjegyzés |
$servername
= "localhost"; |
MySQL
szerver címe |
Lokálisan
vagy távoli szerveren lehet. |
$username
= "root"; |
MySQL
felhasználónév |
Root az
alapértelmezett helyi szervereken. |
$password
= ""; |
MySQL
jelszó |
XAMPP-ben
alapértelmezetten üres. |
$database
= "real_estates"; |
Használt
adatbázis neve |
A
megfelelő adatbázist kell beírni. |
$dbconn =
new mysqli(...) |
Kapcsolat
létrehozása |
A MySQLi
objektumot inicializálja. |
if
($dbconn->connect_error) { ... } |
Hibakezelés |
Ha a
kapcsolat nem jön létre, leállítja a programot. |
$dbconn->set_charset("utf8mb4"); |
Karakterkódolás
beállítása |
Fontos az
ékezetes betűk miatt. |
A következő négy header()
függvény meghatározza, hogy az API hogyan kommunikál a böngészőkkel és más
kliensekkel. Ezek a fejlécek különösen fontosak akkor, ha másik doménről
(cross-origin) érkező kéréseket is engedélyezni szeretnénk.
1. header("Access-Control-Allow-Origin: *");
Mit csinál?
Ez a fejlécküldés engedi, hogy bármelyik doménről (*) lehessen kéréseket
küldeni az API-hoz.
Miért kell?
- Ha a frontend egy másik doménen
van (pl. http://frontend.com), és az API egy másik szerveren fut
(http://backend.com), akkor az alapértelmezett böngészőbiztonsági
szabályok (CORS - Cross-Origin Resource Sharing) miatt a kérések
blokkolva lennének.
- Ez a fejléc megoldja ezt a
problémát, és engedélyezi az API elérését bármilyen doménről.
Alternatíva:
Ha csak bizonyos doméneket szeretnél engedélyezni, akkor helyette ezt
használhatod:
header("Access-Control-Allow-Origin:
https://frontend.com");
2. header("Access-Control-Allow-Methods: GET,
POST, PUT, DELETE, OPTIONS");
Mit csinál?
Ez határozza meg, hogy az API milyen HTTP metódusokat engedélyez.
Miért kell?
- Ha egy böngészőben futó
JavaScript alkalmazás küld egy POST vagy PUT kérést az API-ra, a
szervernek meg kell adnia, hogy ezt a műveletet engedélyezi.
- Az OPTIONS metódus azért
fontos, mert a böngészők előzetes "preflight" kérést küldenek
(OPTIONS), hogy ellenőrizzék, milyen műveletek engedélyezettek.
Alternatíva:
Ha csak GET és POST kéréseket szeretnél engedélyezni:
header("Access-Control-Allow-Methods:
GET, POST");
3. header("Access-Control-Allow-Headers:
Content-Type, Authorization");
Mit csinál?
Ez meghatározza, hogy a kliens milyen egyedi HTTP-fejléceket küldhet az
API-nak.
Miért kell?
- Ha a frontend Content-Type:
application/json fejlécet küld egy POST vagy PUT kérésben, akkor alapértelmezetten
a szerver ezt elutasítaná, kivéve ha kifejezetten engedélyezzük.
- Az Authorization fejléc
engedélyezése fontos, ha hitelesítési tokeneket (Bearer Token, JWT)
küldünk az API számára.
Alternatíva:
Ha több egyedi fejlécet szeretnél engedélyezni:
header("Access-Control-Allow-Headers:
Content-Type, Authorization, X-Requested-With");
(Az
X-Requested-With például AJAX kérések esetén hasznos lehet.)
4. header("Content-Type: application/json;
charset=UTF-8");
Mit csinál?
Ez azt mondja meg a böngészőnek vagy más kliensnek, hogy az API válasza JSON
formátumú, és az adatok UTF-8 kódolásúak.
Miért kell?
- A modern REST API-k JSON
adatokat használnak, ezért ezt a szervernek egyértelműen jeleznie kell
a kliensek felé.
- Az UTF-8 karakterkódolás
biztosítja, hogy az ékezetes karakterek (á, é, ő, ü) és egyéb speciális
karakterek helyesen jelenjenek meg.
Alternatíva:
Ha például egy XML formátumú API-t készítenél:
header("Content-Type:
application/xml; charset=UTF-8");
Fejléc |
Miért fontos? |
Access-Control-Allow-Origin:
* |
Engedélyezi
a CORS-t, így más domének is elérhetik az API-t. |
Access-Control-Allow-Methods:
GET, POST, PUT, DELETE, OPTIONS |
Meghatározza,
milyen HTTP metódusok engedélyezettek. |
Access-Control-Allow-Headers:
Content-Type, Authorization |
Engedélyezi
az egyedi fejléceket (pl. Content-Type: application/json, Authorization). |
Content-Type:
application/json; charset=UTF-8 |
Beállítja,
hogy az API válasza JSON és UTF-8 karakterkódolású legyen. |
Ha ezeket
nem állítanánk be, akkor:
- A böngésző blokkolhatná a
kéréseket a CORS miatt.
- Nem tudnánk POST, PUT és DELETE
műveleteket végrehajtani.
- JSON helyett a szerver lehet,
hogy plain textként küldené a választ.
Ezért ezek a
fejlécek elengedhetetlenek egy jól működő REST API esetén!
$requestMethod =
$_SERVER['REQUEST_METHOD'];
- A PHP $_SERVER
szuperglobális változójának REQUEST_METHOD eleme a beérkező HTTP
kérés metódusát tárolja (GET, POST, PUT, DELETE, stb.).
- Ez az érték attól függ, hogy a
kliens (pl. böngésző, Postman, JavaScript fetch() API) milyen módszert
használ a kérés küldésére.
$id
= isset($_GET['id']) ? intval($_GET['id']) : null;
· Ellenőrzi,
hogy a kliens megadott-e egy id paramétert a kérésben (GET metódus esetén az
URL-ben, PUT vagy DELETE metódusnál is szerepelhet az URL-ben).
· Ha
igen, akkor integer típusúvá alakítja (intval()) az értéket.
· Ha
nincs id paraméter, akkor null értéket ad.
·
Példa bemenetek és kimenetek:
URL |
$_GET['id'] |
$id értéke |
/apartments.php?id=5 |
"5"
(string) |
5 (int) |
/apartments.php?id=abc |
"abc" |
0 (mert
intval("abc") → 0) |
/apartments.php |
nincs |
null |
Az intval($_GET['id']) segítségével biztosítjuk,
hogy az id mindig szám legyen, és így elkerüljük az SQL injection
támadásokat vagy hibás lekérdezéseket.
Ha egy kérést például DELETE
metódussal küldenek, ellenőriznünk kell, hogy van-e id:
1. case 'GET': – Adatok lekérése
case 'GET':
if ($id) {
getApartmentById($id, $dbconn);
} else {
getAllApartments($dbconn);
}
break;
- Mit csinál?
- Ha van id az URL-ben (GET
/apartments.php?id=5), akkor meghívja a getApartmentById($id, $dbconn);
függvényt, amely egy adott lakás adatait kéri le.
- Ha nincs id paraméter,
akkor a getAllApartments($dbconn); függvény fut le, amely az összes
lakást lekéri.
- Miért fontos?
- Ez biztosítja, hogy a GET
metódus egyedi lakást vagy az összes lakást lekérje a
kliens kérésének megfelelően.
2. case 'POST': – Új lakás létrehozása
case 'POST':
createApartment($dbconn);
break;
- Mit csinál?
- Meghívja a
createApartment($dbconn); függvényt, amely új lakás adatokat vesz fel az
adatbázisba.
- Miért fontos?
- A POST metódus új rekordot
hoz létre az adatbázisban.
- Általában a kliens egy JSON
objektumot küld a kérés törzsében az új lakás adataival.
3. case 'PUT': – Lakás adatainak frissítése
case 'PUT':
if ($id) {
updateApartment($id, $dbconn);
} else {
http_response_code(400);
echo json_encode(['status' =>
'error', 'message' => 'Hiányzik az azonosító.']);
}
break;
- Mit csinál?
- Ha van id paraméter (PUT
/apartments.php?id=5), akkor meghívja az updateApartment($id, $dbconn);
függvényt.
- Ha nincs id, akkor egy
400 Bad Request hibakódot küld vissza és egy hibaüzenetet ad vissza JSON
formátumban.
- Miért fontos?
- A PUT metódus egy létező
lakás adatainak frissítésére szolgál, ezért szükség van egy id-ra,
hogy tudja, melyik lakást kell módosítani.
4. case 'DELETE': – Lakás törlése
case 'DELETE':
if ($id) {
deleteApartment($id, $dbconn);
} else {
http_response_code(400);
echo json_encode(['status' =>
'error', 'message' => 'Hiányzik az azonosító.']);
}
break;
- Mit csinál?
- Ha van id az URL-ben (DELETE
/apartments.php?id=5), akkor meghívja a deleteApartment($id, $dbconn);
függvényt, amely törli az adott lakást az adatbázisból.
- Ha nincs id, akkor 400
Bad Request hibát ad vissza JSON üzenettel.
- Miért fontos?
- A DELETE metódus egy adott
rekord törlésére szolgál, ezért szükséges az id.
5. default: – Nem támogatott HTTP metódus kezelése
default:
http_response_code(405);
echo json_encode(['status' => 'error', 'message' => 'Nem
támogatott HTTP metódus.']);
break;
- Mit csinál?
- Ha a kliens egy nem
támogatott HTTP metódust (PATCH, HEAD, stb.) küld, akkor 405 Method
Not Allowed hibát küld vissza és egy hibaüzenetet ad JSON formátumban.
- Miért fontos?
- Ez megakadályozza, hogy az API
hibás vagy nem engedélyezett metódusokat fogadjon el.
HTTP metódus |
Mit csinál? |
GET |
Egy adott
lakás vagy az összes lakás lekérése. |
POST |
Új lakás
létrehozása. |
PUT |
Egy
meglévő lakás adatainak frissítése (id szükséges). |
DELETE |
Egy adott
lakás törlése (id szükséges). |
default |
Ha nem
támogatott metódust küld a kliens, 405 hibát ad vissza. |
Ez a
szerkezet biztosítja, hogy az API megfelelően kezelje a különböző HTTP
kéréseket, és hibabiztosan működjön.
getAllApartments($dbconn)
Ez a
függvény az apartments tábla összes rekordját lekéri az adatbázisból,
majd JSON formátumban visszaadja. Vizsgáljuk meg soronként!
1. Függvény deklarálása
function getAllApartments($dbconn) {
- Mit csinál?
- Létrehoz egy függvényt
getAllApartments néven.
- Bemeneti paramétere $dbconn, ami a MySQL
adatbázis kapcsolatot jelenti.
2. SQL lekérdezés létrehozása
$query = "SELECT * FROM
apartments";
- Mit csinál?
- Az SQL lekérdezést egy
változóba ($query) menti.
- A SELECT * FROM apartments
utasítás azt jelenti, hogy az összes oszlopot és rekordot ki
akarjuk olvasni az apartments táblából.
3. Lekérdezés futtatása
$result = mysqli_query($dbconn,
$query);
- Mit csinál?
- A mysqli_query($dbconn,
$query) függvény futtatja a korábban definiált SQL lekérdezést.
- Ha sikeres a lekérdezés, a
mysqli_query() visszaad egy eredményobjektumot ($result), amely
tartalmazza a lekérdezett adatokat.
- Ha hibás az SQL
utasítás vagy nincs kapcsolat az adatbázissal, $result értéke false lesz.
4. Ellenőrzi, hogy sikeres volt-e a lekérdezés
if ($result) {
- Mit csinál?
- Ellenőrzi, hogy a $result
változó nem false, azaz a lekérdezés sikeres volt-e.
5. Adatok tömbbé alakítása
$data = mysqli_fetch_all($result,
MYSQLI_ASSOC);
- Mit csinál?
- A mysqli_fetch_all($result,
MYSQLI_ASSOC) függvény az összes lekérdezett rekordot egy asszociatív
tömbként (MYSQLI_ASSOC) formázza meg.
- Példa visszatérési értékre:
[
["id" => 1, "address" => "Fő utca
10.", "city" => "Budapest"],
["id" => 2, "address" => "Kossuth tér
5.", "city" => "Szeged"]
]
- Ez JSON-kompatibilis,
így könnyen továbbítható a kliens felé.
6. HTTP státuszkód beállítása a sikeres válaszhoz
http_response_code(200);
- Mit csinál?
- Beállítja a HTTP
válaszkódot 200-ra, ami azt jelzi a kliens felé, hogy a kérés sikeresen
teljesült.
- A 200 OK státuszkód az egyik
leggyakoribb HTTP válaszkód az API-k esetében.
7. JSON válasz küldése a kliensnek
echo json_encode(['status' =>
'success', 'data' => $data]);
- Mit csinál?
- JSON formátumban küldi vissza
az adatokat a kliens felé.
- Visszaküldött formátum (példa):
{
"status": "success",
"data": [
{"id": 1,
"address": "Fő utca 10.", "city":
"Budapest"},
{"id": 2,
"address": "Kossuth tér 5.", "city":
"Szeged"}
]
}
8. Ha a lekérdezés nem sikerült, hibakódot ad vissza
} else {
http_response_code(500);
- Mit csinál?
- Ha a $result értéke false,
azaz a lekérdezés sikertelen, akkor 500-as HTTP válaszkódot
(Internal Server Error) küld vissza.
- Az 500 státuszkód azt jelzi,
hogy a szerver oldalon valamilyen hiba történt.
9. Hibaüzenet küldése a kliensnek
echo json_encode(['status' => 'error', 'message' => 'Adatbázis
hiba: ' . mysqli_error($dbconn)]);
- Mit csinál?
- JSON formátumban küldi vissza a
hibaüzenetet.
- Példa visszakapott
hibaüzenetre:
{
"status": "error",
"message": "Adatbázis hiba: Unknown column 'city' in
'field list'"
}
- A mysqli_error($dbconn)
függvény segítségével megmutatja a MySQL hibát, ami segíthet a
hibakeresésben.
Sor |
Kód |
Mit csinál? |
Miért fontos? |
1. |
function
getAllApartments($dbconn) { |
Létrehozza
a függvényt. |
Az API így
képes hívni ezt a funkciót. |
2. |
$query =
"SELECT * FROM apartments"; |
SQL
lekérdezés létrehozása. |
Meghatározza,
hogy milyen adatokat kérünk le. |
3. |
$result =
mysqli_query($dbconn, $query); |
SQL
futtatása. |
Ha hiba
történik, $result false lesz. |
4. |
if
($result) { |
Ellenőrzi
a lekérdezés sikerességét. |
Megakadályozza
a hibás adatok visszaadását. |
5. |
$data =
mysqli_fetch_all($result, MYSQLI_ASSOC); |
Az eredményt
asszociatív tömbbé alakítja. |
Könnyen
feldolgozhatóvá teszi az adatokat. |
6. |
http_response_code(200); |
Beállítja
a sikeres válaszkódot. |
A kliens
tudja, hogy a lekérdezés sikeres volt. |
7. |
echo
json_encode([...]); |
JSON
válasz visszaküldése. |
Az API szabványos
választ küld. |
8. |
} else { |
Hibaellenőrzés. |
Ha hiba
van, ne adjunk vissza üres JSON-t. |
9. |
http_response_code(500); |
Beállítja
az 500-as hibakódot. |
A kliens
tudja, hogy hiba történt. |
10. |
echo
json_encode([...]); |
JSON
formátumú hibaüzenetet küld. |
Segít a
hibakeresésben. |
Lehetséges továbbfejlesztések
- Lapozás (LIMIT, OFFSET)
bevezetése, hogy
ne terhelje túl a szervert sok rekord esetén:
$query = "SELECT * FROM
apartments LIMIT 50 OFFSET 0";
- Hibakezelés pontosítása, pl. ha nincs találat, 404 Not
Found küldése:
if (empty($data)) {
http_response_code(404);
echo json_encode(['status' => 'error', 'message' => 'Nem található
adat.']);
return;
}
- JSON_PRETTY_PRINT hozzáadása fejlesztői környezetben a
könnyebb olvashatóság érdekében:
echo json_encode(['status' =>
'success', 'data' => $data], JSON_PRETTY_PRINT);
Ez a
függvény biztonságosan lekérdezi az adatokat, JSON formátumban
visszaküldi, és megfelelően kezeli az adatbázis hibákat. A helyes
HTTP státuszkódokat is beállítja, így jól működik API-ként frontend vagy
más rendszerek számára.
getApartmentById($id, $dbconn)
Ez a
függvény egy adott lakás adatait kéri le az apartments táblából a megadott
id alapján. A lekérdezés biztonságos módon történik előkészített
(prepared) SQL utasítással, és az eredményt JSON formátumban adja vissza.
1. Függvény deklarálása
function getApartmentById($id,
$dbconn) {
- Mit csinál?
- Létrehoz egy függvényt
getApartmentById néven.
- Bemeneti paraméterek:
- $id: A keresett lakás
azonosítója.
- $dbconn: A MySQL adatbázis
kapcsolat.
2. SQL lekérdezés előkészítése
$query = "SELECT * FROM
apartments WHERE id = ?";
- Mit csinál?
- Létrehoz egy paraméterezett
SQL lekérdezést, amely az id alapján keresi a lakást.
- A ? helyettesítő (placeholder)
jelzi, hogy az id értékét biztonságosan, később fogjuk
behelyettesíteni.
- Miért fontos?
- SQL injection elleni védelem: így elkerülhető, hogy a
felhasználó rosszindulatú SQL parancsokat adjon meg az id
helyett.
- Hatékonyabb lekérdezés: az SQL szerver optimalizálni
tudja az ilyen lekérdezéseket.
3. Lekérdezés előkészítése
$stmt = $dbconn->prepare($query);
- Mit csinál?
- A prepare() függvény előállít
egy SQL utasítást, amely később végrehajtható biztonságosan.
- Miért fontos?
- Megakadályozza az SQL
injection támadásokat.
- Gyorsítja az
adatbázis-lekérdezéseket (SQL szerver optimalizáció miatt).
4. Paraméter értékének beállítása
$stmt->bind_param('i', $id);
- Mit csinál?
- A bind_param('i', $id)
függvény hozzárendeli az id értéket a korábban létrehozott ?
helyettesítőhöz.
- 'i' azt jelenti, hogy az id egész
szám (integer) típusú érték.
- Miért fontos?
- Ha az id nem szám, az
SQL szerver automatikusan elutasítja, így megelőzhetők a hibák és
biztonsági rések.
5. SQL parancs végrehajtása
$stmt->execute();
- Mit csinál?
- Végrehajtja az előkészített
SQL lekérdezést a megadott id-val.
- Miért fontos?
- A bind_param() segítségével a
paraméterezett lekérdezések garantáltan biztonságosak.
6. Eredmények lekérdezése
$result = $stmt->get_result();
- Mit csinál?
- Az SQL szerver eredményhalmazát
(result set) visszaadja.
- Az adatok itt még nem
olvashatók, csak egy objektum tartalmazza őket.
7. Ellenőrzi, hogy van-e találat
if ($result->num_rows > 0) {
- Mit csinál?
- Megnézi, hogy a lekérdezés
visszaadott-e legalább egy eredményt.
- Ha num_rows > 0, az azt
jelenti, hogy az id-hoz létezik egy lakás.
8. Ha van találat, JSON formátumban visszaadja az
adatokat
http_response_code(200);
echo json_encode(['status' =>
'success', 'data' => $result->fetch_assoc()]);
- Mit csinál?
- Beállítja a 200 OK
válaszkódot (http_response_code(200)), ami azt jelzi, hogy a kérés
sikeres volt.
- A fetch_assoc() metódus az első
találatot egy asszociatív tömbbé alakítja, pl.:
[
"id" => 5,
"address" => "Kossuth Lajos utca 10.",
"city" => "Budapest",
"price" => 75000000
]
- JSON válaszként visszaküldi a
klienseknek:
{
"status": "success",
"data": {
"id": 5,
"address": "Kossuth
Lajos utca 10.",
"city": "Budapest",
"price": 75000000
}
}
9. Ha nincs találat, hibaüzenetet küld
} else {
http_response_code(404);
echo json_encode(['status' => 'error', 'message' => 'Lakás nem
található.']);
- Mit csinál?
- Ha nincs találat
(num_rows == 0), beállítja a 404 Not Found státuszkódot.
- JSON válaszként hibaüzenetet
küld a kliensnek:
{
"status": "error",
"message": "Lakás nem található."
}
- Miért fontos?
- A kliens (frontend,
mobilalkalmazás) így tudja, hogy a megadott azonosító nem található az
adatbázisban.
Sor |
Kód |
Mit csinál? |
Miért fontos? |
1. |
function
getApartmentById($id, $dbconn) { |
Függvény
létrehozása. |
Az API
ezen keresztül hívható. |
2. |
$query =
"SELECT * FROM apartments WHERE id = ?"; |
SQL
lekérdezés paraméterrel. |
Biztonságos
SQL kezelés. |
3. |
$stmt =
$dbconn->prepare($query); |
Lekérdezés
előkészítése. |
SQL
injection elleni védelem. |
4. |
$stmt->bind_param('i',
$id); |
Az id
értékét beilleszti a lekérdezésbe. |
Típusbiztosítás,
védelem. |
5. |
$stmt->execute(); |
Lekérdezés
végrehajtása. |
Az
adatbázis megkapja az utasítást. |
6. |
$result =
$stmt->get_result(); |
Eredmények
lekérése. |
Ellenőrizni
tudjuk a találatokat. |
7. |
if
($result->num_rows > 0) { |
Megnézi,
hogy van-e találat. |
Csak akkor
ad vissza adatot, ha létezik. |
8. |
echo
json_encode([...]); |
JSON
formátumban visszaadja az adatokat. |
Az API
kliens könnyen feldolgozhatja. |
9. |
http_response_code(404); |
Ha nincs
találat, 404-es hibát küld. |
Hibakezelés
a kliensek számára. |
Lehetséges továbbfejlesztések
- Lapozás (LIMIT használata): Ha több találat lehet (bár
itt id alapján van keresés, így mindig maximum 1 rekordot kapunk).
- Hibaellenőrzés
($stmt->execute() visszatérési értéke): Ha a prepare() vagy execute()
sikertelen, kezelni kell a hibát.
- JSON_PRETTY_PRINT használata
fejlesztési célokra:
echo json_encode(['status' =>
'success', 'data' => $result->fetch_assoc()], JSON_PRETTY_PRINT);
Ezzel a
függvénnyel biztonságosan és hatékonyan lehet egy adott lakás adatait
lekérni az API-ból!
createApartment($dbconn)
Ez a
függvény egy új lakás (apartment) létrehozását végzi az adatbázisban. A
kliens JSON formátumban küldi el az új lakás adatait, és a függvény
ezeket beilleszti az apartments táblába. Nézzük meg részletesen, hogy hogyan
működik!
1. Függvény deklarálása
function createApartment($dbconn) {
- Mit csinál?
- Létrehoz egy createApartment
nevű függvényt.
- Bemeneti paramétere: $dbconn, amely a MySQL
adatbázis kapcsolatot jelöli.
2. Kliens által küldött adatok beolvasása
$data =
json_decode(file_get_contents('php://input'), true);
- Mit csinál?
- file_get_contents('php://input'):
Beolvassa a POST kérés törzsét, amely JSON formátumban tartalmazza
az új lakás adatait.
- json_decode(..., true):
Átalakítja a JSON-t asszociatív tömbbé.
- Példa bejövő JSON adatra (amit
a kliens küldhet):
{
"address": "Kossuth Lajos utca 10.",
"city": "Budapest",
"postal_code": "1053",
"size": 85,
"rooms": 3,
"price": 75000000,
"owner_name": "Kovács János",
"owner_phone": "+36201234567",
"description": "Kiváló állapotú lakás a
belvárosban",
"image_url": "https://example.com/lakas1.jpg"
}
3. Ellenőrzi, hogy van-e bejövő adat
if (!$data) {
http_response_code(400);
echo json_encode(['status' => 'error', 'message' => 'Hiányos
adatok.']);
return;
}
- Mit csinál?
- Ha $data értéke null vagy
false, akkor azt jelenti, hogy a JSON nem volt megfelelő.
- 400 Bad Request hibakódot küld vissza és egy hibaüzenetet
ad a kliensnek.
- Példa hibás válaszra:
{
"status": "error",
"message": "Hiányos adatok."
}
4. SQL lekérdezés előkészítése
$query = "INSERT INTO
apartments (address, city, postal_code, size, rooms, price, owner_name,
owner_phone, description, image_url)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?,
?)";
- Mit csinál?
- Létrehoz egy paraméterezett
SQL INSERT lekérdezést, amely egy új lakás adatait menti az
apartments táblába.
- A ? helyettesítők
(placeholders) biztosítják, hogy a beillesztendő adatok biztonságosan
legyenek kezelve.
5. Lekérdezés előkészítése
$stmt = $dbconn->prepare($query);
- Mit csinál?
- Előkészíti az SQL lekérdezést
($stmt), hogy paraméterezett lekérdezést tudjunk végrehajtani.
- Miért fontos?
- SQL injection elleni védelem: megakadályozza, hogy
rosszindulatú SQL kódokat adjanak meg az adatok között.
- Gyorsabb végrehajtás: az SQL szerver optimalizálni
tudja az előkészített lekérdezéseket.
6. Paraméterek hozzárendelése és adatok beszúrása
$stmt->bind_param('sssiiissss',
$data['address'], $data['city'], $data['postal_code'], $data['size'],
$data['rooms'],
$data['price'], $data['owner_name'], $data['owner_phone'],
$data['description'], $data['image_url']);
- Mit csinál?
- Hozzárendeli az adatokat a megfelelő paraméterekhez.
- Mit jelentenek az 'sssiiissss'
betűk?
- s (string) → address,
city, postal_code, owner_name, owner_phone, description, image_url
- i (integer) → size,
rooms, price
- Miért fontos?
- Biztosítja, hogy az adatokat helyes
típusban adjuk át az adatbázisnak.
- Elősegíti a hatékonyabb SQL
végrehajtást.
7. SQL parancs végrehajtása
if ($stmt->execute()) {
- Mit csinál?
- Ha az SQL parancs sikeresen
lefut, akkor folytatja a sikeres válaszküldést.
- Ha hiba történik, akkor
a false értéket kapja vissza.
8. Sikeres adatbeillesztés esetén válaszküldés
http_response_code(201);
echo json_encode(['status' =>
'success', 'message' => 'Lakás sikeresen létrehozva.', 'id' =>
$stmt->insert_id]);
- Mit csinál?
- 201 Created státuszkódot állít be → ez
szabványos válaszkód az új rekordok létrehozására.
- JSON válaszként visszaküldi a
sikeres üzenetet és az újonnan létrehozott rekord id-ját.
- Példa sikeres válaszra:
{
"status": "success",
"message": "Lakás sikeresen létrehozva.",
"id": 12
}
9. Hiba esetén válaszküldés
} else {
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => 'Hiba az adat létrehozásakor.']);
}
- Mit csinál?
- Ha az execute() nem sikerült
(pl. adatbázis hiba miatt), akkor 500 Internal Server Error
státuszkódot állít be.
- JSON válaszként visszaküldi a hibaüzenetet.
- Példa sikertelen válaszra:
{
"status": "error",
"message": "Hiba az adat létrehozásakor."
}
Sor |
Kód |
Mit csinál? |
Miért fontos? |
1. |
function
createApartment($dbconn) { |
Függvény
létrehozása. |
Az API
ezen keresztül hívható. |
2. |
$data =
json_decode(file_get_contents('php://input'), true); |
JSON
adatok beolvasása a kérésből. |
A kliens
így küldhet adatokat az API-nak. |
3. |
if
(!$data) {...} |
Ellenőrzi,
hogy van-e adat. |
Hibaüzenetet
küld, ha nincs megfelelő bemenet. |
4. |
$query =
"INSERT INTO apartments ..."; |
SQL
beszúró lekérdezés előkészítése. |
Biztosítja,
hogy az adatokat helyesen illeszti be. |
5. |
$stmt =
$dbconn->prepare($query); |
Lekérdezés
előkészítése. |
SQL
injection elleni védelem. |
6. |
$stmt->bind_param(...); |
Paraméterek
hozzárendelése. |
Megakadályozza
a hibás adatokat és támadásokat. |
7. |
if
($stmt->execute()) {...} |
SQL
végrehajtása. |
Ha
sikeres, visszaadja az új rekord ID-ját. |
updateApartment($id, $dbconn)
Ez a
függvény egy létező lakás adatainak frissítését végzi el az apartments
táblában. A kliens JSON formátumban küldi az új adatokat, és a függvény
ezeket SQL UPDATE paranccsal módosítja.
1. Függvény deklarálása
function updateApartment($id,
$dbconn) {
- Mit csinál?
- Létrehoz egy updateApartment
nevű függvényt.
- Bemeneti paraméterek:
- $id: A frissítendő lakás
azonosítója.
- $dbconn: A MySQL adatbázis
kapcsolat.
2. Kliens által küldött adatok beolvasása
$data =
json_decode(file_get_contents('php://input'), true);
- Mit csinál?
- file_get_contents('php://input'):
Beolvassa a PUT kérés törzsét, amely JSON formátumban tartalmazza
a frissítendő adatokat.
- json_decode(..., true):
Átalakítja a JSON-t asszociatív tömbbé.
- Példa bejövő JSON adatra (amit
a kliens küldhet):
{
"address": "Kossuth Lajos utca 15.",
"city": "Budapest",
"postal_code": "1053",
"size": 90,
"rooms": 4,
"price": 78000000,
"owner_name": "Kovács Péter",
"owner_phone": "+36201234567",
"description": "Felújított lakás a belvárosban",
"image_url": "https://example.com/lakas2.jpg"
}
3. Ellenőrzi, hogy van-e bejövő adat
if (!$data) {
http_response_code(400);
echo json_encode(['status' => 'error', 'message' => 'Hiányos
adatok.']);
return;
}
- Mit csinál?
- Ha $data értéke null vagy
false, akkor azt jelenti, hogy a JSON nem volt megfelelő.
- 400 Bad Request hibakódot küld vissza és egy hibaüzenetet
ad a kliensnek.
- Példa hibás válaszra:
{
"status": "error",
"message": "Hiányos adatok."
}
4. SQL lekérdezés előkészítése
$query = "UPDATE apartments SET
address = ?, city = ?, postal_code = ?, size = ?, rooms = ?, price = ?,
owner_name = ?, owner_phone = ?, description = ?, image_url = ? WHERE id =
?";
- Mit csinál?
- Az SQL UPDATE lekérdezést paraméterezett
módon hozza létre, hogy frissítsen egy lakást az id alapján.
- A ? helyettesítők
(placeholders) biztosítják, hogy az adatok biztonságosan legyenek
kezelve.
5. Lekérdezés előkészítése
$stmt = $dbconn->prepare($query);
- Mit csinál?
- Előkészíti az SQL lekérdezést
($stmt), hogy paraméterezett lekérdezést tudjunk végrehajtani.
- Miért fontos?
- SQL injection elleni védelem: megakadályozza, hogy
rosszindulatú SQL kódokat adjanak meg az adatok között.
- Gyorsabb végrehajtás: az SQL szerver
optimalizálni tudja az előkészített lekérdezéseket.
6. Paraméterek hozzárendelése és adatok frissítése
$stmt->bind_param('sssiiissssi',
$data['address'], $data['city'], $data['postal_code'], $data['size'],
$data['rooms'],
$data['price'], $data['owner_name'], $data['owner_phone'],
$data['description'], $data['image_url'], $id);
- Mit csinál?
- Hozzárendeli az adatokat a megfelelő paraméterekhez.
- Mit jelentenek az
'sssiiissssi' betűk?
- s (string) → address,
city, postal_code, owner_name, owner_phone, description, image_url
- i (integer) → size,
rooms, price, id
- Miért fontos?
- Biztosítja, hogy az adatokat helyes
típusban adjuk át az adatbázisnak.
- Elősegíti a hatékonyabb SQL
végrehajtást.
7. SQL parancs végrehajtása
if ($stmt->execute()) {
- Mit csinál?
- Ha az SQL parancs sikeresen
lefut, akkor folytatja a sikeres válaszküldést.
- Ha hiba történik, akkor
a false értéket kapja vissza.
8. Sikeres adatfrissítés esetén válaszküldés
http_response_code(200);
echo json_encode(['status' =>
'success', 'message' => 'Lakás sikeresen frissítve.']);
- Mit csinál?
- 200 OK státuszkódot állít be → ez szabványos
válaszkód a módosított rekordok esetén.
- JSON válaszként visszaküldi a sikeres
üzenetet.
- Példa sikeres válaszra:
{
"status": "success",
"message": "Lakás sikeresen frissítve."
}
9. Hiba esetén válaszküldés
} else {
http_response_code(500);
echo json_encode(['status' => 'error', 'message' => 'Hiba a
frissítés során.']);
}
- Mit csinál?
- Ha az execute() nem sikerült
(pl. adatbázis hiba miatt), akkor 500 Internal Server Error
státuszkódot állít be.
- JSON válaszként visszaküldi a hibaüzenetet.
- Példa sikertelen válaszra:
{
"status": "error",
"message": "Hiba a frissítés során."
}
Sor |
Kód |
Mit csinál? |
Miért fontos? |
1. |
function
updateApartment($id, $dbconn) { |
Függvény
létrehozása. |
Az API
ezen keresztül hívható. |
2. |
$data =
json_decode(file_get_contents('php://input'), true); |
JSON
adatok beolvasása a kérésből. |
A kliens
így küldhet adatokat az API-nak. |
3. |
if
(!$data) {...} |
Ellenőrzi,
hogy van-e adat. |
Hibaüzenetet
küld, ha nincs megfelelő bemenet. |
4. |
$query =
"UPDATE apartments SET ... WHERE id = ?"; |
SQL
frissítő lekérdezés előkészítése. |
Biztosítja,
hogy az adatokat helyesen módosítja. |
5. |
$stmt =
$dbconn->prepare($query); |
Lekérdezés
előkészítése. |
SQL
injection elleni védelem. |
6. |
$stmt->bind_param(...); |
Paraméterek
hozzárendelése. |
Megakadályozza
a hibás adatokat és támadásokat. |
7. |
if
($stmt->execute()) {...} |
SQL
végrehajtása. |
Ha
sikeres, visszaad egy sikerüzenetet. |
deleteApartment($id,
$dbconn)
Ez a függvény egy lakás törlését végzi az apartments
táblából az id
alapján. A törlést SQL DELETE
paranccsal
hajtja végre, és megfelelő HTTP státuszkódokkal ad visszajelzést.
1. Függvény
deklarálása
function
deleteApartment(
$id,
$dbconn) {
- Mit csinál?
- Létrehoz egy
deleteApartment
nevű függvényt. - Bemeneti paraméterek:
$id
: A törlendő lakás azonosítója.$dbconn
: A MySQL adatbázis kapcsolat.
2. SQL lekérdezés
előkészítése
$query =
"DELETE FROM apartments WHERE id = ?";
- Mit csinál?
- Az SQL
DELETE
lekérdezést paraméterezett módon hozza létre. - Az
id
alapján keresi a törlendő lakást. - A
?
helyettesítő (placeholder
) biztosítja, hogy az adat biztonságosan legyen kezelve.
3. Lekérdezés
előkészítése
$stmt =
$dbconn->
prepare(
$query);
- Mit csinál?
- Előkészíti
az SQL lekérdezést (
$stmt
), hogy paraméterezett lekérdezést tudjunk végrehajtani. - Miért fontos?
- SQL injection elleni védelem:
megakadályozza, hogy rosszindulatú SQL kódokat adjanak meg az adatok
között.
- Gyorsabb végrehajtás: az SQL
szerver optimalizálni tudja az előkészített lekérdezéseket.
4. Paraméterek
hozzárendelése
$stmt->
bind_param(
'i',
$id);
- Mit csinál?
- Az
id
értékét hozzárendeli a lekérdezés?
helyettesítőjéhez. 'i'
azt jelenti, hogy azid
egész szám (integer
) típusú érték.- Miért fontos?
- Biztosítja,
hogy az
id
mindig szám legyen. - Elősegíti a hatékonyabb
SQL végrehajtást.
5. SQL parancs
végrehajtása és sikeres törlés ellenőrzése
if (
$stmt->
execute()) {
- Mit csinál?
- Ha az SQL
parancs sikeresen lefut, akkor folytatja a sikeres
válaszküldést.
- Ha hiba
történik, akkor a
false
értéket kapja vissza.
6. Sikeres törlés
esetén válaszküldés
http_response_code(
204);
echo
json_encode([
'status' =>
'success',
'message' =>
'Lakás sikeresen törölve lett.']);
·
Mit csinál?
- 204 No Content
státuszkódot állít be → ez szabványos válaszkód a törlési műveletekhez.
- JSON
válaszként visszaküldi a sikeres üzenetet.
·
Példa sikeres válaszra:
{
"status":
"success",
"message":
"Lakás sikeresen törölve lett."
}
7. Hiba esetén
válaszküldés
}
else {
http_response_code(
500);
echo
json_encode([
'status' =>
'error',
'message' =>
'Hiba a törlés során.']);
}
·
Mit csinál?
- Ha az
execute()
nem sikerült (pl. adatbázis hiba miatt), akkor 500 Internal Server Error státuszkódot állít be. - JSON
válaszként visszaküldi a hibaüzenetet.
·
Példa sikertelen válaszra:
{
"status":
"error",
"message":
"Hiba a törlés során."
}
8.
Adatbáziskapcsolat lezárása
mysqli_close(
$dbconn);
- Mit csinál?
- Lezárja az adatbáziskapcsolatot.
- Ez segít a
szerver erőforrásainak hatékonyabb kezelésében.
- Megjegyzés:
- Ha a
deleteApartment()
függvényt egy másik PHP fájlban használjuk, és ott több SQL művelet is történik, akkor nem mindig szükséges itt lezárni a kapcsolatot.
Sor |
Kód |
Mit csinál? |
Miért fontos? |
1. |
|
Függvény
létrehozása. |
Az
API ezen keresztül hívható. |
2. |
|
SQL
törlő lekérdezés előkészítése. |
Biztosítja,
hogy az adatokat helyesen módosítja. |
3. |
|
Lekérdezés
előkészítése. |
SQL
injection elleni védelem. |
4. |
|
Paraméter
hozzárendelése. |
Megakadályozza
a hibás adatokat és támadásokat. |
5. |
|
SQL
végrehajtása. |
Ha
sikeres, visszaad egy sikerüzenetet. |
6. |
|
Ha
sikeres a törlés, |
A
REST API konvenciók betartása. |
7. |
|
Hiba
esetén |
Hibakezelés
a kliensek számára. |
8. |
|
Adatbáziskapcsolat
lezárása. |
Erőforrások
megfelelő kezelése. |
Lehetséges
továbbfejlesztések
1. Ellenőrzés,
hogy az id
létezik-e a törlés előtt
- Ha az
id
nem található az adatbázisban, akkor404 Not Found
státuszkódot kellene visszaadni.
$checkQuery =
"SELECT id FROM apartments WHERE id = ?";
$checkStmt =
$dbconn->
prepare(
$checkQuery);
$checkStmt->
bind_param(
'i',
$id);
$checkStmt->
execute();
$result =
$checkStmt->
get_result();
if (
$result->num_rows ===
0) {
http_response_code(
404);
echo
json_encode([
'status' =>
'error',
'message' =>
'A megadott lakás nem található.']);
return;
}
2. Soft
delete implementálása
- Ahelyett,
hogy véglegesen törölnénk az adatokat, inkább jelölhetjük őket töröltként
(
is_deleted = 1
), így később visszaállíthatók:
$query =
"UPDATE apartments SET is_deleted = 1 WHERE id = ?";
3. Hibakódok
pontosítása
- Ha az
adatbázis kapcsolat hibás, 502 Bad Gateway jobb
választás lehet az
500
helyett.
Nincsenek megjegyzések:
Megjegyzés küldése