Abstraktionsschicht für PDO

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abstraktionsschicht für PDO

    Moin Leute,

    ich beschäftige mich seit einigen Tagen mit der Objektorientierten Programmierung. Dabei bin ich dann irgendwie auf PDO gestoßen, und finde das ist eigentlich eine ganz feine Sache. Vielleicht hat der ein odere andere von euch das ja in dem anderen Thread mitbekommen.

    Als erstes Projekt dachte ich mir, ich bastel eine kleine Abstraktionsschicht für PDO ( Ja, in dem anderen Thread wurde da was gepostet, das habe ich aber nicht vollständig begriffen, darum wollte ich mir selber etwas schreiben. )

    Zuerst dachte ich mir: Was soll das Ding eigentlich leisten ?
    • Den Code für spätere Projekte übersichtlich halten ( Einfach nur Query mit ? und dahinter ein Array mit den Werten als Paramter für Queries )
    • Bei SELECT-Anfragen das Ergebnis in einem assoziativen Array zurückgeben.


    Der Endbenutzer soll also eigentlich nicht mehr benutzen müssen als das:

    PHP-Code:
    $db = new MyQuery('localhost''xxx''xxx''verwaltung');
        
    $result $db -> doQuery("SELECT name FROM account WHERE name = ?", array('Klaus')); 
    Dafür habe ich mir nun folgenden Codeschnippsel gebastelt:

    PHP-Code:
    <?php

    class MyQuery extends PDO{

        public function 
    __construct($host$user$password$database){
          
    parent::__construct('mysql:host=' $host .';dbname='$database ''
    $user$password); 
        }
        
        
        public function 
    doQuery($query$data = array()){

            
    $stm $this -> prepare $query );
            
            if(
    $stm -> execute( (array) $data)){
            
            if (
    preg_match ("/^select/i"$query)){
                
    $result $stm -> fetchAll(PDO::FETCH_ASSOC);
                return 
    $result;
            }
            else{
             return 
    true;
            }
            
            
    $this -> closeCursor();
            }
             
             }
            
        
        
        
    }
    ?>
    Funktioniert soweit auch, sofern die Queries keine Synstax-Fehler haben und alle Tabellen/Spalten existieren. Ich hab mich nun ne Weile durch das Manual gewühlt und irgendwie komm ich mit dem Error-Handling garnicht klar.

    Ich möchte gerne eine Exception werfen, die den SQL-Error enthält ( sofern vorhanden ), damit der Benutzer weiß, was er verkehrt gemacht hat.

    Ansonsten, hackt bitte auf mir herum, ich bin für jeden Tip, jede Kritik, oder sonstige Äußerung irgendwie dankbar. Ich bin ein Anfänger, und möchte gern was dazulernen.

    Greetz,
    nohfreak

    P.S.: Evtl. gehört der THread auch eher nach Projekthilfe, ich weiß nicht genau. :>
    Zuletzt geändert von nohfreak; 27.02.2008, 22:43.
    Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

  • #2
    Schau die mal Exceptions und Exceptionhandling an (try { } catch ( ) { }).
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

    Kommentar


    • #3
      Ja, das weiß ich. Ich kapier nur nich, wie ich von PDO den SQL-Error rausbekomme. :>
      Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

      Kommentar


      • #4
        PHP-Code:
        try
        {
            
        $pdo->do_something_stupid();
        }
        catch (
        PDOException $e)
        {
            echo 
        $e->getMessage();

        ?
        Nieder mit der Camel Case-Konvention

        Kommentar


        • #5
          Danke erstmal für die Antworten.

          Habe das nun mal mit der Lösung von Griecherus probiert. Wenn ich nun z.B. im Query ne Tabelle angebe, die nicht existiert, dann kommt nun aber immernoch kein Error. Die Seite bleibt einfach weiß.
          Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

          Kommentar


          • #6
            Versuch mal folgendes:
            PHP-Code:

            $pdo 
            = new PDO(); //...

            $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
            Nieder mit der Camel Case-Konvention

            Kommentar


            • #7
              Ah, super, ich danke dir, genau das wars, was ich wollte!

              Und ansonsten ? Noch irgendwelche Tipps für meinen Codeschnippsel ? Ich bin mir z.B. nicht ganz sicher, ob RegEx der beste Weg is um zu checken ob es sich um ein SELECT-Statement handelt. Gibts da evtl. ne bessere Methode, die weniger Rechenintensiv ist ? ( Ist RegEx doch, oder ? ^^ ).

              Findet ihr das so sinnvoll, hab ich da was gravierendes falsch/vergessen, oder hat jemand noch Anregungen, was da noch fehlt, bzw. wie oder womit man dasn och erweitern könnte ?
              Mein aktuelles Projekt: Hausaufgaben Datenbank für kostenlose Hausaufgaben

              Kommentar


              • #8
                Ich persönlich bin immer ziemlich akribisch bei der Benamung. Bei einer Klasse Query würde ich die Methode, welche die Abfrage ausführt, eher execute nennen, das finde ich intuitiver. Aber das ist geschmackssache und nebensächlich.
                PHP-Code:
                $query = new Query();
                $query->execute(); 
                Zur Regex:
                Code:
                ^\s*SELECT\s+
                Ist etwas präziser und gibt dir auch das richtige Ergebnis, sollte der Query-String vorm SELECT Leerzeichen enthalten. Eine bessere Methode als Regex fällt mir spontan nicht ein; ich denke das ist OK so.

                Ansonsten scheint mir deine doQuery-Methode relativ unflexibel in puncto Ergebnismengen. So gehst du ausschließlich von assoziativen Arrays aus. Eventuell könntest du da ja nochmal nach einer eleganteren Lösung suchen.

                Grüße und gute Nacht
                Nieder mit der Camel Case-Konvention

                Kommentar


                • #9
                  PHP-Code:
                  striposltrim$query ), 'select' )===
                  Ist wahrscheinlich um einiges fixer als die Regex!

                  Ich würde das aber eher in zwei Methoden trennen. Also einmal query(), die für Select-Statements da ist, und einmal execute(), für insert, update und delete. Vielleicht sogar noch weiter aufgedröselt:
                  PHP-Code:
                  // Alle Datensätze zurückgeben
                  array selectList$query$params=null )
                  // Ersten Datensatz zurückgeben
                  array select$query$params=null )
                  // Erstes Feld im ersten Datensatz zurückgeben
                  array selectScalar$query$params=null )
                  // Query ausführen und Resultset zurückgeben
                  PDOStatement query$query$params=null )
                  // Insert-Query ausführen und nächste insert-ID zurückgeben
                  mixed insert$query$params=null )
                  // Update-Query ausführen und Anzahl betroffener Datensätze zurückgeben
                  integer update$query$params=null )
                  // Delete-Query ausführen und Anzahl betroffener Datensätze zurückgeben
                  integer delete$query$params=null 
                  Zuletzt geändert von PHP-Desaster; 28.02.2008, 10:27.

                  Kommentar

                  Lädt...
                  X