15) { $limit = 15; } /** * Mindestlänge für die Suche. * Wenn der Suchbegriff leer ist oder aus weniger als 1 Zeichen besteht, * wird ein leeres JSON-Array zurückgegeben und die Ausführung beendet. */ if (mb_strlen($q, 'UTF-8') < 1) { echo json_encode(['items' => []], JSON_UNESCAPED_UNICODE); exit; } /** * @var string $like Der escapte Such-String für das LIKE-Statement in SQL. * Spezielle Wildcard-Zeichen (%) und (_) werden escapt, um SQL-Fehler * oder unerwartetes Verhalten bei Benutzereingaben zu verhindern. */ $like = addcslashes($q, "%_\\"); $like = '%' . $like . '%'; /** * @var string $sql Die SQL-Abfrage zur Suche nach Produkten. * Durchsucht die Spalten `model` und `description`. * Sortiert Treffer im `model` vor Treffern in der `description`. */ $sql = " SELECT p.productID, p.model, p.description, p.imagePath FROM products p WHERE (p.model LIKE ? OR p.description LIKE ?) ORDER BY CASE WHEN p.model LIKE ? THEN 0 ELSE 1 END, p.model ASC LIMIT ? "; /** * @var mysqli_stmt|PDOStatement $stmt Das vorbereitete SQL-Statement. */ $stmt = $conn->prepare($sql); // Überprüfen, ob das Statement erfolgreich vorbereitet wurde if (!$stmt) { // HTTP-Statuscode 500 für einen internen Serverfehler setzen http_response_code(500); echo json_encode(['error' => 'DB-Query konnte nicht vorbereitet werden.'], JSON_UNESCAPED_UNICODE); exit; } /** * Binden der Parameter an das vorbereitete Statement. * 'sssi' bedeutet: String, String, String, Integer. */ $stmt->bind_param('sssi', $like, $like, $like, $limit); // Ausführen der vorbereiteten Abfrage $stmt->execute(); // Holen des Ergebnisses aus der Datenbank $res = $stmt->get_result(); /** * @var array $items Das Array zur Speicherung der aufbereiteten Suchergebnisse. */ $items = []; // Durchlaufen der einzelnen Datensätze / Zeilen while ($row = $res->fetch_assoc()) { /** * @var int $id Die Produkt-ID iterierten Produkts. */ $id = (int)($row['productID'] ?? 0); // Überspringe ungültige oder defekte IDs if ($id <= 0) { continue; } // Hinzufügen des formatierten Produkts in das Result-Array $items[] = [ 'id' => $id, 'model' => (string)($row['model'] ?? ''), 'description' => (string)($row['description'] ?? ''), 'imagePath' => (string)($row['imagePath'] ?? ''), 'url' => 'productpage.php?id=' . $id, ]; } /** * Rückgabe des Arrays als JSON-kodierter String. * JSON_UNESCAPED_UNICODE verhindert, dass Umlaute escapet werden (z.B. %u00e4). */ echo json_encode(['items' => $items], JSON_UNESCAPED_UNICODE); } catch (Throwable $e) { /** * Fehlerbehandlung im Falle einer Exception (z.B. bei einem Datenbankfehler). * Sendet einen 500er Statuscode und eine generische Fehlermeldung als JSON. */ http_response_code(500); echo json_encode(['error' => 'Serverfehler'], JSON_UNESCAPED_UNICODE); }