Bei meinem Routing wird der URL gespiltet und wird dann an den Page Controller weitereleitet. Und dort werden dann die entsprechenden Klassen geladen, und die View ausgegeben.
Beiträge von Synergy
-
-
Für was braucht man Klassen mit dem gleichen Name? Ist ja völlig unnötig und kompliziert.
Aber Danke für deine Hilfe. -
UPDATE
- News hinzugefügt
- Voting System hinzugefüg
Die News wurden hinzugefügt. Es gib ein Voting System. Später werde ich noch Kommentare einfügen. Ihr könnt euch das ganze hier anschauen: https://retrotown.ws/www.hobbu.org/…icles/1-testing Die Navigation passt sich noch nicht an, darum steht dort noch Home, aber das werde ich auch demnächst noch machen.
PS: Ein Button um in den Client zu kommen ist noch nicht vorhanden, aber wenn ihr "/client" macht kommt ihr rein.
Screens:
Snippet:
Spoiler anzeigen
PHP
Alles anzeigen<?php class Articles { public $data; private $url; private $user; private $config; private $connection; public function __construct($config, $connection, $url) { $this->url = explode('-', $url[2]); $this->user = new User($config, $connection); $this->config = $config; $this->connection = $connection; $this->getVoting(); $this->CreateArticle(); } public function getArticles() { $query = $this->connection->prepare('SELECT id, title FROM sync_articles ORDER BY id DESC'); $query->execute(); if($query->rowCount()) { while($r = $query->fetchObject()) { if($this->url[0] === $r->id) { echo '<li class="active">' . $r->title . '</li>'; } else { echo '<li><a href="' . $this->config['website']['url'] . '/community/articles/' . $r->id . '-' . str_replace(' ', '-', strtolower($r->title)) . '">' . $r->title . '</a></li>'; } } } } public function getVoting() { $query = $this->connection->prepare('SELECT voting FROM sync_articles_voting WHERE article = :article AND voting = :voting'); $query->execute([ ':article' => $this->url[0], ':voting' => 'like' ]); $this->data['likes'] = $query->rowCount(); $query = $this->connection->prepare('SELECT voting FROM sync_articles_voting WHERE article = :article AND voting = :voting'); $query->execute([ ':article' => $this->url[0], ':voting' => 'dislike' ]); $this->data['dislikes'] = $query->rowCount(); } public function CheckVoting() { $query = $this->connection->prepare('SELECT id FROM sync_articles_voting WHERE article = :article AND id = :id LIMIT 1'); $query->execute([ ':article' => $this->url[0], ':id' => $this->user->data['id'] ]); if($query->rowCount()) { return false; } else { return true; } } public function Like() { $query = $this->connection->prepare('INSERT INTO sync_articles_voting (id, article, voting) VALUES (:id, :article, :voting)'); $query->execute([ ':id' => $this->user->data['id'], ':article' => $this->url[0], ':voting' => 'like' ]); } public function Dislike() { $query = $this->connection->prepare('INSERT INTO sync_articles_voting (id, article, voting) VALUES (:id, :article, :voting)'); $query->execute([ ':id' => $this->user->data['id'], ':article' => $this->url[0], ':voting' => 'dislike' ]); } public function CreateArticle() { $query = $this->connection->prepare('SELECT * FROM sync_articles WHERE id = :id LIMIT 1'); $query->execute([':id' => $this->url[0]]); if($query->rowCount()) { $r = $query->fetchObject(); foreach($r as $key => $value) { $this->data[$key] = $value; } } } public function __destruct() { $this->url = null; $this->data = null; $this->config = null; $this->connection = null; } } ?>
Freundliche Grüsse,
Synergy -
@Synchro das liegt daran das ich Ferien habe
-
Livedemo ist jetzt verfügbar: https://retrotown.ws/www.hobbu.org
Sucht Lücken, Exploits was auch immer. Wenn ihr was findet, lassts mich wissen. Auserdem wenn ihr Vorshläge oder Features habt sagts mir. -
UPDATE
- Profil Einstellungen hinzugefügt
- Error Page hinzugefügt
Die Profil Einstellungen sind nun fertig. Bei den "Andere" Einstellungen wird kann man Farbeinstellungen machen. Bis jetzt wird nur die Farbe des Headers geändert. Aber später werden mehrere Sachen gefärbt sein. Ich habe mir vorgestellt das man einen Hintergrund hochladen kann. Der wird dann auf "Meine Seite" angezeigt. Ich habe auch vor das "Meine Seite" so eine Art Pinnwand ist. Wie z.B. Facebook wo andere User an seine Pinnwand hinschreiben können und beim User eine Meldung kommt, z.B. "Du hast einen neuen Eintrag in deiner Pinnwand. Klick hier... bla bla bla". Aber wir werden sehen wie es sich weiterentwickelt. Ich bin offen für Vorschlage / Features.
Screens:
Snippets:
Spoiler anzeigen
PHP
Alles anzeigen<?php class Settings { public $err = ''; public $success = false; private $user; private $config; private $connection; public function __construct($config, $connection) { $this->config = $config; $this->connection = $connection; $this->user = new User($this->config, $this->connection); } public function ValidateStep1($motto, $home, $friends, $online, $follow) { if(strlen($motto) > 32) { $this->err = 'Das Motto darf maximal 32 Zeichen lang sein.'; } else { $query = $this->connection->prepare('UPDATE users SET motto = :motto, block_newfriends = :block_newfriends, hide_online = :hide_online, hide_inroom = :hide_inroom WHERE id = :id LIMIT 1'); $query->execute([ ':motto' => $motto, ':block_newfriends' => $friends, ':hide_online' => $online, ':hide_inroom' => $follow, ':id' => $this->user->data['id'] ]); $query = $this->connection->prepare('UPDATE sync_users_data SET home_visible = :home_visible WHERE id = :id LIMIT 1'); $query->execute([ ':home_visible' => $home, ':id' => $this->user->data['id'] ]); $this->success = true; } } public function ValidateStep2($old, $new, $repeat) { if(empty($old) || empty($new) || empty($repeat)) { $this->err = 'Füll bitte alle Felder aus.'; } else { $query = $this->connection->prepare('SELECT mail FROM users WHERE id = :id LIMIT 1'); $query->execute([':id' => $this->user->data['id']]); if($query->rowCount()) { $r = $query->fetchObject(); if(strtolower($old) !== $r->mail) { $this->err = 'Diese E-Mail Adresse ist nicht deine derzeitige.'; } elseif(!filter_var($new, FILTER_VALIDATE_EMAIL)) { $this->err = 'Gib bitte eine gültige E-Mail Adresse ein.'; } elseif($repeat !== $new) { $this->err = 'Die E-Mail Adresse stimmen nicht überein.'; } else { $query = $this->connection->prepare('UPDATE users SET mail = :mail WHERE id = :id LIMIT 1'); $query->execute([ ':mail' => strtolower($new), ':id' => $this->user->data['id'] ]); $this->success = true; } } } } public function ValidateStep3($old, $new, $repeat) { if(empty($old) || empty($new) || empty($repeat)) { $this->err = 'Füll bitte alle Felder aus.'; } else { $query = $this->connection->prepare('SELECT password FROM users WHERE id = :id LIMIT 1'); $query->execute([':id' => $this->user->data['id']]); if($query->rowCount()) { $r = $query->fetchObject(); if(!password_verify($old, $r->password)) { $this->err = 'Dieses Passwort ist nicht dein derzeitiges.'; } elseif(strlen($new) < 8) { $this->err = 'Das Passwort muss mindestens 8 Zeichen lang sein.'; } elseif(strlen($new) > 32) { $this->err = 'Das Passwort darf maximal 32 Zeichen lang sein.'; } elseif(!preg_match('/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]+$/', $new)) { $this->err = 'Das Passwort muss Buchstaben und Zahlen entahlten.'; } elseif($repeat !== $new) { $this->er = 'Die Passwörter stimmen nicht überein.'; } else { $query = $this->connection->prepare('UPDATE users SET password = :password WHERE id = :id LIMIT 1'); $query->execute([ ':password' => password_hash($new, PASSWORD_DEFAULT), ':id' => $this->user->data['id'] ]); $this->success = true; } } } } public function ValidateStep4($question, $answer) { if($question > 0 && empty($answer)) { $this->err = 'Gib eine Antwort ein.'; } else { $query = $this->connection->prepare('UPDATE sync_users_data SET security_question = :question, security_answer = :answer WHERE id = :id LIMIT 1'); $query->execute([ ':question' => $question, ':answer' => $answer, ':id' => $this->user->data['id'] ]); $this->success = true; } } public function ValidateStep5($radio, $color, $image) { if(!is_numeric($radio)) { $this->err = 'Es ist ein Fehler aufgetreten.'; } elseif(strlen($color) > 7) { $this->err = 'Ungültiger Farb Hex'; } else { $query = $this->connection->prepare('UPDATE sync_users_data SET radio_pos = :radio_pos, color = :color WHERE id = :id LIMIT 1'); $query->execute([ ':radio_pos' => $radio, ':color' => $color, ':id' => $this->user->data['id'] ]); if(!empty($image)) { if(file_exists('Resources/Data/Users/Backgrounds/' . $image['name'] . '.png')) { unlink('Resources/Data/Users/Backgrounds/' . $image['name'] . '.png'); $fh = fopen($image['tmp_name'], 'rb'); $str = ''; while($fh !== false && !feof($fh)){ $str .= fread($fh, 1024); } $img = @imagecreatefromstring($str); imagepng($img, 'Resources/Data/Users/Backgrounds/' . $image['name']); } } $this->success = true; } } public function Clear() { $query = $this->connection->prepare('UPDATE sync_users_data SET color = :color WHERE id = :id LIMIT 1'); $query->execute([ ':color' => '#2196f3', ':id' => $this->user->data['id'] ]); $this->success = true; } public function __destruct() { $this->err = null; $this->user = null; $this->config = null; $this->success = null; $this->connection = null; } } ?>
Freundliche Grüsse,
Synergy -
Willkommen
-
-
@5AM, für mich sind Controller Klassen die Controllieren was ausgegeben wird. Die Views ist das was Ausgeben wird. Und die Models sind so Datenbank Funktionen wie Login, Register usw..
Hier mal Screen der Ordnerstruktur, dann siehst du wie ich es habe: -
Vielen Dank, aber ich werde die Klammer dran lassen, ich finde das übersichtlicher
-
UPDATE
- Register hinzugefügt
- Client hinzugefügt
Ein weiteres Update. Der Register ist nun auch fertig, nur mir persönlich gefällt das design nicht so gut. Darum würde ich euch bitte mir Vorschläge zu geben, oder soll ich es so lassen? Zudem wurde auch der Client hinzugefügt. Ist aber alles noch auf Englisch, ich werden es dann übersetzen und einen anderen Katalog einfügen.
Snippets:
Spoiler anzeigen
Register EinstellungenCode'register' => [ 'credits' => 25000, // Taler 'duckets' => 3000, // Duckets 'diamonds' => 150, // Diamanten 'loyalty' => 50, // Loyalty Punkte 'rank' => 1, // Standart Rank 'motto' => 'Willkommen im Hotel!', // Standart Motto 'vip' => true, // Ist er VIP? 'vip_points' => 50 // VIP Punkte ],
PHP
Alles anzeigen<?php class Register { public $err = ''; private $user; private $config; private $connection; public function __construct($config, $connection) { $this->config = $config; $this->connection = $connection; $this->user = new User($this->config, $this->connection); } public function ValidateStep1($username, $password, $repeat, $mail) { if(empty($username) || empty($password) || empty($repeat) || empty($mail)) { $this->err = 'Füll bitte alle Felder aus.'; } elseif(strlen($username) < 3) { $this->err = 'Der Username muss mindestens 3 Zeichen lang sein.'; } elseif(strlen($username) > 12) { $this->err = 'Der Username darf maximal 12 Zeichen lang sein.'; } elseif(!preg_match('/^[A-Za-z0-9@:.]+$/', $username)) { $this->err = 'Ungültiger Username.'; } elseif(strpos(strtolower($username), 'mod-')) { $this->err = 'Ungültiger Username.'; } else { $query = $this->connection->prepare('SELECT username FROM users WHERE LOWER(username) = :username LIMIT 1'); $query->execute([':username' => strtolower($username)]); if($query->rowCount()) { $this->err = 'Dieser Username ist leider schon vergeben.'; } elseif(!filter_var($mail, FILTER_VALIDATE_EMAIL)) { $this->err = 'Gib bitte eine gültige E-Mail Adresse ein.'; } elseif(strlen($password) < 8) { $this->err = 'Das Passwort muss mindestens 8 Zeichen lang sein.'; } elseif(strlen($password) > 32) { $this->err = 'Das Passwort darf maximal 32 Zeichen lang sein.'; } elseif(!preg_match('/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]+$/', $password)) { $this->err = 'Das Passwort muss Buchstaben und Zahlen entahlten.'; } elseif($repeat !== $password) { $this->err = 'Die Passwörter stimmen nicht überein.'; } else { $_SESSION['SYNC-REGISTER-USERNAME'] = $username; $_SESSION['SYNC-REGISTER-PASSWORD'] = password_hash($password, PASSWORD_DEFAULT); $_SESSION['SYNC-REGISTER-MAIL'] = strtolower($mail); header('Location: ' . $this->config['website']['url'] . '/register/step2'); } } } public function ValidateStep2($day, $month, $year, $gender) { if(empty($day) || empty($month) || empty($year) || empty($gender)) { $this->err = 'Füll bitte alle Felder aus.'; } elseif(!is_numeric($day) || !is_numeric($month) || !is_numeric($year)) { $this->err = 'Ungültiges Geburtsdatum.'; } else { if($this->config['register']['vip'] == true) { $vip = 1; $expire = time() + (86400 * 50); $votes = 5; $respect = 5; $pet_respect = 5; } else { $vip = 0; $expire = time() - 3600; $votes = 3; $respect = 3; $pet_respect = 3; } if($gender == 'm') { $look = 'ch-215-66.lg-270-79.hr-100-0.sh-305-62.ha-1002-70.hd-180-7.wa-2007-0'; } else { $look = 'ch-635-70.hd-600-1.lg-716-66-62.hr-515-33.sh-735-68'; } $query = $this->connection->prepare('INSERT INTO users (username, real_name, password, auth_ticket, rank, vip_points, credits, activity_points, seasonal_currency, loyalty_points, look, gender, motto, mail, account_created, ip_last, ip_reg, vip, vip_expire, birth) VALUES (:username, :real_name, :password, :auth_ticket, :rank, :vip_points, :credits, :activity_points, :seasonal_currency, :loyalty_points, :look, :gender, :motto, :mail, :account_created, :ip_last, :ip_reg, :vip, :vip_expire, :birth)'); $query->execute([ 'username' => $_SESSION['SYNC-REGISTER-USERNAME'], 'real_name' => $this->config['website']['name'] . ' Hotel', 'password' => $_SESSION['SYNC-REGISTER-PASSWORD'], 'auth_ticket' => $this->GenerateTicket(), 'rank' => $this->config['register']['rank'], 'vip_points' => $this->config['register']['vip_points'], 'credits' => $this->config['register']['credits'], 'activity_points' => $this->config['register']['duckets'], 'seasonal_currency' => $this->config['register']['diamonds'], 'loyalty_points' => $this->config['register']['loyalty'], 'look' => $look, 'gender' => strtoupper($gender), 'motto' => $this->config['register']['motto'], 'mail' => $_SESSION['SYNC-REGISTER-MAIL'], 'account_created' => time(), 'ip_last' => $this->user->getUserIp(), 'ip_reg' => $this->user->getUserIp(), 'vip' => $vip, 'vip_expire' => $expire, 'birth' => $day . '.' . $month . '.' . $year ]); $query = $this->connection->prepare('SELECT id FROM users WHERE username = :username LIMIT 1'); $query->execute([':username' => $_SESSION['SYNC-REGISTER-USERNAME']]); if($query->rowCount()) { $r = $query->fetchObject(); } $query = $this->connection->prepare('INSERT INTO users_stats (id, online_seconds, daily_respect_points, daily_pet_respect_points, daily_competition_votes) VALUES (:id, :online_seconds, :daily_respect_points, :daily_pet_respect_points, :daily_competition_votes)'); $query->execute([ ':id' => $r->id, ':online_seconds' => 0, ':daily_respect_points' => $respect, ':daily_pet_respect_points' => $pet_respect, ':daily_competition_votes' => $votes ]); if($vip == 1) { $query = $this->connection->prepare('INSERT INTO users_badges (user_id, badge_id) VALUES (:user_id, :badge_id)'); $query->execute([ ':user_id' => $r->id, ':badge_id' => 'VIP' ]); } $_SESSION['SYNC-LOGIN'] = $_SESSION['SYNC-REGISTER-USERNAME']; $_SESSION['SYNC-REGISTER-USERNAME'] = null; $_SESSION['SYNC-REGISTER-PASSWORD'] = null; $_SESSION['SYNC-REGISTER-MAIL'] = null; unset($_SESSION['SYNC-REGISTER-USERNAME']); unset($_SESSION['SYNC-REGISTER-PASSWORD']); unset($_SESSION['SYNC-REGISTER-MAIL']); header('Location: ' . $this->config['website']['url'] . '/home'); } } public function GenerateTicket() { return 'SYNC-AUTH-' . rand(000, 999) . '-' . rand(00000, 99999) . '-' . rand(000, 999) . '-' . $this->config['app']['version']; } public function GenerateDays() { for($i = 1; $i <= 31; $i++) { echo '<option value="' . $i . '">' . $i . '</option>'; } } public function GenerateMonths() { $months = [ '1' => 'Januar', '2' => 'Februar', '3' => 'März', '4' => 'April', '5' => 'Mai', '6' => 'Juni', '7' => 'Juli', '8' => 'August', '9' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Dezember' ]; foreach($months as $key => $value) { echo '<option value="' . $key . '">' . $value . '</option>'; } } public function GenerateYears() { for($i = 2015; $i >= 1900; $i--) { echo '<option value="' . $i . '">' . $i . '</option>'; } } public function __destruct() { $this->err = null; $this->user = null; $this->config = null; $this->connection = null; } } ?>
Screens:
Freundliche Grüsse,
Synergy -
-
UPDATE
- Index hinzugefügt
- Eigener Avatarimager
- Codes wurden verbessert
Mit dem neuem Avatarimager kann man ganz leicht Avatars erstellen, das geht so:
Das würde dann sowas ausgeben:Die verschiedenen Parameter werden duch ein / getrennt. Man kann auch nur den Kopf ausgeben wenn man es so macht:
Ausgabe:
Er besitzt natürlich auch ein Cache System.
Snippet:PHP
Alles anzeigen<?php class Imager { private $data; private $base; private $size; private $user; private $params; private $figure; private $action; private $config; private $result; private $gesture; private $headonly; private $direction; private $connection; private $head_direction; public function __construct($config, $connection) { $this->config = $config; $this->connection = $connection; } public function Generate($params) { $this->params = explode('/', $params); foreach($this->params as $key => $value) { $pos = strpos($this->params[$key], '='); $getKey = substr($this->params[$key], 0, $pos); $getValue = substr($this->params[$key], $pos + 1); $this->data[$getKey] = $getValue; } $this->figure = (isset($this->data['figure'])) ? $this->figure = 'figure=' . $this->data['figure'] : 'figure='; $this->action = (isset($this->data['action'])) ? $this->action = '&action=' . $this->data['action'] : ''; $this->size = (isset($this->data['size'])) ? $this->size = '&size=' . $this->data['size'] : ''; $this->gesture = (isset($this->data['gesture'])) ? $this->gesture = '&gesture=' . $this->data['gesture'] : ''; $this->direction = (isset($this->data['direction'])) ? $this->direction = '&direction=' . $this->data['direction'] : ''; $this->head_direction = (isset($this->data['head_direction'])) ? $this->head_direction = '&head_direction=' . $this->data['head_direction'] : ''; $this->user = (isset($this->data['user'])) ? $this->user = $this->data['user'] : ''; $this->headonly = (isset($this->data['headonly'])) ? $this->headonly = '&headonly=' . $this->data['headonly'] : ''; if(!empty($this->user)) { $query = $this->connection->prepare('SELECT look FROM users WHERE username = :username LIMIT 1'); $query->execute([':username' => $this->user]); if($query->rowCount()) { $r = $query->fetchObject(); $this->figure = 'figure=' . $r->look; } } $this->result = $this->figure . $this->action . $this->size . $this->gesture . $this->direction . $this->head_direction . $this->headonly; if(file_exists('Resources/Data/Users/Avatars/' . $this->result . '.png')) { echo '<img src="data:image/png;base64,' . base64_encode(file_get_contents('Resources/Data/Users/Avatars/' . $this->result . '.png')) . '">'; } else { $this->base = 'http://www.habbo.de/habbo-imaging/avatarimage?' . $this->result; file_put_contents('Resources/Data/Users/Avatars/' . $this->result . '.png', file_get_contents($this->base)); echo '<img src="data:image/png;base64,' . base64_encode(file_get_contents($this->base)) . '">'; } } public function __destruct() { $this->data = null; $this->base = null; $this->size = null; $this->user = null; $this->params = null; $this->figure = null; $this->action = null; $this->config = null; $this->result = null; $this->gesture = null; $this->headonly = null; $this->direction = null; $this->connection = null; $this->head_direction = null; } } ?>
Screens: -
UPDATE
- Developer Mode hinzugefügt
- Web-Log hinzugefügt
- Inputs hinzugefügt
Der Web-Log ist einfach eine Datei, die aufzeichnet was von welcher IP aufgerufen wurde. Durch die Funktion error_log() wird in eine Datei ein Log eingetragen und somit wird es wenig performance nutzen, anstatt fopen() oder file_put_contents(). Dazu werden die Logs alle 24h geleert, damit es nicht all zu grosse Datein gibt, aber man kann wie gewöhnlich den Log ein und ausschalten. Ein Log würde etwa so aussehen:
Code[24/07/2015 - 08:55:22] 127.0.0.1 [**] Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 [**] GET app/views/home.php [**] 127.0.0.1:80 -> 127.0.0.1:80
Web-Log Erkärung:
[DATUM] [USERIP] [BROWSER] [FILE]Der Developer Mode macht nichts anderes als die Errors die auftreten einblendet, also error_reporting(). Wenn er ausgeschaltet ist, werden die Errors ausgeblendet.
Screens:
Weitere Updates werden folgen.
-
-
Ok, habt ihr noch Design oder Features Vorschäge? Werde morgen mit dem Index und Register beginnen.
-
Ich habe mich schon informiert über namespaces. Vielleicht werde ich dies noch einfügen. Aber mal eine ganz andere Frage. Ihr kennt sich das Projekt Apollo von Johnix. Dies wurde ja nie fertig und was haltet ihr davon wenn ich das "recode"? Oder sollte ich was anderes machen?
-
Sprachen sind in json. Und zu den namescapes, die verstehe ich nicht darum hab ich auch keine.
-
Er hatte ja das Design Released. Dann hab ich es bisschen verändert. Aber ich bin offen für Design Vorschläge. Wie ich erwähnt habe ich mich noch nicht ganz für ein Design entschieden.
-
Danke für die Vorschläge, hier sind noch ein Paar Snippets:
Route:
PHP
Alles anzeigen<?php class Route { private $url; private $view; private $model; private $config; private $connection; public function __construct($config, $connection) { $this->config = $config; $this->connection = $connection; if(isset($_GET['url'])) { $this->url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL)); } else { $this->url = null; } if(!is_null($this->url[0])) { if(isset($this->url[0])) { if(file_exists('App/Views/' . $this->url[0] . '.php')) { $this->view = $this->url[0]; $this->model = $this->url[0]; } else { $this->view = 'Error'; $this->model = 'Error'; } } if(isset($this->url[1])) { if(file_exists('App/Views/' . $this->url[1] . '.php')) { $this->view = $this->url[1]; $this->model = $this->url[0]; } else { $this->view = 'Error'; $this->model = 'Error'; } } } else { $this->view = 'Index'; $this->model = 'Index'; } new Page($config, $connection, ucfirst($this->view), ucfirst($this->model)); } public function __destruct() { $this->url = null; $this->view = null; $this->model = null; $this->config = null; $this->connection = null; } } ?>
Database:
PHP
Alles anzeigen<?php class Database { private $db; private $config; public function __construct($config) { $this->config = $config; } public function Connect() { try { $this->db = new PDO('mysql:host=' . $this->config['database']['host'] . ';dbname=' . $this->config['database']['name'] . ';charset=utf8', $this->config['database']['user'], $this->config['database']['pass']); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $this->db; } catch (PDOException $e) { die($e->getMessage()); } } public function __destruct() { $this->db = null; $this->config = null; } } ?>
Config:PHP
Alles anzeigen<?php $config = [ 'database' => [ 'host' => '127.0.0.1', 'user' => 'root', 'pass' => '', 'name' => 'hobbu' ], 'website' => [ 'url' => 'http://127.0.0.1', 'name' => 'Hobbu', 'language' => 'de', 'timezone' => 'Europe/Berlin', 'maintenance' => false ], 'plugins' => [ 'smooth' => true, 'adblock' => true, 'preload' => true, 'snowstorm' => false ], 'verification' => [ 'hash' => 'HASH', 'active' => true ], 'app' => [ 'build' => '1000', 'version' => 'RTM', 'release' => '22.07.2015 11:04', 'developer' => true ] ]; ?>