Lieber j4nk3y,
Sprich, wenn die Datenbank nicht nicht existiert dann lege sie an und erstelle alle nötigen Tabellen. bis jetzt sind das etwa 40 die Teilweise direkt mit Daten gefüttert werden.
wenn Du Deinen Chat auf Deiner Seite am laufen hast, wie oft wird es wohl vorkommen, dass Du die Datenbank neu erstellen musst? Genau, niemals! Um eine DB einzurichten, verwende ich phpMyAdmin, ein Tool, welches auch viele Webhoster ihren Kunden zur DB-Administration anbieten. Dann ist die DB eingerichtet und meine Software kann loslegen.
Du könntest eine Art install.php-Script bereitstellen, welches vor einer ersten Benutzung die Datenbank tatsächlich einrichtet - aber nur ihre Tabellen. Die DB selbst musst Du bei einem "Shared Webhosting" zusammen mit dem DB-Benutzer vorher schon bereitgestellt haben.
Außerdem wird eine Transaktion gestartet,
Meine Klasse ist nicht für Transaktionen entwickelt worden.
Und wie escape ich da richtig?
Was war an meinen Beispielen missverständlich? Dort wird nichts escaped, das übernimmt die PDO-Klasse, die von meiner Klasse benutzt wird.
Umgekehrt, das was ich aus der Datenbank zurückbekommen mit
get()
escape ich weiterhin mithtmlspecialchars()
bzwhtmlentities()
.
Nein, das lässt Du hübsch als "raw"-Format unverändert. Erst wenn Du Daten an einer bestimmten Stelle in einem bestimmten Kontext (z.B. HTML) ausgibst, maskierst Du sie an eben dieser Stelle kontextgerecht. Also:
// nicht so:
$quark = htmlspechialchars($db->get($query['sql'], $query['params']));
echo "<html><head><title>Chat</title></head><body>$quark</body></html>";
// sondern so:
$data = $db->get($query['sql'], $query['params']);
echo "<html><head><title>Chat</title></head><body>",htmlspecialchars($data),"</body></html>";
Im Übrigen bin ich immer noch der Meinung, dass Du für Deinen Chat besser Objekte entwirfst, die (ähnlich wie MyPDO den Umgang mit PDO etwas vereinfacht) in Deinem Programm diverse Vorgänge vereinfachen.
Stellen wir uns doch einmal einen User vor. Was hat der und was kann der?
class ChatUser {
// Eigenschaften
private $email;
private $login;
private $pw;
// Methoden
public function __construct ($db_data) {} // Konstruktor-Funktion, nimmt DB-Daten auf
public function change_email () {}
public function change_pw () {}
public function login () {}
public function logout () {}
private function save_data () {} // wird von change_email und change_pw benötigt
public function send_message () {}
}
Die Methoden change_email
und change_pw
nutzen intern die Methode save_data
, welche z.B. mit MyPDO
(oder etwas völlig anderem - egal) den Datenabgleich mit der DB regelt. Möchte sich ein User z.B. bei Deinem Chat anmelden (z.B. example.org/chat/login), so lädt Dein Haupt-Script alle DB-Einträge aus der DB, deren Login-Namen dem gePOSTeten Wert entsprechen und erstellt daraus ChatUser
-Objekte. Diese dürfen dann der Reihe nach ihre login
-Methode ausführen, um einen Login-Vorgang zu testen. Ist er erfolgreich, wird z.B. das ChatUser
-Objekt in $_SESSION['user'] gespeichert, um Deiner Anwendung zu signalisieren, dass da ein erfolgreicher Login war.
Die Methode send_message
hat intern auch wieder Code, der mit der Datenbank interagiert, z.B. die Message in der Tabelle chatlog
abzuspeichern.
Auf diese Art und Weise modularisierst Du Dein Programm mit Objekten, um im Hauptprogramm dann mit diesen zu operieren.
Liebe Grüße,
Felix Riesterer.