2009-05-15 14 views
2

Ich habe eine schnelle PHP-Klasse geschrieben, um den Zugriff auf eine MySQL-Datenbank zu erleichtern. Die Klasse funktioniert ok und hat eine query() -Methode, die die Verbindung öffnet, die Abfrage ausführt und dann die Verbindung schließt (ich weiß, dass die Verbindung nach Abschluss des Skripts von PHP selbst geschlossen werden soll, aber ich mag es nicht sich sehr darauf verlassen).Ist diese PHP-Klasse für den MySQL-Datenbankzugriff optimiert?

Aus Performance-Sicht, weiß ich, dass immer eine Verbindung zu einer Datenbank jedes Mal, wenn ich eine Abfrage ausführen, eine sehr gute Praxis ist (und auch wenn ich mysql_real_escape_string() verwenden, um Eingang zu filtern, tut es nicht Funktioniert nicht, da keine aktive Datenbankverbindung besteht. Aber ich möchte darüber mehr geklärt werden. Ist es sehr falsch zu tun? Warum? Und ich würde auch gerne über gute Alternativen wissen.

Hier ist die Klasse:

class DB { 

private $conn; 

//database data 
private $dbhost; 
private $dbname; 
private $dbuser; 
private $dbpass; 

/** 
* Constructor 
* @dbhost string the database host 
* @dbname string the database name 
* @dbuser string the database username 
* @dbpass string the database password 
*/ 
public function __construct ($dbhost, $dbname, $dbuser, $dbpass) 
{ 
    $this->dbhost = $dbhost; 
    $this->dbname = $dbname; 
    $this->dbuser = $dbuser; 
    $this->dbpass = $dbpass; 
} 

/** 
* Connects to mysql database 
*/ 
private function open() 
{ 
    $this->conn = mysql_connect ($this->dbhost, $this->dbuser, $this->dbpass) 
    or die ("Error connecting to database"); 

    mysql_select_db ($this->dbname) or die ("Error selecting database"); 
} 

/** 
* Closes the connection to a database 
*/ 
private function close() 
{ 
    mysql_close($this->conn); 
} 

/** 
* Executes a given query string 
* @param string $query the query to execute 
* @return mixed the result object on success, False otherwise 
*/ 
public function query ($query) 
{ 
    $this->open(); 
    $result = mysql_query($query, $this->conn) 
    or die ("Error executing query ".$query." ".mysql_error()); 

    $this->close(); 
    return $result; 

} 

}

+2

Warum brauchen Sie diese Klasse überhaupt? Es scheint nichts zu den Standardfunktionen hinzuzufügen. Und wenn überhaupt, sollten Sie PDO oder mysqli, nicht mysql_ * Funktionen verwenden. –

+2

Und auch: "Ist es sehr falsch zu tun?" Wenn das in Bezug auf Sie nicht mysql_real_escape_string() verwendet, ja, es ist sehr sehr sehr falsch. Aber noch einmal, mysqli oder PDO parametrisierte Abfragen wären eine viel bessere Lösung. –

+0

Nein, es ging nicht um mysql_real_escape_string(), das ist wichtig. Es ging darum, die Verbindung jedes Mal zu öffnen, wenn ich die DB abfrage. Die Klasse selbst fügt nichts Funktionsfähiges hinzu, sondern eine Abstraktionsebene zur Datenbank, anstatt den Code mit wiederholten Funktionsaufrufen und Fehlerbehandlung zu verschmutzen. – rogeriopvl

Antwort

13

(Ich weiß, dass die Verbindung von PHP selbst schließen soll, nachdem das Skript beendet, aber ich mag es nicht sehr viel verlassen auf diesem).

Warum? Dies ist eine Eigenschaft der Sprache. Es gibt keinen Grund, ihm nicht zu vertrauen. Viele Websites laufen gut und zählen auf PHP, um ihre Sachen zu schließen. Als Programmierer wollen wir natürlich selbst schließen. Das ist gut. Aber Öffnen und Schließen einer Datenbankverbindung für jede Abfrage ist eine schreckliche Idee. Der bessere Weg, es zu tun ist, open() von Ihrem Konstruktor anzurufen und Ihr close() zu __destruct() umzubenennen. Gemäß der Dokumentation wird __destruct "aufgerufen, sobald alle Verweise auf ein bestimmtes Objekt entfernt wurden oder wenn das Objekt explizit zerstört wurde oder in einer beliebigen Reihenfolge in der Abschaltsequenz." Klingt nach einem idealen Ort, um den Abschlusscode für Ihre Datenbankverbindung zu speichern.

+5

Um weiter zu arbeiten, ist das Öffnen einer Datenbankverbindung eine ziemlich teure Operation. Bei einigen DBMS kann das Öffnen einer Verbindung bei einfachen Abfragen mehr Ressourcen erfordern als die Abfrage. Sie brechen auch alles, was für die Dauer einer Verbindung lebt, wie Transaktionen, temporäre Tabellen, pro-Verbindung Variablen usw. Reconnecting zwischen jeder Abfrage ist wirklich, wirklich hässlich, und es gibt keinen Grund, es zu tun . –

+0

Es sollte beachtet werden, dass die Methode __destruct() nur in PHP5 + funktioniert. In PHP4 wird der Code weiterhin ausgeführt, aber __destruct wird nicht automatisch aufgerufen. Die Datenbank wird natürlich am Ende des Skripts geschlossen bleiben. – DisgruntledGoat

Verwandte Themen