Zentrale DB-Verbindung und Helfer fuer Prepared Statements
- incs/db.php: db_verbinden() setzt utf8mb4, strikten sql_mode und schaltet die mysqli-Exceptions von PHP 8.1+ ab, damit die bestehenden "or error(mysqli_error())"-Pruefungen weiter greifen. - db_abfrage/db_zeilen/db_zeile/db_wert mit ?-Platzhaltern (mysqli_execute_query, PHP 8.2). - Alle neun kopierten mysqli_connect/select_db-Stellen nutzen jetzt db_verbinden(). Nur zusammen mit der auf utf8mb4 migrierten Datenbank einsetzbar. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+79
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
/*
|
||||
* Datenbankzugriff: Verbindungsaufbau und Prepared Statements.
|
||||
*
|
||||
* Neue und umgebaute Abfragen laufen über db_abfrage() und Co. Werte stehen
|
||||
* im SQL nur als ? und kommen getrennt als Array - sie werden nie in den
|
||||
* SQL-String eingesetzt, Escaping entfällt. Tabellen- und Spaltennamen
|
||||
* (z.B. für ORDER BY) lassen sich nicht binden und müssen gegen eine feste
|
||||
* Liste erlaubter Werte geprüft werden.
|
||||
*
|
||||
* Fehler verhalten sich wie bei mysqli_query(): Rückgabe false, Details über
|
||||
* mysqli_error($dbconn). Das bestehende Muster
|
||||
* db_abfrage(...) or $err = error(...mysqli_error($dbconn));
|
||||
* funktioniert also unverändert.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Baut die Verbindung auf und stellt sie einheitlich ein. Gibt die
|
||||
* Verbindung zurück oder false; der Grund steht dann in
|
||||
* mysqli_connect_error().
|
||||
*/
|
||||
function db_verbinden($server, $user, $pw, $db)
|
||||
{
|
||||
// Seit PHP 8.1 wirft mysqli standardmäßig Exceptions. Der Code prüft
|
||||
// Rückgabewerte, also das alte Verhalten wiederherstellen.
|
||||
mysqli_report(MYSQLI_REPORT_OFF);
|
||||
|
||||
$dbconn = @mysqli_connect($server, $user, $pw, $db);
|
||||
if(!$dbconn)
|
||||
return false;
|
||||
|
||||
// Ohne das behandelt der Server die Verbindung je nach Einstellung als
|
||||
// latin1, und UTF-8 aus dem Browser wird doppelt kodiert gespeichert.
|
||||
mysqli_set_charset($dbconn, "utf8mb4");
|
||||
|
||||
// Unabhängig von der Server-Konfiguration immer strikt: ungültige Werte
|
||||
// und fehlende Pflichtfelder sind Fehler, statt still zu '' oder 0 zu
|
||||
// werden.
|
||||
mysqli_query($dbconn, "SET SESSION sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
|
||||
|
||||
return $dbconn;
|
||||
}
|
||||
|
||||
/*
|
||||
* Führt eine Abfrage mit ?-Platzhaltern aus. Gibt bei SELECT ein
|
||||
* mysqli_result zurück, sonst true, bei Fehlern false.
|
||||
*/
|
||||
function db_abfrage($dbconn, $sql, $params = array())
|
||||
{
|
||||
return mysqli_execute_query($dbconn, $sql, array_values($params));
|
||||
}
|
||||
|
||||
/* Alle Zeilen als Liste assoziativer Arrays, bei Fehlern false. */
|
||||
function db_zeilen($dbconn, $sql, $params = array())
|
||||
{
|
||||
$res = db_abfrage($dbconn, $sql, $params);
|
||||
if(!$res)
|
||||
return false;
|
||||
return mysqli_fetch_all($res, MYSQLI_ASSOC);
|
||||
}
|
||||
|
||||
/* Erste Zeile als assoziatives Array, null ohne Treffer, bei Fehlern false. */
|
||||
function db_zeile($dbconn, $sql, $params = array())
|
||||
{
|
||||
$res = db_abfrage($dbconn, $sql, $params);
|
||||
if(!$res)
|
||||
return false;
|
||||
return mysqli_fetch_assoc($res);
|
||||
}
|
||||
|
||||
/* Erste Spalte der ersten Zeile, null ohne Treffer, bei Fehlern false. */
|
||||
function db_wert($dbconn, $sql, $params = array())
|
||||
{
|
||||
$res = db_abfrage($dbconn, $sql, $params);
|
||||
if(!$res)
|
||||
return false;
|
||||
$zeile = mysqli_fetch_row($res);
|
||||
return $zeile === null ? null : $zeile[0];
|
||||
}
|
||||
Reference in New Issue
Block a user