2011-01-17 8 views
2

Ich bin mir sicher, was ich derzeit nicht optimal bin, aber ich würde gerne einige Meinungen darüber hören, wie Sie alle db-Abfragen in einer Webanwendung einschließlich behandeln die VerbindungszeichenfolgeWas ist der beste Ansatz für die Behandlung von db-Abfragen

Im Moment habe ich ein classes Verzeichnis, das eine Datei für jede Klasse hat, und ich habe ein anderes Verzeichnis namens db, die ein conn.php enthält, die die Verbindungszeichenfolge und die anderen Dateien auf das db Verzeichnis classes Verzeichnis hat, sind wie in dem , eine für jede Klasse, aber um die mysql-Abfragen zu behandeln.

Also im Grunde habe ich alle db Abfragen pro Klasse in einer Datei und wenn ich etwas aus der Klasse Datei abfragen müssen, rufe ich die Funktion auf der db-Datei

ich jede db-Datei in der entsprechenden db-Datei enthalten Zum Beispiel in der user.class.php Datei finden Sie include('db/user.db.php').

Außerdem schließe ich die Datei conn.php in jede db-Datei ein.

user.class.php:

include('db/user.db.php'); 
class User { 
    public $fname; 
    public $userid; 

    function __construct($userid) { 
     $this->user_id = $userid; 
     $this->fname = DB_GetFirstName($userid); 
     } 
} 

user.db.php:

include('conn.php'); 
function DB_GetFirstName($userid) { 
    $result = mysql_fetch_array(mysql_query("SELECT USR_FName FROM users WHERE USR_ID = '$userid'")); 
    return $result[0]; 
} 

conn.php:

$conn = mysql_connect("localhost", "user", "pass"); 
mysql_select_db("dbname", $conn); 

Wie geht es Ihnen?

+0

Sounds okay für mich. Sie trennen den Db-Zugriff von Ihren Domänenklassen. Wie stellst du das zusammen? Können Sie einige Auszüge aus Ihren Benutzer- und UserDb-Klassen anzeigen? – Gordon

+0

Einige Schnipsel hinzugefügt, es sieht nicht zu elegant für mich aus. Mir wurde auch gesagt, dass ich eine Verbindung zur Datenbank für jede Abfrage öffnen sollte, warum ist das so? –

Antwort

1

Sie tun bereits das Richtige, indem Sie Ihre Domänenebene von der Datenbankzugriffsebene trennen. Aber die Art, wie Sie es zusammensetzen, könnte verbessert werden. Sehen Sie sich das Muster Table Data Gateway (TDG) an.

Im Table Data Gateway-Muster kapselt eine Klasse den gesamten Zugriff auf eine bestimmte Tabelle. Das ist eine Art wie Ihre User.Db.php mit dem Unterschied, dass das TDG eine echte Klasse ist. Statt einer Reihe von Funktionen gruppieren Sie alle zugehörigen Datenbankzugriffe in diese bestimmte Klasse. Dies hat den unmittelbaren Vorteil, dass Sie die Instanz an jede Klasse übergeben können, die sie benötigt, anstatt Funktionsaufrufe in sie zu codieren.

Wenn Sie mit einer bestimmten Tabelle arbeiten müssen, verwenden Sie das TDG, um Zeilen daraus abzurufen/zu ändern. Sie können dann entweder mit den zurückgegebenen Recordsets arbeiten. Oder verwenden Sie eine DataMapper, um die Daten aus dem Recordset auf Ihre Domain-Klassen, z. Ihre Benutzerklasse. Für einfache DataMapper ist die eigene Erstellung in Ordnung. Sobald es komplexer wird, verwenden Sie besser ein vorhandenes ORM. Eine Alternative zum TDG wäre die Row Data Gateway pattern.

Es ist eine gute Einführung in TDGs (mit einem Beispiel Zend Framework) bei

und für Row Data Gateway

3

Verwenden Sie eine Database Abstraction Layer. Was Sie getan haben, klingt nach einem besseren Ansatz als rohe SQL-Zeilen, solange Sie Eingaben validieren und Injektionsangriffe verhindern.

Beliebte PHP-Frameworks wie Doctrine2 have built-in database abstraction layers, die unter die Lupe genommen wurden und viele Dinge abdecken, die Sie wahrscheinlich am Ende selbst tun werden.

Ich empfehle, eine Open-Source-Schicht wie oben erwähnt zu verwenden, bevor Sie Ihre eigene erstellen, da es bereits sehr solide Codebasen für Sie gibt. Erfinde das Rad nicht neu. Wenn Sie einen Mangel feststellen, denken Sie darüber nach, das Projekt zu verbessern.

+0

Je mehr Projekte ich mache, desto mehr komme ich zu dem Schluss, dass eine Datenbank-Abstraktionsschicht (meistens) sinnlos ist. Zugegeben, es ist praktisch, nur eine API zu lernen, anstatt alle vorhandenen Erweiterungen der Datenbank zu lernen. Aber auch sie sind nicht so schwer zu finden und bieten oft eine größere Flexibilität. Und ich musste nie die tatsächliche db ändern, so dass dieses Argument nicht zählt. – Gordon

+0

Ich musste meine Datenbank kürzlich ändern (Oracle kaufte MySQL, änderte die Umverteilungslizenzbedingungen) und die DBAL rettete mich wirklich, als ich zu Postgres wechselte. DBALs können die Komplexität erhöhen und haben das Gefühl, dass das Training an der Reihe ist. Ich bin jedoch nicht allein in meinem Gefühl, dass sie Sie mehr sparen, als sie Sie kosten, besonders wenn Sie Sicherheit, Flexibilität und DRY in Betracht ziehen. – Incognito

+1

Ich denke, es hängt davon ab, wie viel der db-herstellerspezifischen Code-Features Sie benötigen. In einem Projekt mussten wir so viel Oracle-spezifisches SQL in die Abfragen stecken, dass es im Grunde keinen Sinn machte, eine DAL zu wählen, um mit der DB zu arbeiten. Und da sie Gott-weiß-wie-viel-Geld für die Lizenz bezahlten, würden sie sich auch nicht so bald ändern. In diesem Projekt hatten wir den DB-Zugang nur ein wenig langsamer gemacht und fast keinen Vorteil erlangt. Sollte die OCI-Erweiterung direkt verwendet haben. – Gordon

1

Für kleine Projekte verwende ich sehr einfache PHP-Klasse http://code.google.com/p/edb-php-class/

$result = $db->q("select * from `users`limit 3"); 

foreach($result as $a){ 
     echo $a['name'].' '.$a['surname'].' '.$a['email'].' '.$a['country'].'</br>'; 
} 

für größere eine Datenbank-Abstraktionsschicht verwenden.

Verwandte Themen