MB: PDO Attribut Probleme

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->attributsenthalten 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 $resultnur 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

  1. 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.

    1. 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

      1. 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

        --
        Dosen sind silbern
        1. 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

          1. 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.

            1. Das Statement hat einen internen Rückverweis auf das PDO Objekt und holt sich - solange kein eigener Fetch-Mode eingestellt wird - den Default-Fetch-Mode des PDO Objekts.
            2. Das Statement bekommt bei Konstruktion den Default-Fetch-Mode des PDO-Objekts und merkt ihn sich.

            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

            --
            Dosen sind silbern
            1. 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üsselnamen PDO::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.

    2. klappt, Dankleschön nochmals :-)