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:
@@ -84,6 +84,8 @@ Eine Schemaänderung besteht also aus: neuer Eintrag **vorn** in `update/version
|
|||||||
|
|
||||||
## Datenbankzugriff
|
## Datenbankzugriff
|
||||||
|
|
||||||
|
**Umbau läuft (Branch `db-umbau`):** Verbindungen entstehen nur noch über `db_verbinden()` aus `incs/db.php`. Die Funktion setzt `utf8mb4`, den strikten `sql_mode` und schaltet die mysqli-Exceptions ab. Neue und umgebaute Abfragen nutzen `db_abfrage()`, `db_zeilen()`, `db_zeile()` und `db_wert()` mit `?`-Platzhaltern statt String-Verkettung. Ziel-Schema ist das der Instanz `kunden` in `utf8mb4`; die Altdaten sind teils doppelt kodiert und werden per Migration repariert. Dieser Stand darf nur zusammen mit der migrierten Datenbank live gehen.
|
||||||
|
|
||||||
Prozedurales `mysqli`. `$dbconn` wird zusätzlich in `$_SESSION["dbconn"]` abgelegt, damit `incs/mysql_ecape_wrapper.php` eine globale Funktion `mysql_escape_string()` als Shim über diese Verbindung bereitstellen kann — ein Überbleibsel der `mysql_*`-Ära, das in altem Code noch aufgerufen wird.
|
Prozedurales `mysqli`. `$dbconn` wird zusätzlich in `$_SESSION["dbconn"]` abgelegt, damit `incs/mysql_ecape_wrapper.php` eine globale Funktion `mysql_escape_string()` als Shim über diese Verbindung bereitstellen kann — ein Überbleibsel der `mysql_*`-Ära, das in altem Code noch aufgerufen wird.
|
||||||
|
|
||||||
SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über `mysqli_real_escape_string($dbconn, …)` und muss bei jeder Änderung mitgedacht werden.
|
SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über `mysqli_real_escape_string($dbconn, …)` und muss bei jeder Änderung mitgedacht werden.
|
||||||
|
|||||||
+2
-4
@@ -11,10 +11,8 @@ if($settings != "valid")
|
|||||||
|
|
||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw))
|
if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
|
||||||
$err = error("Verbindung zur Datenbank fehlgeschlagen!!");
|
$err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
|
||||||
if(!@mysqli_select_db($dbconn,$mysql_db))
|
|
||||||
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
|
|
||||||
}
|
}
|
||||||
if($_SESSION["login"] == "valid" && isset($_GET["id"])){
|
if($_SESSION["login"] == "valid" && isset($_GET["id"])){
|
||||||
if(!mysqli_query($dbconn,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){
|
if(!mysqli_query($dbconn,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ $settings=readsettings();
|
|||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
|
|
||||||
$dbconn = mysqli_connect($mysql_server, $mysql_user, $mysql_pw);
|
$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db);
|
||||||
mysqli_select_db($dbconn,$mysql_db);
|
if(!$dbconn)
|
||||||
|
$err = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$err = 1;
|
$err = 1;
|
||||||
|
|||||||
+2
-4
@@ -50,10 +50,8 @@ try {
|
|||||||
|
|
||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw))
|
if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
|
||||||
$err = error("Verbindung zur Datenbank fehlgeschlagen!!");
|
$err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
|
||||||
if(!@mysqli_select_db($dbconn,$mysql_db))
|
|
||||||
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
|
|
||||||
}
|
}
|
||||||
// read get argument and post body
|
// read get argument and post body
|
||||||
$fn = filter_input(INPUT_GET, 'fn');
|
$fn = filter_input(INPUT_GET, 'fn');
|
||||||
|
|||||||
+3
-2
@@ -7,8 +7,9 @@ $settings=readsettings();
|
|||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
|
|
||||||
$dbconn = mysqli_connect($mysql_server, $mysql_user, $mysql_pw);
|
$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db);
|
||||||
mysqli_select_db($dbconn,$mysql_db);
|
if(!$dbconn)
|
||||||
|
$err = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$err = 1;
|
$err = 1;
|
||||||
|
|||||||
+2
-4
@@ -8,10 +8,8 @@ if($settings != "valid")
|
|||||||
|
|
||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
if(!$mysql = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw))
|
if(!$mysql = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
|
||||||
$err = error("Verbindung zur Datenbank fehlgeschlagen!!");
|
$err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
|
||||||
if(!@mysqli_select_db($mysql,$mysql_db))
|
|
||||||
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$_SESSION["local"] =false;
|
$_SESSION["local"] =false;
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ $settings=readsettings();
|
|||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
|
|
||||||
$dbconn = mysqli_connect($mysql_server, $mysql_user, $mysql_pw);
|
$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db);
|
||||||
mysqli_select_db($dbconn,$mysql_db);
|
if(!$dbconn)
|
||||||
|
$err = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$err = 1;
|
$err = 1;
|
||||||
|
|||||||
+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];
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
include_once("constants.php");
|
include_once("constants.php");
|
||||||
|
require_once(__DIR__."/db.php");
|
||||||
function readsettings()
|
function readsettings()
|
||||||
{
|
{
|
||||||
if(is_file(CONFIG_PATH.CONFIG_FILE))
|
if(is_file(CONFIG_PATH.CONFIG_FILE))
|
||||||
|
|||||||
@@ -56,10 +56,8 @@ else if($action == "setup")
|
|||||||
|
|
||||||
if($settings == "valid" && $action != "setup")
|
if($settings == "valid" && $action != "setup")
|
||||||
{
|
{
|
||||||
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw))
|
if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
|
||||||
$err = error("Verbindung zur Datenbank fehlgeschlagen!!");
|
$err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
|
||||||
if(!@mysqli_select_db($dbconn,$mysql_db))
|
|
||||||
$err = error("Datenbank nicht gefunden!! ($mysql_db)");
|
|
||||||
$newversion = checknewversion($version);
|
$newversion = checknewversion($version);
|
||||||
$status = manageupdate($version, $newversion);
|
$status = manageupdate($version, $newversion);
|
||||||
$version = $status[1];
|
$version = $status[1];
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
// Zugang zur Statistik-Datenbank steht in der externen Config
|
// Zugang zur Statistik-Datenbank steht in der externen Config
|
||||||
require_once("incs/settings.php");
|
require_once("incs/settings.php");
|
||||||
readsettings();
|
readsettings();
|
||||||
$dbconn = mysqli_connect($stats_mysql_server, $stats_mysql_user, $stats_mysql_pw) or die("Keine Verbindung zur Statistik-Datenbank.");
|
$dbconn = db_verbinden($stats_mysql_server, $stats_mysql_user, $stats_mysql_pw, $stats_mysql_db) or die("Keine Verbindung zur Statistik-Datenbank.");
|
||||||
mysqli_select_db($dbconn, $stats_mysql_db);
|
|
||||||
|
|
||||||
$qry = mysqli_query($dbconn, "SELECT DATE_FORMAT(datetime, '%d.%m.%y') AS datetime, MAX(percent) AS value FROM hdd WHERE datetime > DATE_SUB(NOW(), INTERVAL 31 DAY) GROUP BY DATE_FORMAT(datetime, '%d.%m.%y') ORDER BY DATE_FORMAT(datetime, '%y%m%d') ASC") or die(mysqli_error($dbconn));
|
$qry = mysqli_query($dbconn, "SELECT DATE_FORMAT(datetime, '%d.%m.%y') AS datetime, MAX(percent) AS value FROM hdd WHERE datetime > DATE_SUB(NOW(), INTERVAL 31 DAY) GROUP BY DATE_FORMAT(datetime, '%d.%m.%y') ORDER BY DATE_FORMAT(datetime, '%y%m%d') ASC") or die(mysqli_error($dbconn));
|
||||||
// Dataset definition
|
// Dataset definition
|
||||||
|
|||||||
@@ -69,10 +69,8 @@ else
|
|||||||
$settings=readsettings();
|
$settings=readsettings();
|
||||||
if($settings == "valid")
|
if($settings == "valid")
|
||||||
{
|
{
|
||||||
if(!$dbconn = @mysqli_connect($mysql_server, $mysql_user, $mysql_pw))
|
if(!$dbconn = db_verbinden($mysql_server, $mysql_user, $mysql_pw, $mysql_db))
|
||||||
$err = error("Verbindung zur Datenbank fehlgeschlagen!!");
|
$err = error("Verbindung zur Datenbank fehlgeschlagen: ".htmlspecialchars(mysqli_connect_error()));
|
||||||
if(!@mysqli_select_db($dbconn,$mysql_db))
|
|
||||||
$err = error("Datenbank nicht gefunden!!");
|
|
||||||
|
|
||||||
|
|
||||||
if(!$err)
|
if(!$err)
|
||||||
|
|||||||
Reference in New Issue
Block a user