Fix some database stuff (WIP, broken)

This commit is contained in:
Florian Pesth 2023-12-30 20:09:06 +01:00
parent 897d745bc6
commit e3e5b27b98
4 changed files with 100 additions and 20 deletions

View File

@ -5,18 +5,17 @@ require_once 'konfiguration.php';
class DB {
private static $instance = null;
private $pdo = null;
private $stmts = array();
private static $pdo = null;
private static $stmts = array();
private function __construct()
{
$datasourcename = "mysql:host=" . MYSQL_HOST . ";dbname=". MYSQL_DATENBANK . ";charset=utf8mb4";
self::$pdo = new PDO(
$datasourcename,
MYSQL_DSN,
MYSQL_BENUTZER,
MYSQL_KENNWORT
MYSQL_KENNWORT,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)
);
self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
public static function getInstance()
@ -46,7 +45,14 @@ class DB {
{
return self::$stmts[$method . "::" . $variant]->fetchAll();
}
public function pdoErrorCode()
{
return self::$pdo->errorCode();
}
public function pdoErrorInfo()
{
return self::$pdo->errorInfo();
}
public function errorCode($method, $variant = '')
{
return self::$stmts[$method . "::" . $variant]->errorCode();
@ -59,7 +65,7 @@ class DB {
public function onErrorDie($method, $variant = '')
{
if (self::errorCode($method, $variant) != 1) {
if (!is_null(self::errorCode($method, $variant)) && self::errorCode($method, $variant) != '1') {
echo $method . "::" . $variant . " ungueltige Abfrage<br>\n";
echo "sql:" . $stmts[$method . "::" . $variant]->queryString . "<br>\n";
die('Ungueltige Abfrage: ' . self::errorInfo($method, $variant)[2]);

View File

@ -14,14 +14,76 @@ $wizard->addCode('enterlogindata',function($storedvariables){
$logindata['user'] = $_POST['user'];
$logindata['password'] = $_POST['password'];
$logindata['dbname'] = $_POST['dbname'];
return $logindata;
});
$wizard->addCode('createdatabase',function($storedvariables){
$conf_file = fopen("../etc/konfiguration.php", "w");
fwrite($conf_file, "<?php\n");
fwrite($conf_file, "define( 'MYSQL_HOST', '".$logindata['host']."' );\n");
fwrite($conf_file, "define( 'MYSQL_BENUTZER', '".$logindata['user']."' );\n");
fwrite($conf_file, "define( 'MYSQL_KENNWORT', '".$logindata['password']."' );\n");
fwrite($conf_file, "define( 'MYSQL_DATENBANK', '".$logindata['dbname']."' );\n");
if($storedvariables['selectdatabase']['databasetype'] == 'SQLite'){
fwrite($conf_file, "define( 'MYSQL_DSN', 'sqlite:". realpath("../etc") . "/helferdb.sql' );\n");
fwrite($conf_file, "define( 'MYSQL_BENUTZER', '' );\n");
fwrite($conf_file, "define( 'MYSQL_KENNWORT', '' );\n");
fwrite($conf_file, "define( 'MYSQL_DATENBANK', '' );\n");
} elseif ($storedvariables['selectdatabase']['databasetype'] == 'MariaDB'){
fwrite($conf_file, "define( 'MYSQL_DSN', 'mysql:host=" . $storedvariables['enterlogindata']['host'] . ";dbname=". $storedvariables['enterlogindata']['dbname'] . ";charset=utf8mb4' );\n");
fwrite($conf_file, "define( 'MYSQL_HOST', '".$storedvariables['enterlogindata']['host']."' );\n");
fwrite($conf_file, "define( 'MYSQL_BENUTZER', '".$storedvariables['enterlogindata']['user']."' );\n");
fwrite($conf_file, "define( 'MYSQL_KENNWORT', '".$storedvariables['enterlogindata']['password']."' );\n");
fwrite($conf_file, "define( 'MYSQL_DATENBANK', '".$storedvariables['enterlogindata']['dbname']."' );\n");
}
fwrite($conf_file, "?>");
return $logindata;
// Test configuration:
require_once("SQL.php");
try{
$db = DB::getInstance();
}
catch( PDOException $exception ) {
echo "<p>Fehler beim Verbindungsversuch mit der Datenbank: \"".$exception->getMessage( )."\"</p>";
}
if(!is_null($db->pdoErrorCode()) && $db->pdoErrorCode() != '1'){
echo "<p>Fehler ".$db->pdoErrorCode()." beim Verbindungsversuch mit der Datenbank: \"".$db->pdoErrorInfo()[2]."\"</p>";
$_POST['step'] = 'createdatabase';
} else {
echo "<p>Successfully connected to database!</p>";
}
});
$wizard->addCode('createdatabasetables',function($storedvariables){
require_once("SQL.php");
try{
$db = DB::getInstance();
}
catch( PDOException $exception ) {
echo "<p>Fehler beim Verbindungsversuch mit der Datenbank: \"".$exception->getMessage( )."\"</p>";
}
if(!is_null($db->pdoErrorCode()) && $db->pdoErrorCode() != '1'){
echo "<p>Fehler ".$db->pdoErrorCode()." beim Verbindungsversuch mit der Datenbank: \"".$db->pdoErrorInfo()[2]."\"</p>";
$_POST['step'] = 'createdatabase';
} else {
echo "<p>Successfully connected to database!</p>";
}
$sql = file_get_contents("../etc/helferdb_schema_test.sql");
$db->prepare(__METHOD__,$sql);
if(!is_null($db->errorCode(__METHOD__)) && $db->errorCode(__METHOD__) != '1'){
echo "<pre>";
var_dump(__METHOD__);
var_dump($db->errorCode(__METHOD__));
var_dump($db->errorInfo(__METHOD__));
echo "</pre>";
echo "<p>Fehler: \"".$db->errorInfo(__METHOD__)[2]."\"</p>";
$_POST['step'] = 'createdatabasetables';
}
$db->execute(__METHOD__);
if(!is_null($db->errorCode(__METHOD__)) && $db->errorCode(__METHOD__) != '1'){
echo "<pre>";
var_dump(__METHOD__);
var_dump($db->errorCode(__METHOD__));
var_dump($db->errorInfo(__METHOD__));
echo "</pre>";
echo "<p>Fehler: \"".$db->errorInfo(__METHOD__)[2]."\"</p>";
$_POST['step'] = 'createdatabasetables';
}
});
$wizard->renderPHP();

View File

@ -1,7 +1,7 @@
<?php
// datenbank-defines extern
require_once '../etc/helferdb_konfiguration.php';
require_once('../etc/konfiguration.php');
// die folgenden Zeilen ohne Kommentarzeichen nach ../etc/helferdb_konfiguration.php
// kopieren und an die eigene Datenbank anpassen
// define( 'MYSQL_HOST', 'localhost' );

View File

@ -8,7 +8,7 @@
"redirects": [
{
"==": {"databasetype": "SQLite"},
"id": "createtables"
"id": "setupsqlite"
},
{
"!=": {"databasetype": "SQLite"},
@ -17,12 +17,12 @@
]
},
{
"id": "createtables",
"page": "<h2>Tabellen einrichten</h2>"
"id": "setupsqlite",
"page": "<h2>Datenbanksoftware installieren<\/h2><p>Hier müssen ein paar Sachen per Hand in einem Terminal gemacht werden, die der Setupwizard vernünftigerweise nicht selbst machen sollte da sie Adminrechte (root) erfordern.\r\n<p>Wir müssen das sqlite Modul für PHP installieren, bitte dazu folgendes in der Shell (z.b. bash) eingeben:<\/p>\r\n<pre><code>sudo apt-get install php-sqlite3<\/code><\/pre><p>Wenn eine Fehlermeldung kommt, dass man nicht in der sudoers Datei ist (oder so ähnlich), vorher folgendes eingeben um zum Adminbenutzer zu wechseln (wenn man zum Adminbenutzer gewechselt ist kann man das vorausgestellte sudo bei allen Kommandos weglassen, es schadet aber auch nicht):<\/p><pre><code>su -<\/code><\/pre><form action=\"Setup.php\" method=\"post\"><input type=\"submit\" value=\"Datenbanksoftware ist installiert\" \/><input type=\"hidden\" name=\"step\" value=\"createdatabase\"\/><input type=\"hidden\" name=\"stepfrom\" value=\"setupsqlite\"\/><\/form>"
},
{
"id": "enterlogindata",
"page": "<h2>Logindaten für die Datenbank eingeben<\/h2>\r\n<p>Bitte hier zun\u00E4chst die Logindaten f\u00FCr die Datenbank eingeben. Es muss in der Regel nur ein Passwort vergeben werden und die anderen beiden Werte k\u00F6nnen unver\u00E4ndert bleiben.<\/p>\r\n<p><form action=\"Setup.php\" method=\"post\">\r\n <fieldset>\r\n <legend>Logindaten eingeben<\/legend>\r\n <input type=\"hidden\" name=\"step\" value=\"setupdatabase\" \/>\r\n <input type=\"hidden\" name=\"stepfrom\" value=\"enterlogindata\" \/>\r\n <label for=\"host\">Hostname<\/label><br \/>\r\n <input type=\"text\" id=\"host\" name=\"host\" value=\"localhost\" \/><br \/>\r\n <label for=\"user\">Benutzername<\/label><br \/>\r\n <input type=\"text\" id=\"user\" name=\"user\" value=\"helferdb\" \/><br \/>\r\n <label for=\"password\">Passwort<\/label><br \/>\r\n <input type=\"password\" id=\"password\" name=\"password\" \/><br \/>\r\n <label for=\"dbname\">Datenbankname<\/label><br \/>\r\n <input type=\"text\" id=\"dbname\" name=\"dbname\" value=\"helferdb\" \/><br \/>\r\n <input type=\"submit\" value=\"Datenbank einrichten\" \/>\r\n<\/fieldset>\r\n<\/form><\/p>\r\n",
"page": "<h2>Logindaten für die Datenbank eingeben<\/h2>\r\n<p>Bitte hier zunächst die Logindaten für die Datenbank eingeben. Es muss in der Regel nur ein Passwort vergeben werden und die anderen beiden Werte können unverändert bleiben.<\/p>\r\n<p><form action=\"Setup.php\" method=\"post\">\r\n <fieldset>\r\n <legend>Logindaten eingeben<\/legend>\r\n <input type=\"hidden\" name=\"step\" value=\"setupmariadb\" \/>\r\n <input type=\"hidden\" name=\"stepfrom\" value=\"enterlogindata\" \/>\r\n <label for=\"host\">Hostname<\/label><br \/>\r\n <input type=\"text\" id=\"host\" name=\"host\" value=\"localhost\" \/><br \/>\r\n <label for=\"user\">Benutzername<\/label><br \/>\r\n <input type=\"text\" id=\"user\" name=\"user\" value=\"helferdb\" \/><br \/>\r\n <label for=\"password\">Passwort<\/label><br \/>\r\n <input type=\"password\" id=\"password\" name=\"password\" \/><br \/>\r\n <label for=\"dbname\">Datenbankname<\/label><br \/>\r\n <input type=\"text\" id=\"dbname\" name=\"dbname\" value=\"helferdb\" \/><br \/>\r\n <input type=\"submit\" value=\"Datenbank einrichten\" \/>\r\n<\/fieldset>\r\n<\/form><\/p>\r\n",
"redirects": [
{
"==": {"password": ""},
@ -41,11 +41,11 @@
]
},
{
"id": "setupdatabase",
"id": "setupmariadb",
"page": [
{"text": "<h2>Datenbanksoftware installieren und starten<\/h2><p>Hier müssen ein paar Sachen per Hand in einem Terminal gemacht werden, die der Setupwizard vernünftigerweise nicht selbst machen sollte da sie Adminrechte (root) erfordern.\r\n<p>Bitte zunächst mariadb einrichten (oder mysql) und dazu folgendes in der Shell (z.b. bash) eingeben:<\/p>\r\n<pre><code>sudo apt-get install mariadb-server<\/code><\/pre><p>Wenn eine Fehlermeldung kommt, dass man nicht in der sudoers Datei ist (oder so ähnlich), vorher folgendes eingeben um zum Adminbenutzer zu wechseln (wenn man zum Adminbenutzer gewechselt ist kann man das vorausgestellte sudo bei allen Kommandos weglassen, es schadet aber auch nicht):<\/p><pre><code>su -<\/code><\/pre><p>Zum Starten der Datenbank sollte jetzt folgendes Kommando ausgeführt werden:<\/p><pre><code>sudo systemctl start mariadb<\/code><\/pre><p>Wenn die Datenbank automatisch bei Start des Computers gestartet werden soll, bitte folgendes eingeben<\/p><pre><code>sudo systemctl enable mariadb<\/pre><\/code><h2>In der Datenbank anmelden und den Benutzer anlegen</h2><p>Jetzt sollte der Datenbankbenutzer und die Datenbank angelegt werden. Dazu müssen wir uns einmal als <i>root</i> Benutzer von der Datenbank selbst (nicht zu verwechseln mit dem root Benutzer vom System) anmelden:<\/p><pre><code>sudo mysql -u root -p<\/code><\/pre><p>Es wird hier nach dem Datenbankpasswort gefragt, aber wenn es nicht gesetzt ist kann man es auch einfach leer lassen.<\/p><p>Um die Datenbank anzulegen bitte in den Datenbankprompt folgendes Kommando eingeben:</p><pre><code>CREATE DATABASE '"},
{"variable": "enterlogindata\/dbname"},
{"text": "';<\/code><\/pre><p>Wir können jetzt den Datenbankbenutzer anlegen:<\/p><pre><code>CREATE USER '"},
{"text": "';' CHARACTER SET = 'utf8mb4' COLLATE = 'utf8mb4_german2_ci';<\/code><\/pre><p>Wir können jetzt den Datenbankbenutzer anlegen:<\/p><pre><code>CREATE USER '"},
{"variable": "enterlogindata\/user"},
{"text": "'@'"},
{"variable": "enterlogindata\/host"},
@ -59,6 +59,18 @@
{"variable": "enterlogindata\/host"},
{"text": "';<\/code><\/pre><p>Wir müssen außerdem die Änderung anwenden:</p><pre><code>FLUSH PRIVILEGES;<\/code><\/pre><pre><code>QUIT;<\/code><\/pre>"}
]
},
{
"id": "createdatabase",
"page": "<h2>Datenbank einrichten<\/h2><p>Wir haben jetzt alle Informationen um die Datenbankeinstellungen zu speichern. Dazu wird die Konfiguration geschrieben und anschließend ein Verbindungsversuch unternommen.<\/p><form action=\"Setup.php\" method=\"post\"><input type=\"submit\" value=\"Datenbankkonfiguration schreiben\" \/><input type=\"hidden\" name=\"step\" value=\"createdatabasetables\"\/><input type=\"hidden\" name=\"stepfrom\" value=\"createdatabase\"\/><\/form>"
},
{
"id": "createdatabasetables",
"page": "<h2>Tabellen für Datenbank einrichten<\/h2><p>Wir können jetzt alle Tabellen in der Datenbank anlegen.<\/p><form action=\"Setup.php\" method=\"post\"><input type=\"submit\" value=\"Datenbanktabellen anlegen\" \/><input type=\"hidden\" name=\"step\" value=\"createservices\"\/><input type=\"hidden\" name=\"stepfrom\" value=\"createdatabasetables\"\/><\/form>"
},
{
"id": "createservices",
"page": "<h2>Dienste in Datenbank anlegen<\/h2>"
}
],
"footer": "</body></html>"