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.

1 Star2 Stars3 Stars4 Stars5 Stars (Wurde noch nicht bewertet)
Loading...


8 Kommentare zu “MySQL-Klasse OOP-PHP 5 mit Errorlogging”

  1. PHP5 und dann noch nichts von Exceptions gehört.

    Dein (Kern-)Konzept mit dem Error-Logging geht leider voll am Ziel vorbei… 😉

  2. PeterJackson on April 28th, 2009 at 14:19

    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.

  3. @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

  4. PeterJackson on April 30th, 2009 at 06:00

    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

  5. 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

  6. Peter Jackson on April 30th, 2009 at 13:44

    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 : – )

  7. Schon mal was von mysqli gehört?!?

  8. Damals noch nicht, jetzt selbstverständlich schon
    .-= Simon´s last blog ..Ferry Corsten’s Countdown 132 (06.01.2010) =-.

Hinterlasse einen Kommentar!

Time limit is exhausted. Please reload the CAPTCHA.

»Informationen zum Artikel

Autor: Simon
Datum: 26.07.2008
Zeit: 14:15 Uhr
Kategorien: Codeschnipsel
Gelesen: 9094x heute: 3x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta