Lektion 05 - Daten API
Daten aus MariaDB lesen und als JSON ausgeben
Jetzt wird PHP praktisch: Die API verbindet sich mit einer lokalen MariaDB/MySQL- Datenbank, liest Daten aus und gibt sie als JSON zurueck. Dabei achten wir auf eine sichere Struktur.
1. Projektstruktur
htdocs/
php-api/
config.php
api.php
users.php
courses.php
config.php enthaelt Zugangsdaten. api.php enthaelt die
API-Logik. Kleine Projekte duerfen einfach starten, aber Struktur hilft sofort.
2. Konfiguration auslagern
<?php
// config.php
$servername = 'localhost';
$username = 'root';
$password = '';
$dbname = 'coding_learning';
?>
Zugangsdaten werden ausgelagert, damit die API-Datei nicht mit Konfiguration ueberladen wird.
3. Verbindung mit mysqli
<?php
require_once 'config.php';
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
http_response_code(500);
echo json_encode([
'success' => false,
'message' => 'Datenbankverbindung fehlgeschlagen',
]);
exit;
}
$conn->set_charset('utf8mb4');
?>
set_charset('utf8mb4') sorgt fuer saubere Umlaute. Bei Fehlern gibt
die API eine JSON-Fehlerantwort zurueck.
4. Einfache Abfrage und JSON-Ausgabe
<?php
header('Content-Type: application/json; charset=utf-8');
require_once 'config.php';
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset('utf8mb4');
$result = $conn->query('SELECT id, name, email, points FROM users');
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
echo json_encode([
'success' => true,
'data' => $data,
]);
$conn->close();
?>
5. Wichtig: Tabellennamen nicht direkt aus GET in SQL setzen
Wenn jemand api.php?tabelle=users aufruft, wirkt es verlockend, den
Tabellennamen direkt in SQL einzubauen. Das ist gefaehrlich. Prepared Statements
koennen Werte absichern, aber Tabellennamen nicht normal als Platzhalter binden.
Deshalb nutzt man fuer Tabellennamen eine Whitelist.
Gefaehrlich:
$table = $_GET['tabelle'];
$sql = "SELECT * FROM $table";
Besser:
Pruefe, ob $table in einer Liste erlaubter Tabellen steht.
6. Sichere Tabellen-Auswahl mit Whitelist
<?php
$allowedTables = [
'users' => 'users',
'courses' => 'courses',
'lessons' => 'lessons',
];
$requestedTable = $_GET['table'] ?? 'users';
if (!array_key_exists($requestedTable, $allowedTables)) {
http_response_code(400);
echo json_encode([
'success' => false,
'message' => 'Tabelle ist nicht erlaubt',
]);
exit;
}
$table = $allowedTables[$requestedTable];
$sql = "SELECT * FROM $table";
?>
Die URL entscheidet nicht frei ueber SQL. Sie darf nur einen erlaubten Namen aus deiner Liste auswaehlen.
7. Filter mit Prepared Statement
Werte wie IDs, Namen oder Mindestpunkte werden mit Prepared Statements gebunden.
<?php
$minPoints = (int) ($_GET['min_points'] ?? 0);
$stmt = $conn->prepare(
'SELECT id, name, email, points FROM users WHERE points >= ?'
);
$stmt->bind_param('i', $minPoints);
$stmt->execute();
$result = $stmt->get_result();
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
echo json_encode([
'success' => true,
'data' => $data,
]);
?>
'i' bedeutet Integer. Fuer Strings nutzt man 's'.
8. Kompletter Mini-Endpunkt
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
header('Content-Type: application/json; charset=utf-8');
require_once 'config.php';
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'DB Fehler']);
exit;
}
$conn->set_charset('utf8mb4');
$allowedTables = [
'users' => 'users',
'courses' => 'courses',
];
$requestedTable = $_GET['table'] ?? 'users';
if (!array_key_exists($requestedTable, $allowedTables)) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Tabelle nicht erlaubt']);
exit;
}
$table = $allowedTables[$requestedTable];
$result = $conn->query("SELECT * FROM $table");
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
echo json_encode(['success' => true, 'data' => $data]);
$conn->close();
?>
9. Uebungen
- Erstelle eine Datenbank
coding_learningin phpMyAdmin. - Erstelle Tabellen
users,courses,lessons. - Erstelle
config.phpmit Verbindungsdaten. - Baue eine API, die alle User als JSON ausgibt.
- Ergaenze
?table=coursesmit Whitelist. - Ergaenze
?min_points=50fuer User-Filter. - Gib bei Fehlern immer JSON mit
success: falseaus.