MySQL-Klasse OOP-PHP 5 mit Errorlogging
Hier die Anwendung der verschiedenen Möglichkeiten:
error_reporting(E_ALL | E_STRICT);
require_once("database.class.php");
$db = new database("localhost", "root", "", true) or die(mysql_error());
$db->set_errormailing(true, "simon@virtual-meetings.de");
$db->set_error_output(true);
$db->set_querylogging(true);
$db->select_db("meine_Db");
$db->query("irgendwas");
echo $db->get_number_of_requests();
echo "";
echo $db->get_last_query();
echo "";
$db->get_queries(true);
Und hier die Klasse höchstpersönlich:
class database
{
private $connection;
private $result;
private $sum_of_requests;
private $print_errors;
private $errorlog;
private $query;
private $all_queries;
private $log_queries;
private $mail_errors;
private $mailto;
public function __construct($db_host, $db_user, $db_pw, $use_pconnect = true)
{
$this->connection = false;
$this->result = false;
$this->sum_of_requests = 0;
$this->print_errors = false;
$this->errorlog = array();
$this->query = "";
$this->all_queries = array();
$this->log_queries = false;
$this->mail_errors = false;
$this->mailto = "";
if($use_pconnect === true)
{
$this->connection = mysql_pconnect($db_host, $db_user, $db_pw) or $this->error();
}
if(!$this->connection)
{
$this->connection = mysql_connect($db_host, $db_user, $db_pw) or $this->error();
if(!$this->connection)
{
die("Couldn't establish a connection");
}
}
}
public function __destruct()
{
$this->close();
unset($this->connection);
unset($this->result);
unset($this->sum_of_requests);
unset($this->print_errors);
unset($this->errorlog);
unset($this->all_queries);
unset($this->log_queries);
unset($this->mail_errors);
unset($this->mailto);
}
//--------------------------------------------------------------------------------------------
/**
The get-methods
*/
public function get_connection_id()
{
if($this->connection !== false)
{
return $this->connection;
}
else
{
return "There's no connection to any database";
}
}
public function get_errorlog($print_it = true)
{
if($print_it === true)
{
foreach($this->errorlog as $key => $value)
{
echo " ".($key+1).": ".$this->errorlog[$key];
}
}
//return the errorlog in every case
return $this->errorlog;
}
public function get_queries($print_it = true)
{
if($print_it === true)
{
foreach($this->all_queries as $key => $value)
{
echo " ".($key+1).": ".$this->all_queries[$key];
}
}
//return the errorlog in every case
return $this->all_queries;
}
public function get_number_of_requests()
{
return (int)$this->sum_of_requests;
}
public function get_affected_rows($handler)
{
if(isset($handler))
{
return mysql_num_rows($handler) or $this->error();
}
else
{
return false;
}
}
public function get_last_query()
{
return ((!empty($this->query)) ? $this->query : "no query aviable");
}
//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
/**
The set-methods
*/
public function set_error_output($boolval = true)
{
$value_before = $this->print_errors;
$this->print_errors = ($boolval === true) ? true : false;
return $value_before;
}
public function set_querylogging($boolval = true)
{
$value_before = $this->log_queries;
$this->log_queries = ($boolval === true) ? true : false;
return $value_before;
}
public function set_errormailing($boolval = true, $mailto)
{
$value_before = $this->mail_errors;
$this->mailto = $mailto;
$this->mail_errors = ($boolval === true) ? true : false;
return $value_before;
}
public function select_db($db_name)
{
return mysql_select_db($db_name, $this->connection) or $this->error();
}
//--------------------------------------------------------------------------------------------
/**
Other methods of this class
*/
private function error()
{
$this->errorlog[] = mysql_error($this->connection);
if($this->mail_errors === true)
{
mail($this->mailto, "MySQL-Error", "The following error occured: ".mysql_error($this->connection));
}
if($this->print_errors === true)
{
die("an error occured: ".mysql_error($this->connection));
}
}
public function query($db_query_string)
{
$this->query = $db_query_string;
if($this->log_queries === true)
{
$this->all_queries[] = $this->query;
}
$this->ergebnis = mysql_query($this->query, $this->connection) or $this->error();
$this->sum_of_requests++;
return $this->ergebnis;
}
public function escape_string($string)
{
return mysql_real_escape_string($string, $this->connection);
}
public function close()
{
mysql_close($this->connection);
$this->connection = false;
}
//--------------------------------------------------------------------------------------------
}
Natürlich ist das Teil noch erweiterunsfähig.
PHP5 und dann noch nichts von Exceptions gehört.
Dein (Kern-)Konzept mit dem Error-Logging geht leider voll am Ziel vorbei… 😉
Schließ ich mich an. Eine eigene DB-Exception
Klasse würd ich hier noch einbinden.
Würd daraus auch n singleTon machen, den
Constructor private und eine connect-Methode
schaffen. Dann kann man noch interfaces
implementieren, falls man mal dieselbe Schnittstelle für ne andere DB brauch.
Bei der Query-Funktion fehlt mir irgendwas,
was die DB-Abfrage „Absichert“. Ich hab
bei meiner Klasse nen weiteren Parameter
$unsave = false drangepackt.
Error-Logging find ich an sich eigentlich ganz gut.
@Tobi:
Jo, das war eine meiner ersten Klassen. Da kann man nix perfektes erwarten!
@PeterJackson:
Aus was würdest du ein Singleton machen? Aus der DB oder der Exception?
Was bewirkt der Parameter $unsave bei dir?
Simon
Aus der DB-Klasse logischerweise :))
Vielleicht das ganze noch so aufziehen,
dass es trotz Singleton möglich ist, die
Klasse so zu nutzen, dass man zu mehreren
Datenbanken ne Verbindung aufbauen kann.
Der Parameter unsave steht anfangs auf false
(Abfrage nicht sicher = false). Im Falle
von false, lass ich einige Filter durch
eine DB-Query-Filter Klasse laufen um
Html, Tags, Javascript zeugs, etc. zu entfernen.
Brauchte ich mal für mehrere Portale wo User
was in Textfelder reinschreiben. (Hätte man
natürlich auch durch das Request Pattern bzw.
Filter im Frontcontroller lösen können. Zu der
Zeit kannte ich das aber noch nicht. 🙂
Steht der Parameter auf true, wird die query
halt nicht gefiltert (meist für Adminfunktionen
um Content zu verwalten).
LG PJ
Hi, das mit dem Singleton hab ich schon in meiner aktuellen MySQL(i)-Klasse so gelöst. Diese ist allerdings Teil meines Frameworks und baut auch auf das Config-System des FWs auf. Link zur Klasse: http://www.net-developers.de/2008/11/29/beta-version-meiner-mysqli-klasse/
Mir fällt gerade auf, dass ich in dem Artikel relativ wenig Text und Kommentare habe.. Kommt auf meine ToDo-Liste 😉
Also ich finde, dass die MySQL-Klasse sich nicht darum kümmern sollte, HTML und sonstiges zu entfernen. Das wird bei mir im Controller bzw. im Model gemacht.
Simon
Ah cool. Das wusste ich nicht!
Danke
Zu den querys. Haste schon recht, ich sagte ja
bereits. Andere Methoden wie Filter oder
das Request / Response pattern waren mir zu
der Zeit nicht bekannt : – )
Schon mal was von mysqli gehört?!?
Damals noch nicht, jetzt selbstverständlich schon
.-= Simon´s last blog ..Ferry Corsten’s Countdown 132 (06.01.2010) =-.