php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack (1) Themen-Optionen Thema bewerten
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 07-09-2011, 15:25
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 07-09-2011, 15:35
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 07-09-2011, 15:46
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Seh ich auch so.
Mit Zitat antworten
  #4 (permalink)  
Alt 07-09-2011, 15:50
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 07-09-2011, 15:53
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #6 (permalink)  
Alt 07-09-2011, 15:54
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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“.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 07-09-2011, 15:58
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

Okay dann werde ich das im Gesamten nochmal überdenken^^
Aber schonmal besten Dank.
Mit Zitat antworten
  #8 (permalink)  
Alt 08-09-2011, 12:22
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

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

Geändert von mo78 (08-09-2011 um 12:26 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 08-09-2011, 12:26
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Und wo ist jetzt die Problembeschreibung? Du schreibst, was du gerne machen würdest, aber nicht, was du wirklich machst.
Mit Zitat antworten
  #10 (permalink)  
Alt 08-09-2011, 12:27
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (08-09-2011 um 12:32 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 08-09-2011, 13:10
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

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
Zitat:
Fatal error: Call to undefined method PDO::execute() in

mfg
Mit Zitat antworten
  #12 (permalink)  
Alt 08-09-2011, 13:42
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

PDO hat auch keine execute() Methode. Dafür brauchst du das Statement.
Mit Zitat antworten
  #13 (permalink)  
Alt 08-09-2011, 13:42
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

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.
Mit Zitat antworten
  #14 (permalink)  
Alt 08-09-2011, 13:55
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

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

mfg

mo
Mit Zitat antworten
  #15 (permalink)  
Alt 08-09-2011, 15:44
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/102152-fragen-zu-pdo-klasse.html
Erstellt von For Type Datum
MyVideo News - RSS Feed URL - Blog RSS Feed This thread Refback 07-09-2011 17:38

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Fragen zu Template Klasse Enerkin PHP Developer Forum 21 03-02-2007 13:56
ein paar Fragen zu einer Gallery-Klasse jmc BRAINSTORMING PHP/SQL/HTML/JS/CSS 8 17-08-2006 11:10
CMS für die Website…Fragen über Fragen LaK Apps und PHP Script Gesuche 5 10-07-2006 22:09
CHMOD, Fragen¨über Fragen Phish PHP Developer Forum 49 19-11-2003 14:05
Fragen über Fragen (4FAQ) Benny-one IT-Security 2 29-06-2003 00:08

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:57 Uhr.