Hey,
in meinem ersten Tutorial zu PHP möchte ich euch nun eine(bzw. zwei) kleine Klassen zeigen, welche ich zusammen mit Leon geschrieben habe.
Diese Klasse dient dem Zweck, jegliche MySQL Query in eine Log Datei zu schreiben, um so nachvollziehen zu können, welche Queries ausgeführt wurden/werden.
Als erstes legen wir eine Datei mit dem Namen qlog.class.php an, in welcher wir die Queries loggen. Wir definieren als erstes die Klasse QLog.
|
1 2 3 4 5 |
<?php
class QLog{
}
?> |
Danach müssen wir 2 protected Variablen in dieser Klasse erstellen.
Diese wären $LogDir und $fopenObj.
|
1 2 |
protected $LogDir;
protected $fopenObj; |
$LogDir wird später den Ordner, in welchem die Log Datei liegen soll, beinhalten.
$fopenObj wird später fopen der Log beinhalten.
Gleich nach dem Aurufen der Klasse soll es $LogDir und $fopenObj definieren. Dies passiert mit folgendem Code:
|
1 2 3 4 5 |
public function __construct()
{
$this->LogDir="/log/mysql/";
$this->fopenObj = fopen($this->LogDir.date("m_Y").".log", "a+");
} |
$LogDir bekommt den Wert des Log Verzeichnis, welches bei uns “/log/mysql/” ist.
$fopenObj ruft dabei die Datei “date(“m_Y”).”.log” im Log Verzeichnis auf. Durch den Modus “a+” kann die Datei bei nicht existieren erstellt und geöffnet werden, wenn sie existiert wird sie einfach nur geöffnet.
“date(“m_Y”)” stellt das Datum im Format m_Y dar, sozusagen Monat_Jahr. Dadurch wird auch gleichzeitig jeden Monat eine neue Log Datei erstellt. Diese kann z.B. so heißen: “03_2012.log”
Will man in die Log Datei schreiben, braucht man eine extra function. Diese sieht so aus:
|
1 2 3 4 5 |
public function writeQuery($Query)
{
fwrite( $this->fopenObj, "at: ".date("s:i:H")." -- ".date("d-m-Y")." was this Query: \"$Query\" Executed\r\n");
return true;
} |
$Query beinhaltet später die MySQL Query.
Durch die Funktion fwrite() wird der Eintrag in die Log Datei erstellt. Dabei wird im Beispiel Sekundengenau eingetragen. Der Text kann später so aussehen:
“at: 21:10:23 — 08-03-2012 was this Query: “SELECT * FROM Users;” Executed”
Am Ende dieser Funktion gibt es noch ein true zurück.
Das letzte in der Klasse QLog ist die __destruct Funktion.
In dieser wird lediglich ein fclose() der Datei $fopenObj durchgeführt.
|
1 2 3 4 |
public function __destruct()
{
fclose($this->fopenObj);
} |
Das war es jetzt auch schon für die Datei qlog.class.php.
Nun kommen wir zu einer Datei, die nicht unbedingt sein müsste, jedoch zur vereinfachung angefertigt wurde.
Diese Datei heißt sqli.class.php.
Wir benötigen unseren Grundaufbau einer Klasse, jedoch mit 2 Besonderheiten.
Das erste wäre, die qlog.class.php einzubinden. Dazu kommt jedoch auch noch, die mysqli Klasse einzubinden. Danach sieht unser Grundbau der Datei so aus:
|
1 2 3 4 5 6 |
<?php
require("qlog.class.php");
class sqli extends mysqli {
}
?> |
Durch die Klasse sqli.class.php wollen wir eigentlich nur bezwecken, nicht jedes mal 2 Befehle eingeben zu müssen, um ein Query durchzuführen und es dazu noch zu loggen. Darum brauchen wir als ersten den __construct Teil, welcher eine typische MySQLi Verbindung herstellen soll. Dies kann man so ermöglichen:
|
1 2 3 4 |
public function __construct($user,$pw,$db,$host="localhost"){
parent::__construct($user,$pw,$db,$host);
}
?> |
Dadurch kann man später mit einem einfachen Befehl Verbindung aufbauen. Wie das genau geht, wird später erklärt.
Erstmal müssen wir nämlich noch die Funktion schreiben, um den Query auszuführen und gleichzeitig zu loggen. Dies geschieht ab besten so:
|
1 2 3 4 5 |
public function query($query){
$ql = new QLog();
$ql->writeQuery($query);
parent::query($query);
} |
In $ql wird unsere vorhin geschriebene QLog Klasse gebraucht.
Durch parent::query(); wird die Query ausgeführt.
Damit war es das auch für diese Datei. Um sie zu benutzen, werden wir folgendes brauchen:
|
1 2 3 4 5 |
<?php
require("sqli.class.php");
$sql = new sqli("User","Passwort","Datenbank","Host");
$sql->query("INSERT INTO users(name) VALUES ('Jan');");
?> |
Wir binden die Datei sqli.class.php ein, stellen eine Verbindung her und führen dann ein Query aus.
Ein kleiner Trick: Wenn beim Host localhost verwendet wird, kann es auch frei gelassen werden. Somit würde es folgendermaßen heißen:
|
1 |
$sql = new sqli("User","Passwort","Datenbank"); |
Jede weitere Verarbeitung der Query ist normal wie bei MySQLi.
Hier nochmal die Files als Anhang:
QLog
Mit vielen Grüßen
Jan










