Files
MVC/Framework/install_db.php
T

148 lines
4.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Database & Models Installer
* Nutzung: php install_db.php
*/
if (php_sapi_name() !== 'cli') {
die("Dieses Script muss über die CLI ausgeführt werden.\n");
}
require_once __DIR__ . '/WEBROOT/src/database/databaseConnect.php';
require_once __DIR__ . '/WEBROOT/src/utils/databaseMethods.php';
$config = parse_ini_file(__DIR__ . '/WEBROOT/src/config/env.ini');
$env = strtoupper($config['APP_ENV']);
$dbName = $config["DB_{$env}_DATABASE"];
$workerUser = $config["DB_{$env}_USERNAME"];
$workerPass = $config["DB_{$env}_PASSWORD"];
echo "🚀 Starte Datenbank-Setup als Root...\n";
$rootConn = db_connect_root();
if (!$rootConn) {
die("❌ Fehler: Verbindung als Root fehlgeschlagen. Bitte prüfe DB_ROOT credentials in env.ini\n");
}
// 1. Datenbank erstellen
echo "📁 Erstelle Datenbank '$dbName'...\n";
$rootConn->query("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
// 2. Worker User erstellen und berechtigen (intern & extern)
echo "👤 Erstelle Worker-User '$workerUser'...\n";
$rootConn->query("CREATE USER IF NOT EXISTS '$workerUser'@'localhost' IDENTIFIED BY '$workerPass'");
$rootConn->query("CREATE USER IF NOT EXISTS '$workerUser'@'%' IDENTIFIED BY '$workerPass'");
echo "🔐 Vergebe Berechtigungen...\n";
$rootConn->query("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$workerUser'@'localhost'");
$rootConn->query("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$workerUser'@'%'");
$rootConn->query("FLUSH PRIVILEGES");
$rootConn->close();
echo "🚀 Starte Datenbank-Tabellen-Installation...\n";
// Definitionen der Tabellen und Models
$tables = [
'Mailing' => [
'columns' => "
`ID` INT AUTO_INCREMENT PRIMARY KEY,
`DATUM` DATETIME NOT NULL,
`SUBJECT` VARCHAR(255),
`MESSAGE` TEXT,
`URL` VARCHAR(255),
`CLIENT_IP` VARCHAR(45)
",
'model' => <<<PHP
<?php
namespace MVC\Model;
use MVC\Core\Model;
class Mailing extends Model {
protected static \$table = "Mailing";
public static function log(\$subject, \$message, \$url, \$ip, \$date) {
return self::insert([
'DATUM' => \$date,
'SUBJECT' => \$subject,
'MESSAGE' => \$message,
'URL' => \$url,
'CLIENT_IP' => \$ip
]);
}
}
PHP
],
'Users' => [
'columns' => "
`ID` INT AUTO_INCREMENT PRIMARY KEY,
`USERNAME` VARCHAR(50) UNIQUE NOT NULL,
`PASSWORD` VARCHAR(255) NOT NULL,
`EMAIL` VARCHAR(100),
`ROLE` VARCHAR(20) DEFAULT 'user',
`CREATED_AT` DATETIME DEFAULT CURRENT_TIMESTAMP
",
'model' => <<<PHP
<?php
namespace MVC\Model;
use MVC\Core\Model;
class Users extends Model {
protected static \$table = "Users";
/**
* Findet einen Benutzer nach seinem Namen.
*/
public static function getByUsername(\$username) {
\$result = self::where("USERNAME = ?", \$username);
return \$result[0] ?? null;
}
}
PHP
],
];
foreach ($tables as $tableName => $info) {
echo "--- Tabelle: $tableName ---\n";
try {
if (DatabaseCreateTable($tableName, $info['columns'])) {
echo "✅ Struktur bereit.\n";
$modelPath = __DIR__ . "/WEBROOT/src/MVC/Model/{$tableName}.php";
if (!file_exists($modelPath)) {
if (!is_dir(dirname($modelPath))) mkdir(dirname($modelPath), 0755, true);
file_put_contents($modelPath, $info['model']);
echo "✅ Model erstellt: $modelPath\n";
} else {
echo "ℹ️ Model existiert bereits.\n";
}
}
} catch (Exception $e) {
echo "❌ Fehler bei $tableName: " . $e->getMessage() . "\n";
}
}
// 3. Test-User anlegen
echo "👤 Erstelle Test-User...\n";
require_once __DIR__ . '/WEBROOT/src/MVC/Model/Users.php';
try {
if (!\MVC\Model\Users::getByUsername('admin')) {
\MVC\Model\Users::insert([
'USERNAME' => 'admin',
'PASSWORD' => password_hash('admin123', PASSWORD_DEFAULT),
'EMAIL' => 'admin@example.com',
'ROLE' => 'admin'
]);
echo "✅ Test-User 'admin' mit Passwort 'admin123' erstellt.\n";
} else {
echo "ℹ️ Test-User 'admin' existiert bereits.\n";
}
} catch (Exception $e) {
echo "❌ Fehler beim Erstellen des Test-Users: " . $e->getMessage() . "\n";
}
echo "\n✨ Installation abgeschlossen.\n";