PDO::FETCH_INTO Probleme

Hallo zusammen!

Ich benutze für meine Datenbankanbindung die PDO Erweiterung von php,
hatte bisher auch keine Probleme. Mit dem PDO::FETCH_INTO fetchmode
hat das jedoch ein Ende.

Das grundsätzliche Problem: Ich will Felder eines Objektes aus der
Datenbank zuweisen, und zwar möglichst direkt, ohne zwanzig Zeilen
$this->bla = $result['bla'];
Da ich mit get/set Methoden arbeiten möchte, sind die Felder protected.

Nun kann ich aus einer anderen Klasse, B, mittels FETCH::CLASS direkt
ein neues Objekt einer Klasse A erstellen, bei dem die protected (!)
Felder von A mit den Werten aus der Datenbank gefüllt werden.

Wenn ich nun aber aus einem bereits existierenden Objekt A die eigenen
Felder aus der Datenbank lesen will, geht FETCH_CLASS nicht mehr. Also
habe ich FETCH_INTO auf $this angweandt.
Das hat jedoch einen Fehler produziert:
Fatal error: Cannot access protected property A::$id in
D:\www\htdocs\test.php on line xx

Nun habe ich zwei Fragen:
1) Gibt es einen Grund, wieso ich aus einer völlig unabhängigen Klasse
per FETCH_CLASS auf protected-felder zugreifen, aber mit FETCH_INTO
nicht auf die protected-felder der eigenen Klasse? Mir kommt das
irgendwie unlogisch vor...
2) Gibt's eine andere Möglichkeit, Felder, die protected sind direkt aus
der Datenbank zuzuweisen?

Ich hab mich schon krumm gesucht, und wär' für nen hilfreichen Tipp
wirklich dankbar.

Grüße
Dominik

Hier gibt's noch einen "kleinen" Testcase.


<?php

class A {
private $db;
protected $name;
protected $id;

function __construct($db,$initialize=false){
$this->db = $db;
if($initialize) {
$this->get_values();
}
}

function get_values() {
$query = 'SELECT id,name FROM test WHERE id=1';
$stmt = $this->db->query($query);
$stmt->setFetchMode(PDO :: FETCH_INTO, $this);
$stmt->fetch(); // Hier tritt der fatal error auf
$stmt->closeCursor();
}
}

class B {
private $db;
function __construct($db){
$this->db = $db;
}

function access_a() {
$query = 'SELECT id,name FROM test WHERE id=1';
$stmt = $this->db->query($query);
$stmt->setFetchMode(PDO :: FETCH_CLASS, 'A',array($db));
$item = $stmt->fetch();
$stmt->closeCursor();
return $item;
}
}

$db = new PDO('mysql:host=localhost;dbname=bi_neu', 'user', 'pass');

// Funktioniert
$b = new B(&$db);
$item = $b->access_a();
print_r($item);

