Manfred: doppelte Einträge in array

Ich bin am verzweifeln, ich schreibe meine PDO Ausgabe in ein Array

$statement = $pdo->prepare("SELECT * FROM daten WHERE kal=:kal");
$result = $statement->execute(array('kal' => 1));
$ausgabe= $statement->fetch();

Wenn ich dann print_r mache, habe ich die Ergbnisse doppelt drin! Warum? Und vor allem wie bekomme ich sie nur EINMAL rein?

[0] => Array
    (
        [titel] => Ort
        [0] => Ort
        [Inhalt_der_var] => München
        [1] => München
    )

Manfred

  1. Das Verhalten kannst Du einstellen, siehe PDO FETCH_MODE. MFG

    1. Leider finde ich dazu nur Englische Texte, und das kannich leider nicht!

      1. **Danke ** habe eine deutsche Seite zum Thema gefunden

        https://www.peterkropff.de/site/php/pdo_daten_verarbeiten.htm

        jetzt klappt es.

      2. Hallo Manfred,

        dann solltest Du unbedingt Englisch lernen. Ansonsten wirst Du beim Programmieren immer Probleme haben, weil viele Texte nur auf Englisch verfügbar sind.

        Das PHP Handbuch ist Stellen mehrsprachig, aber, ja, im Bereich PDO ist vieles unübersetzt. Wenn Du eine Datenbankanbindung bauen willst, wirst Du beim MYSQL Handbuch ähnliche Schwierigkeiten haben.

        Es gibt auch Browser, die Dir eine automatische Übersetzung von Seiteninhalten anbieten. In Chrome beispielsweise klicke ich mit der rechten Maustaste in die Seite und finde einen Menüpunkt, um den Inhalt auf Deutsch zu übersetzen. Mir ist der Verständlichkeitsnachteil automatischer Übersetzungen schon bewusst, aber es ist es besser als nichts.

        Bücher zum Thema sind so eine Sache. Du kannst Glück haben, aber gerade habe ich bei Amazon einen "Blick ins Buch" in einem 1000-seitigen Wälzer geworfen, aber im Abschnitt PDO war von setFetchMode keine Rede. Das Thema ist zu gewaltig, um es in einem Buch vollständig abzuhandeln.

        Rolf

        --
        sumpsi - posui - clusi
  2. Ich weis nicht, ich habe eine neue Frage, aber die baut auf eine alte auf. Muss ich jetzt einen neuen Beitrag starten oder ihn in den alten schreiben, was ist besser?

    Ich möchte mein Array erweitern

    array_push($ausgabe, "weiteres_feld");
    

    Aber es soll nicht ins erste, sondern ins zweite! Also hierhin:

    [titel] => Ort
    
    [Inhalt_der_var] => München
    
    [weiteres_feld]
    

    aber es ist dort:

    Array
    (
        [0] => Array
            (
                [titel] => Ort
                [Inhalt_der_var] => München
            )
      
        [1] => weiteres_feld
    )
    

    Edit Rolf B: Code mit ~~~ als Code markiert

    1. Hallo Manfred,

      deine Frage passt nicht zu dem Code, den Du eingangs gezeigt hast. Die fetch-Methode liefert Dir ein Array für eine Ergebniszeile der Abfrage.

      $ausgabe= $statement->fetch(PDO::FETCH_ASSOC);
      print_r($ausgabe);
      

      sollte demnach dies hier liefern, ein einfaches Array:

      Array
      (
          [titel] => Ort
          [Inhalt_der_Var] => München
      )
      

      und nicht ein Array im Array, wie Du es in deiner zweiten Frage zeigst:

      Array
      (
          [0] => Array
              (
                  [titel] => Ort
                  [Inhalt_der_Var] => München
              )
      
      )
      

      Das Array im Array bekommst Du von fetchAll geliefert, weil diese Methode nicht nur eine Zeile des Ergebnisses liest, sondern alle.

      D.h. du musst schon wissen, was Du zum Abruf der Daten verwendet hast, musst wissen, in welcher Form das Abrufergebnis dargestellt wird, und dementsprechend programmieren.

      Wenn $ausgabe ein Array im Array ist, wie von fetchAll geliefert, dann musst Du dein weiteres Feld an das innere Array anhängen. Das geht so:

      array_push($ausgabe[0], "weiteres_feld");
      

      Das Ergebnis ist dann

      Array
      (
          [0] => Array
              (
                  [titel] => Ort
                  [Inhalt_der_Var] => München
                  [0] => weiteres_feld
              )
      
      )
      

      Vor "weiteres_feld" steht [0] =>, weil array_push immer numerische Indexe anlegt, und bisher noch kein numerischer Index im inneren Array existiert. Darum beginnt er neu, bei 0.

      Schwieriger wird es, wenn fetchAll mehr als eine Row geliefert hat. Der array_push erweitert nur das Array einer einzigen Row. Willst Du alle Rows erweitern, musst Du eine Schleife über alle Ergebniszeilen laufen lassen.

      Die Grundsatzfrage ist aber: warum willst Du das Ergebnis einer DB-Abfrage erweitern, vor allem auf eine Weise, die nicht zum Stil der übrigen Einträge im Row-Array passt? Du vermengst auf diese Weise DB-Ergebnisse mit Arbeitsdaten, das kann zu ziemlichem Durcheinander führen.

      Rolf

      --
      sumpsi - posui - clusi
      1. Die Grundsatzfrage ist aber: warum willst Du das Ergebnis einer DB-Abfrage erweitern, vor allem auf eine Weise, die nicht zum Stil der übrigen Einträge im Row-Array passt? Du vermengst auf diese Weise DB-Ergebnisse mit Arbeitsdaten, das kann zu ziemlichem Durcheinander führen.

        Auch dafür kann es Gründe geben. Z.B. kann man auf diese Art und Weise einer AJAX-Response einen Block mit Metaangaben hinzufügen der im Callback natürlich wieder entfernt werden muss.

        Metaangaben z.B., Autor, Verfasser, Hersteller, Anzahl der Records, Gesamtpreis, Mehrwertsteuer usw. Bei Warenkörben nicht unüblich.

        MFG