Files
2024-10-13 19:11:55 +02:00

208 lines
12 KiB
PHP

<?php
namespace BlogEngine\Database {
use BlogEngine\Configuration;
use BlogEngine\Database\Tables;
use PHPMailer\PHPMailer\PHPMailer;
class DatabaseController {
public function Connection(){
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
// Jeżeli połączenie nie przejdzie pomyślnie, wyrzuć błąd
if(!$conn){
error_log("Błąd połączenia z bazą: " . mysqli_connect_error());
}
return $conn;
}
public function Close($conn) { mysqli_close($conn); }
function Insert($into, $values) : bool{
$conn = $this->Connection();
if(mysqli_query($conn, "INSERT INTO {$into} VALUES({$values})")){
$this->Close($conn);
return true;
} else {
$this->Close($conn);
return false;
}
}
function CreateTable($name, $columns){
$conn = $this->Connection();
if(mysqli_query($conn, "CREATE TABLE IF NOT EXISTS {$name}({$columns});")){
} else {
echo "Utworzenie tabeli {$name} nie przeszło pomyślnie!";
}
$this->Close($conn);
}
function CreateDatabase(){
$srv = $this->Connection();
// Ładowanie struktury bazy
if($configs = scandir(__DIR__."/Tables")){
if(sizeof($configs) > 0){
foreach($configs as $config){
if(pathinfo($config, PATHINFO_EXTENSION) == "json"){
$tables = array();
$table_content = file_get_contents(__DIR__."/Tables/" . $config);
$structure = json_decode($table_content, true);
foreach($structure as $name=>$table){
$query = "";
foreach ($table as $column){
$column_data = [
"column_name" => "", "datatype" => "", "length" => 0, "enum_data" => [],
"primary_key" => false, "unique" => false,
"auto_increment" => false, "not_null" => false, "default" => ["value" => "", "is_string" => false], "foreign_key" => ["references" => "", "column" => "", "column_name" => ""]
];
if(array_key_exists("column_name", $column))
$column_data['column_name'] = $column['column_name'];
if(array_key_exists("datatype", $column))
$column_data['datatype'] = $column['datatype'];
if(array_key_exists("length", $column))
$column_data['length'] = $column['length'];
if(array_key_exists("enum_data", $column))
$column_data['enum_data'] = $column['enum_data'];
if(array_key_exists("primary_key", $column))
$column_data['primary_key'] = $column['primary_key'];
if(array_key_exists("foreign_key", $column)){
$column_data['foreign_key']['references'] = $column['foreign_key']['references'];
$column_data['foreign_key']['column'] = $column['foreign_key']['column'];
$column_data['foreign_key']['column_name'] = $column['column_name'];
}
if(array_key_exists("auto_increment", $column))
$column_data['auto_increment'] = $column['auto_increment'];
if(array_key_exists("not_null", $column))
$column_data['not_null'] = $column['not_null'];
if(array_key_exists("unique", $column))
$column_data['unique'] = $column['unique'];
if(array_key_exists("default", $column)) {
$column_data['default']['value'] = $column['default']['value'];
$column_data['default']['is_string'] = $column['default']['is_string'];
}
foreach ($column_data as $key=>$new_column){
if($key == "foreign_key") {
if($new_column['references'] != "" && $new_column['column'] != "")
$query .= ", FOREIGN KEY ({$new_column['column_name']}) REFERENCES {$new_column['references']}({$new_column['column']}) ";
} else if($key == "default"){
if($new_column['value'] != "") {
if ($new_column['is_string'])
$query .= "DEFAULT \"{$new_column['value']}\" ";
else
$query .= "DEFAULT {$new_column['value']} ";
}
} else {
if(gettype($new_column) == "string"){
if($new_column != ""){
$query .= $new_column . " ";
}
} else if(gettype($new_column) == "integer"){
if($new_column != 0){
$query .= "({$new_column}) ";
}
} else if(gettype($new_column) == "boolean"){
if($new_column){
$query .= strtoupper(($key != "auto_increment"?str_replace("_", " ", $key):$key)) . " ";
}
} else if(gettype($new_column) == "array"){
if(sizeof($new_column) > 0){
$elements = "";
foreach ($new_column as $element){
$elements .= "'{$element}', ";
}
$elements = substr($elements, 0, strlen($elements) - 2);
$query .= "({$elements}) ";
}
}
}
}
$query .= ", ";
}
$query = substr($query, 0, strlen($query) - 3);
array_push($tables, [
"Nazwa" => $name,
"Struktura" => $query
]);
}
// Dodawanie do bazy tabel
foreach ($tables as $table){
$this->CreateTable($table['Nazwa'], $table['Struktura']);
}
// Dodawanie do tabeli "users" administratora
$this->Insert("users", "1, NULL, '', NULL, '{$_POST['ADMIN_USER']}', '{$_POST['BLOG_AUTHOR']}', PASSWORD('{$_POST['ADMIN_PASS']}'), '{$_POST['ADMIN_EMAIL']}', 'administrator', UUID(), NOW(), NULL");
// Dodawanie do bazy domyślnych danych
if($data = scandir(__DIR__ . "/Values")) {
if(sizeof($data) > 0){
foreach ($data as $datum){
if(pathinfo($datum, PATHINFO_EXTENSION) == "json"){
$value_content = file_get_contents(__DIR__ . "/Values/" . $datum);
$value_structure = json_decode($value_content, true);
//print_r($value_structure);
$i = 0;
foreach ($value_structure as $table) {
foreach ($table as $row=>$columns){
$to_table = array_keys($value_structure)[$i];
$insert_columns = "";
$insert_values = "";
foreach ($columns as $column=>$value){
$insert_columns .= $column . ", ";
if($value == "NULL")
$insert_values .= "NULL, ";
else if($value == "NOW()")
$insert_values .= "NOW(), ";
else if(is_string($value))
$insert_values .= "\"$value\", ";
else if(is_int($value) || is_float($value) || is_double($value))
$insert_values .= "$value, ";
else if(is_bool($value)){
if($value)
$insert_values .= "true, ";
else
$insert_values .= "false, ";
}
}
$insert_columns = trim($insert_columns, ", ");
$insert_values = trim($insert_values, ", ");
$query = "INSERT INTO $to_table($insert_columns) VALUES ($insert_values);";
mysqli_query($srv, $query);
}
$i++;
}
}
}
}
}
}
}
} else {
error_log("Folder \"Tables\" jest pusty. Zatrzymywanie tworzenia bazy!");
}
} else {
error_log("Nie ma dostępnego folderu \"Tables\". Zatrzymywanie tworzenia bazy!");
}
}
function Log($content, $log_level = 'Information', $id_user = null){
$ip_address = file_get_contents("https://api.ipify.org");
$this->Insert("logs(ip_address, content, log_level, created_by)", "'$ip_address', '$content', '$log_level', $id_user");
}
}
}