| 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! Post your PHP questions here! |
 |
|

07-09-2011, 14:25
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
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
|

07-09-2011, 14:35
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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_DSN, DB_USER, DB_PASS, DB_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! 
|

07-09-2011, 14:46
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Seh ich auch so.
|

07-09-2011, 14:50
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
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.
|

07-09-2011, 14:53
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von mo78
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
|

07-09-2011, 14:54
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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! 
|

07-09-2011, 14:58
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
Okay dann werde ich das im Gesamten nochmal überdenken^^
Aber schonmal besten Dank.
|

08-09-2011, 11:22
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
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 11:26 Uhr)
|

08-09-2011, 11:26
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Und wo ist jetzt die Problembeschreibung? Du schreibst, was du gerne machen würdest, aber nicht, was du wirklich machst.
|

08-09-2011, 11:27
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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 11:32 Uhr)
|

08-09-2011, 12:10
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
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
|

08-09-2011, 12:42
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
PDO hat auch keine execute() Methode. Dafür brauchst du das Statement.
|

08-09-2011, 12:42
|
 |
ApoY2k
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 290
|
|
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.
|

08-09-2011, 12:55
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
jep habe ich schon rausbekommen. Naja werde mich erstmal weiter durch die PDO doku lesen.
mfg

mo
|

08-09-2011, 14:44
|
|
mo78
Registrierter Benutzer
|
|
Registriert seit: Sep 2010
Beiträge: 88
|
|
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
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|