// Funktioniert nicht
$a = new A(&$db,true);
print_r($a);
?>
Dominik Welland [ Fr, 17 August 2007 12:24 ] [ ID #1798069 ]

Re: PDO::FETCH_INTO Probleme

Warum nimmst Du nicht die schon fertige Klasse Db.php aus dem
Zend-Framework?

Warum soll man sich das Hirn über Probleme zermartern und seine Zeit damit
verschwenden, Lösungen zu suchen, die es längst (kostenlos) gibt?

Martin
Martin Lemke [ So, 19 August 2007 02:13 ] [ ID #1799123 ]

Re: PDO::FETCH_INTO Probleme

Hi Martin

Martin Lemke wrote:
> Warum nimmst Du nicht die schon fertige Klasse Db.php aus dem
> Zend-Framework?

Erstmal Danke für Deine Antwort.
PDO hab' ich aus zwei Gründen gewählt: Erstens ist es eine Erweiterung,
die ich fast überall voraussetzen kann, und kein eigenes Framework.
Zweitens ist PDO in C geschrieben und kompiliert, das ganze ist imho
schlanker, flexibler, und vermutlich schneller.

Ich hab' in der API Doku vom Zend Framework jetzt auch nicht wirklich
eine Möglichkeit gefunden mit der ich mein Vorhaben umsetzen könnte...
Die Funktionalität von Zend_Db::FETCH_OBJ hab ich mittels PDO::FETCH_OBJ
auch.
Wenn ich was übersehen habe, bin ich für 'nen Tipp dankbar, und lasse
mich auch gern vom ZF überzeugen :)

Grüße
Dominik
Dominik Welland [ So, 19 August 2007 10:31 ] [ ID #1799129 ]

Re: PDO::FETCH_INTO Probleme

Dominik Welland schrieb:

> Zweitens ist PDO in C geschrieben und kompiliert, das ganze ist imho
> schlanker, flexibler, und vermutlich schneller.

Falls es nicht klar war: Die Db-Klasse des Zendfamework unterstützt PDO.

> Ich hab' in der API Doku vom Zend Framework jetzt auch nicht wirklich
> eine Möglichkeit gefunden mit der ich mein Vorhaben umsetzen könnte...

Soweit kenne ich mich damit auch noch nicht aus. Es sah nur so aus, als
wolltest Du eine DB-Klasse für den Zugriff auf PDO schreiben. Da wäre es
vielleicht sinnvoller, die Zendklasse zu erweitern anstatt bei null
anzufangen.

Martin
Martin Lemke [ So, 19 August 2007 11:58 ] [ ID #1799132 ]

Re: PDO::FETCH_INTO Probleme

Hi Martin.

Martin Lemke wrote:
> Soweit kenne ich mich damit auch noch nicht aus. Es sah nur so aus, als
> wolltest Du eine DB-Klasse für den Zugriff auf PDO schreiben.

Nein, das ist nicht mein Ziel. Ich bin mit PDO eigentlich glücklich, so
wie es ist. Ich suche nur eine Möglichkeit, protected Attribute eines
bereits instantiierten Objektes aus der Datenbank direkt zu initialisieren.

Dabei fiel mir halt auf, dass PDO den Zugriff auf protected Felder per
FETCH_CLASS sogar aus fremden Klassen erlaubt, bei FETCH_INTO aber
selbst aus der eigenen Klasse ablehnt, was mir seltsam vorkommt.

Grüße
Dominik
Dominik Welland [ So, 19 August 2007 13:22 ] [ ID #1799138 ]

Re: PDO::FETCH_INTO Probleme

Dominik Welland wrote:

> Nein, das ist nicht mein Ziel. Ich bin mit PDO eigentlich glücklich, so
> wie es ist. Ich suche nur eine Möglichkeit, protected Attribute eines
> bereits instantiierten Objektes aus der Datenbank direkt zu initialisieren.
>
> Dabei fiel mir halt auf, dass PDO den Zugriff auf protected Felder per
> FETCH_CLASS sogar aus fremden Klassen erlaubt

Evtl. Wird hier sowas wie PHPs Replection genutzt. (Mußte halt mal in
den Sourcen von PHP suchen)

> bei FETCH_INTO aber
> selbst aus der eigenen Klasse ablehnt, was mir seltsam vorkommt.

Keine Ahnung derartiges hab ich bisher noch nicht gebraucht.
Wenn ich sowas in die Richtung vorhab nutze ich ein eigenes Tool das mir
ne Klasse incl Abfragecode, passend zur Tabelle generiert.

Haste schonmal auf bugs.php.net gesucht ob dazu evtl. ein bug
registriert ist? Wenn nicht würde ich an Deiner Stelle mal einen
Bugrequest dort machen. Entweder es wird als bug anerkannt oder Du
bekommst ne Erklärung warum das so gewollt ist.

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ So, 19 August 2007 14:05 ] [ ID #1799140 ]

Re: PDO::FETCH_INTO Probleme

Ulf Kadner schrieb:

> Evtl. Wird hier sowas wie PHPs Replection genutzt. (Mußte halt mal in
¯¯¯¯¯¯¯¯¯¯

Was soll das sein?

Gruß. Claus
Claus Reibenstein [ So, 19 August 2007 17:32 ] [ ID #1799146 ]

Re: PDO::FETCH_INTO Probleme

Claus Reibenstein wrote:
> Ulf Kadner schrieb:
>
>> Evtl. Wird hier sowas wie PHPs Replection genutzt. (Mußte halt mal in
> ¯¯¯¯¯¯¯¯¯¯
>
> Was soll das sein?

Mach einfach aus dem p ein f.

MfG, Ulf

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ So, 19 August 2007 17:40 ] [ ID #1799148 ]

Re: PDO::FETCH_INTO Probleme

Hi Ulf

Ulf Kadner wrote:
> Evtl. Wird hier sowas wie PHPs Replection genutzt. (Mußte halt mal in
> den Sourcen von PHP suchen)
Reflection? Seitens PDO? Hm, hab damit noch nicht gearbeitet, werd' aber
mal durch die Doku stöbern.

>> bei FETCH_INTO aber
>> selbst aus der eigenen Klasse ablehnt, was mir seltsam vorkommt.
>
> Keine Ahnung derartiges hab ich bisher noch nicht gebraucht.
> Wenn ich sowas in die Richtung vorhab nutze ich ein eigenes Tool das mir
> ne Klasse incl Abfragecode, passend zur Tabelle generiert.

Ich hab ja auch eine Klasse analog zur Tabelle in der Datenbank, ich
möchte halt ein bereits instantiiertes Objekt mit den Werten füllen
lassen: Dem Konstruktor eine ID übergeben, auf dass dieser seine eigenen
Attribute mit Werten aus der Datenbank initialisiert.
>
> Haste schonmal auf bugs.php.net gesucht ob dazu evtl. ein bug
> registriert ist? Wenn nicht würde ich an Deiner Stelle mal einen
> Bugrequest dort machen. Entweder es wird als bug anerkannt oder Du
> bekommst ne Erklärung warum das so gewollt ist.
>

Es existieren ein paar Bugs zu FETCH_INTO, aber nichts in der Hinsicht.
Danke auf jeden Fall, ich werd' das mal tun... Wird aber vermutlich eher
dahingehend enden, dass FETCH_CLASS auch keinen Zugriff mehr auf
protected Felder erhält... :)
Es muss doch eine Möglichkeit geben, das Prinzip der Kapselung aufrecht
zu erhalten, und trotzdem ohne die manuelle Zuweisung auszukommen?

Grüße
Dominik
Dominik Welland [ So, 19 August 2007 20:24 ] [ ID #1799154 ]
PHP » de.comp.lang.php.misc » PDO::FETCH_INTO Probleme

Vorheriges Thema: Download von mehreren Dateien ermöglichen
Nächstes Thema: CVS gesucht - unkompliziert / dtsch.