PDO Attribut Probleme
MB
- datenbank
- php
moin Community,
ich habe Probleme beim unstellen von \PDO::FETCH_BOTH
(ich nehme an standard) zu \PDO::FETCH_OBJ
Konstanten in meiner Database
-Klasse.
Es geht wahrscheinlich um die Methode $this->getAttributs()
. In ihr sind alle Konstanten in einer privaten Property Array $this->attributs
enthalten sind, wie \PDO::ERRMODE_SILENT
, \PDO::CASE_LOWER
mit \PDO::FETCH_OBJ
:
Die transmission()
-Methode sorgt für die Erzeugung und trennen der Verbindung, das Landen der Attribut-Konstanten und Verschichten der Prepared Statements und Empfangen des Results.
private function transmission( callable $cargo, string $query, array $params = [] ) {
$this->connect();
$this->getAttribute();
try {
$statement = $this->handler->prepare( $query );
$statement->execute( $params );
$result = $cargo( $statement );
} catch( PDOException $e ) {
/** @ToDo Exception */
}
$this->disconnect();
return $result;
}
Die Methode transmission()
wird von einer der öffentlichen Methoden wie getAll()
aufgerufen.
public function getAll( string $query, array $params = [] ) : array {
return $this->transmission( function( $statement ) {
return $statement->fetchAll();
}, $query, $params );
}
selbst wenn ich in dieser getAll()
-Methode, das Statement, das zuvor das Prepared Statement an die Datenbank geschickt hat, fetchAll()
zusätzlich \PDO::FETCH_OBJ
noitiere, gibt das Statement Objekt als $result
nur Daten in Form von \PDO::FETCH_BOTH
zurück 😕. Ich bin echt Überfragt wo das Problem istr und wie ich es lösen damit vom Standart \PDO::FETCH_BOTH
wieder z.B. \PDO::FETCH_OBJ
wird?.
vlg MB
Tach!
Ich bin echt Überfragt wo das Problem istr und wie ich es lösen damit vom Standart
\PDO::FETCH_BOTH
wieder z.B.\PDO::FETCH_OBJ
wird?.
Ich kann es dir auch nicht beantworten, weil du zwar Code zeigst, der aber nur ein Teil einer Klasse und damit nicht vollständig nachvollziehbar ist. Vor allem fehlt darin die Verwendung der genannten Konstanten. Richtig wäre jedenfalls gemäß PHP-Handbuch
$deinPdoObjekt->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
oder wenn es mit Namespace sein soll
$deinPdoObjekt->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
Zudem gibt es auch noch PDOStatement::setFetchMode().
dedlfix.
Ach, da geht mir ein licht auf! Ich hab die PDO Attribute nur numerisch gelistet. Ich hab nicht dran gedacht dass das assoziativ sein muss. Dankeschön :-).
vlg MB
Hallo MB,
bei setAttribute ja, bei fetchAll() nicht. Aber du hattest ja gesagt, dass es auch bei fetchAll nicht ginge. Darum bin ich still geblieben und habe nur meinen Kopf gekratzt…
Rolf
moin RolfB,
bei der PDO Instanziierung gibt ja options. Erlangt man auch mit PDO::setAttribut()
und fetch Zugriff? Mit Value-Prinzip? Wobei ja mit fetch-Objekte aller Art PDO::ATTR_DEFAULT_FETCH_MODE
der key schon vorgegeben ist oder nich?
vlg MB
Hallo MB,
bei der PDO Instanziierung gibt ja options. Erlangt man auch mit
PDO::setAttribut()
und fetch Zugriff?
Ähh. Wenn Du meinst, dass man die Wahl hat zwischen einer der drei folgenden Möglichkeiten:
$db = new PDO($dsn, $user, $passw, [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ]);
// oder
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
// oder
$stmt->fetch(PDO::FETCH_OBJ);
dann würde ich Dir zustimmen wollen.
Auf dem Statement kannst Du auch noch
$stmt->setFetchMode(PDO::FETCH_OBJ);
aufrufen.
Ich vermute allerdings, dass Du auf die Reihenfolge achten musst. Es gibt ja zwei denkbare Möglichkeiten der PDO-Implementierung, und ich weiß nicht, was implementiert ist.
Wenn Variante 2 implementiert ist, dann ändert sich der Fetchmode im Statement nicht, wenn Du nach Erzeugung des Statements $db->setAttribute() für den Default-Fetch-Mode aufrufst.
Der an fetch/fetchAll übergebene Fetch-Mode sollte aber auf jeden Fall Vorrang vor Statement und PDO haben.
Was Du mit "Value-Prinzip" meinst, verstehe ich nicht. Meine Implementationsvariante 2?
Wobei ja mit fetch-Objekte aller Art
PDO::ATTR_DEFAULT_FETCH_MODE
der key schon vorgegeben ist oder nich?
Wenn Du hiermit meinst, dass man den fetch-Methoden nur den PDO::FETCH_*
Wert geben muss und nicht den Schlüsselnamen PDO::ATTR_DEFAULT_FETCH_MODE
, dann ja.
Rolf
Tach!
Wobei ja mit fetch-Objekte aller Art
PDO::ATTR_DEFAULT_FETCH_MODE
der key schon vorgegeben ist oder nich?Wenn Du hiermit meinst, dass man den fetch-Methoden nur den
PDO::FETCH_*
Wert geben muss und nicht den SchlüsselnamenPDO::ATTR_DEFAULT_FETCH_MODE
, dann ja.
Meine Interpretation davon, was er wissen möchte:
Für die Fetch-Funktion und die setFetchMode()-Methode vom Statement ist keine der anderen Attribute interessant, so dass man nicht erst noch sagen muss, dass man sich auf PDO::ATTR_DEFAULT_FETCH_MODE bezieht. Es ist von den Funktionen so vorgegeben, dass man in diesem Parameter den Fetch-Modus direkt angeben kann und muss und nicht etwa ein Array mit allen möglichen Optionen, die dafür gar nicht relevant sind.
dedlfix.
klappt, Dankleschön nochmals :-)