Fragen zu PDO Klasse

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

  • Fragen zu PDO Klasse

    Hallo ich bastel mir gerade eine kleine PDO klasse zusammen wozu ich mal ein paar fragen hätte.

    Hier mal die Klasse
    PHP-Code:
        private static $db;

        private function 
    getInstance()
        {
            if(!
    self::$db)
            {
                try{
                    
    self::$db = new PDO('mysql:host='.MySQLconfig::DB_HOST.';
                                             dbname='
    .MySQLconfig::DB_DATABASE,
                                                      
    MySQLconfig::DB_USER,
                                                      
    MySQLconfig::DB_PASSWORD,
                                                     array(
    PDO::ATTR_PERSISTENT => true,
                                                           
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
                                                           
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
                }catch (
    PDOException $e) {
                    echo 
    "Error!: " $e->getMessage() . "<br/>";
                       die();
                }
            }
            return 
    self::$db;
        }

        
    //Einen Datensatz auslesen
        
    public static function getRow($para$sql)
        {
             
    $stmt self::getInstance()->prepare($sql);
             
    $stmt->execute($para);
             
    $row $stmt->fetch();
             
    $stmt NULL;
             return 
    $row;
        }
        
    //Mehrere Datensätze auslesen
        
    public static function getRows($para$sql)
        {
             
    $stmt self::getInstance()->prepare($sql);
             
    $stmt->execute($para);
             
    $rows $stmt->fetchAll();
             
    $stmt NULL;
             return 
    $rows;
        }

        
    //datensatz einfügen
        
    public static function insert($para$sql)
        {

             
    $stmt self::getInstance()->prepare($sql);
             
    $query $stmt->execute($para);
             
    $lastID self::getInstance()->lastInsertId();

             if(isset(
    $lastId) && $query==TRUE ){
                 
    $back = array('bool'=>TRUE,
                               
    'lastID'=> $lastID);
                            return 
    $back;

             }else
                 
    $back = array('bool'=>FALSE,
                               
    'lastID'=> NULL);
                            return 
    $back;
        }


    So meine fragen wären
    - sollten die PDO methoden aufrufe in getRow(), getRows(), und insert()
    auch mit einer exception versehen werden?

    - und ist es nötig die objekte die mit self::getInstance() erzeugt werden auch wieder zu löschen?

    das wär erstmal so das grundlegende, was ich gern wissen würde, bzw natürlich auch allgemein was man besser machen kann.

    schonmal Danke
    mfg
    mo

  • #2
    Hallo,

    ich versteh den Sinn der Klasse nicht. Erstens mal sieht es nach Singleton aus. Warum? Was soll dir das bringen, außer, dass du es später schwer hast, den Code wiederzuverwenden und zu erweitern? Zweitens ist es komplett unsinnig, ein Singleton dann doch wieder über statische Methoden anzusprechen. Drittens sehe ich in der Klasse noch keine nennenswerten Vorzüge gegenüber der direkten Verwendung von PDO. Um eine Verbindung mit ganz bestimmten Zugangsdaten aufzubauen, hätte man auch von PDO ableiten und den Konstruktor überladen können, was aber eigentlich auch nicht sein muss:

    PHP-Code:
    $db = new PDO(DB_DSNDB_USERDB_PASSDB_OPTIONS); 
    würde ja auch reichen, zumal man dann auch eine sichtbare Abhängigkeit zu den Konstanten hat.

    Meine Meinung: du rennst damit in die falsche Richtung.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Seh ich auch so.

      Kommentar


      • #4
        Hmm mein gedanke ist/war^^ das andere Klassen von dieser Erben und ich dann nur in der kindklasse $para und $sql definieren und übergeben muss.
        Naja und statisch habe ich sie declariert um sie auch außerhalb der kindklassen zu nutzen.

        Kommentar


        • #5
          Zitat von mo78 Beitrag anzeigen
          Hmm mein gedanke ist/war^^ das andere Klassen von dieser Erben
          Ganz schlechte Idee. Eine Vererbung sollte mit "ist ein" ersetzbar sein.

          Auto extends Fahrzeug => Auto ist ein Fahrzeug

          Kommentar


          • #6
            Naja, Vererbung kannst du bei Singletons sowieso vergessen. Ab PHP 5.3 mit late static binding ist es zwar prinzipiell fast machbar, aber trotzdem ein bisschen wie „Haustür zunageln und Willkommen-Fußmatte vor's Dachfenster legen“.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Okay dann werde ich das im Gesamten nochmal überdenken^^
              Aber schonmal besten Dank.

              Kommentar


              • #8
                So habe mir mal einen anderen ansatz überlegt. Mit der MyDB klasse will ich nur ein neues PDO objekt erzeugen was ich dann anderen klassen über den constructor mitgeben kann. Nur funzt das leider auch nicht so ganz.

                Die MyDB klasse sieht jetzt so aus
                PHP-Code:
                require_once('MySQLconfig.php');
                class 
                MyDB{

                    protected 
                $db NULL;

                    public function 
                __construct()
                    {
                        return 
                $this->newPDO();
                    }

                     protected function 
                newPDO()
                     {
                        if(!
                $this->db)
                        {
                            try{
                                
                $this->db = new PDO('mysql:host='.MySQLconfig::DB_HOST.';
                                                         dbname='
                .MySQLconfig::DB_DATABASE,
                                                                  
                MySQLconfig::DB_USER,
                                                                  
                MySQLconfig::DB_PASSWORD,
                                                                 array(
                PDO::ATTR_PERSISTENT => true,
                                                                       
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
                                                                       
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
                            }catch (
                PDOException $e) {
                                echo 
                "Error!: " $e->getMessage() . "<br/>";
                                   die();
                            }
                        }
                        return 
                $this->db;
                     }

                Nur iwie bekomme ich mit new MyDB kein objekt geliefert???

                Mein anliegen ist halt ein PDO objekt in anderen klassen zu nutzen ohne in jeder klasse eins instanzieren zu müssen. Stelle mir das so in etwa vor
                PHP-Code:
                $pdo = new MyDB();
                $obj = new Test($pdo);

                //oder direkte verwendung im script wie

                $pdo->prepare($sql);
                ...
                etc..  

                //und das übergeben in der anderen klasse hatte ich dann so vor
                class Test {

                protected 
                $pdo null
                    
                    public function 
                __construct($objPDO)
                    {
                        
                $this->pdo $objPDO;
                    }

                  public function 
                insert($sql)
                  {
                     
                $this->pdo->prepare($sql);
                     ......
                etc.....
                  }


                Und mal so allgemein wie ist dieser ansatz bzw was wäre denn noch ein besserer weg?

                mfg
                mo
                Zuletzt geändert von mo78; 08.09.2011, 11:26.

                Kommentar


                • #9
                  Und wo ist jetzt die Problembeschreibung? Du schreibst, was du gerne machen würdest, aber nicht, was du wirklich machst.

                  Kommentar


                  • #10
                    Im Konstruktor kann man nicht mit return arbeiten. Entweder speicherst du eine Instanz von PDO als Instanzvariable von MyDB (Delegationsprinzip) oder du folgst der Logik, dass jedes MyDB-Objekt ein spezielles PDO-Objekt ist (Vererbungsprinzip). Bei der Vererbung rufst du den Elternkonstruktor auf. Siehe dazu PHP: Konstruktoren und Destruktoren - Manual und PHP: Objekt-Vererbung - Manual

                    Du solltest dich aber insgesamt erstmal ausführlich mit den OOP-Grundlagen vertraut machen.

                    Edit zu deinem Edit: Das was du machen willst, wird häufig über Dependency Injection erledigt, falls du dich zu diesem Thema informieren willst. Um die entsprechenden Objekte halbwegs automatisch durch die Hierarchie durchzureichen, bietet sich die Verwendung einer Container-Klasse wie PicoContainer an.
                    Zuletzt geändert von AmicaNoctis; 08.09.2011, 11:32.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Hm also mein problem ist das ich von der MyDB klasse kein objekt iwie geliefert wird. So sieht das ganze jetzt mal aus

                      PHP-Code:
                      require_once('MySQLconfig.php');
                      class 
                      MyDB{

                           public 
                      $db NULL;

                           public function 
                      newPDO()
                           {
                              if(!
                      $this->db)
                              {
                                  try{
                                      
                      $this->db = new PDO('mysql:host='.MySQLconfig::DB_HOST.';
                                                               dbname='
                      .MySQLconfig::DB_DATABASE,
                                                                        
                      MySQLconfig::DB_USER,
                                                                        
                      MySQLconfig::DB_PASSWORD,
                                                                       array(
                      PDO::ATTR_PERSISTENT => true,
                                                                             
                      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
                                                                             
                      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));
                                  }catch (
                      PDOException $e) {
                                      echo 
                      "Error!: " $e->getMessage() . "<br/>";
                                         die();
                                  }
                              }
                              return 
                      $this->db;
                          }
                      }

                      $obj = new MyDB();
                      $pdo $obj->newPDO();

                      $pdo->prepare("SELECT * FROM table");
                      $pdo->execute(); 
                      Beim execute() kommt jetzt immer diese Fehlermeldung
                      Fatal error: Call to undefined method PDO::execute() in

                      mfg

                      Kommentar


                      • #12
                        PDO hat auch keine execute() Methode. Dafür brauchst du das Statement.

                        Kommentar


                        • #13
                          du musst PDO auch richtig benutzen.

                          PDO hat keine funktion "execute". PDOStatement hat die.
                          This is what happens when an unstoppable force meets an immovable object.

                          Kommentar


                          • #14
                            jep habe ich schon rausbekommen. Naja werde mich erstmal weiter durch die PDO doku lesen.

                            mfg

                            mo

                            Kommentar


                            • #15
                              So iwie verstehe ich hier eine sache nicht ganz

                              Ich habe folgende abfrage
                              PHP-Code:
                              $obj = new MyDB();
                                
                              $pdo $obj->newPDO();
                                
                              $para = array(':id'=>$_POST['id']);
                                
                              $sql = ("SELECT eintrag FROM table WHERE id=:id");
                                
                              $stmt $pdo->prepare($sql);
                                
                              $check $stmt->execute($para);
                                echo 
                              var_dump($check); 
                              Die Tabelle eintrag ist komplett leer.

                              Was mich jetzt iwie verwirrt ist das var_dumb mir true ausspuckt.
                              Sollte execute mir nicht ein False zurückgeben ???

                              mfg
                              mo

                              Kommentar

                              Lädt...
                              X