Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySql Abfrage & Array in Templateengine

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] MySql Abfrage & Array in Templateengine

    Hallo zusammen,

    ich steh seit ein paar Wochen total auf dem Schlauch und komme nicht weiter.

    Ich habe im Internet eine Templateklasse gefunden mit der man u.a. Arryas im Template darstellen kann.

    Jetzt möchte ich das Array mit Daten aus einer Datenbank füllen. Daran scheitere ich. Mein PHP-Template Datei sieht folgendermasen aus:

    PHP-Code:
    <?php


    include("class.Template.php");

    // da steht die datenbankanbindung drin
    include("config.php");

    $Template = new CTpl();

    //jetzt weisen wir einiege Variablen zu:

    $Template->titel "Hallo Welt!";
    $Template->inhalt = array("Willkommen auf meiner Seite!""Wie geht es dir?""Mir geht es gut!");
    $Template->zahl 12345;

    //jetzt laden wir das entsprechende Template und lassen es ausgeben
    $Template->display("test.tpl");

    //und beenden die Klasseninstanz
    $Template->close();
    ?>
    Soweit, so gut. Hier ist ein normales Array welches normal auf der Website ausgegeben wird, anbei die test.tpl:

    Code:
    <html>
    <head>
        <title><?=$this->titel?></title>
    </head>
    <body>
        <?foreach($this->inhalt as $text):?>
            <?=$text?><br/>
        <?endforeach;?>
    
        <?=$this->zahl?>
    </body>
    </html>
    Soweit sieht die Seite auch so aus, wie sie sollte.

    Nun kommen wir zur Abfrage. Ich habe es bereits mit folgendem Code versucht:

    PHP-Code:
    Datenbankabfrage Navigation
    $dbabfrage2 
    mysql_query("SELECT * FROM navi");
    while(
    $result2 mysql_fetch_array($dbabfrage2))
    {
    $Template->inhalt $result2[name_navi];

    Bekomme dann aber folgenden Fehler:
    Warning: Invalid argument supplied for foreach() in C:\public\xampp\htdocs\pxcms\2\test.tpl on line 6

    In Zeile 6 steht:
    Code:
    <?foreach($this->inhalt as $text):?>
    So sieht die Templateklasse aus:


    PHP-Code:
    <?php
    class CTpl {

        var 
    $data//Variablensammlung
        
    var $isClosed;


        function 
    CTpl(){
            
    $this->date = array();
            
    $this->isClosed false;
        }

        function 
    __set($key$value){
            if(
    $this->isClosed){
                    throw new 
    Exception('Template already closed.');
            }
            
    $this->data[$key] = $value;
        }

        function 
    __get($key){
            if(!isset(
    $this->data[$key])){
                throw new 
    Exception("$key isn't set!");
            }
            return 
    $this->data[$key];
        }

        function 
    display($template){
            require(
    $template);
        }

        function 
    displayV($template){
            
    ob_start();
                require(
    $template);
                
    $templateV ob_get_contents();
            
    ob_end_clean();

            return 
    $templateV;
        }

        function 
    close(){
            
    $this->data "";
            
    $this->isClosed true;
        }
    }
    ?>

    Was läuft da falsch?

    Viele Grüße
    hossi

  • #2
    mach mal aus zeile 6
    PHP-Code:
    <?foreach($this->inhalt as $text):?>
    ein
    PHP-Code:
    <? var_dump($this->inhalt); foreach($this->inhalt as $text):?>
    wahrscheinlich gibt dass dann "bool false" aus und dass heisst dass du keine ergebnisse in der db gefunden hast. Deswegen vor einer foreach immer prüfen ob das was du reinschmeisst auch wirklich ein array oder objekt ist is_array(), is_object().

    Kommentar


    • #3
      Zitat von Squall Beitrag anzeigen
      mach mal aus zeile 6
      PHP-Code:
      <?foreach($this->inhalt as $text):?>
      ein
      PHP-Code:
      <? var_dump($this->inhalt); foreach($this->inhalt as $text):?>
      wahrscheinlich gibt dass dann "bool false" aus und dass heisst dass du keine ergebnisse in der db gefunden hast. Deswegen vor einer foreach immer prüfen ob das was du reinschmeisst auch wirklich ein array oder objekt ist is_array(), is_object().
      Hi,

      als Ausgabe erhalte ich nun:
      string(7) "Seite 2"
      zusammen mit dem identischen Fehler
      Warning: Invalid argument supplied for foreach() in C:\public\xampp\htdocs\pxcms\2\test.tpl on line 6

      Ich habe natürlich für die Testzwecke zwei Datensätze in der Datenbank angelegt, diese ist also nicht leer.

      Wofür das string(7) wohl steht? Seltsamerweise gibt er nun auch nur den _letzten_ Datensatz aus der DB aus ("Seite 2") und das in Anführungsstrichen (steht in der DB ohne den beiden "")?

      Bin für Hilfe sehr dankbar.

      Greetz
      hossi

      Kommentar


      • #4
        Zitat von hossi86 Beitrag anzeigen
        Was läuft da falsch?
        Du übergibst dem template kein Array.

        PHP-Code:
        $Rows = array();

        while(
        $result2 mysql_fetch_array($dbabfrage2))
        {
            
        $Rows[] = $result2['name_navi'];
        }

        $Template->inhalt $Rows

        Kommentar


        • #5
          Hallo nochmal,

          besten Dank schon mal an euch beide!

          Der Fehler ist weg, ich hab die Abfrage wie folgt ergänzt:

          PHP-Code:
          $Rows = array(); 
          $dbabfrage2 mysql_query("SELECT * FROM navi");
          while(
          $result2 mysql_fetch_array($dbabfrage2))
          {
              
          $Rows[] = $result2['name_navi'];
          }

          $Template->inhalt $Rows
          Als Ausgabe erhalte ich nun:

          array(2) { [0]=> string(4) "Home" [1]=> string(7) "Seite 2" } Home
          Seite 2

          Wobei Home die ID1 in der DB besitzt und Seite 2 eben die ID2.

          Vielleicht könntet ihr mir noch einen Tipp geben, wie ich das ganze nun "formatiert" ohne die ganzen "array(2) { [0]=> string(4) "Home" [1]=> string(7) "Seite 2" }" ausgeben kann?

          Muss sowas in der PHP-Datei formatiert werden oder in der tpl.Datei?

          Greetz
          hossi

          Kommentar


          • #6
            Formatieren? Du meinst sicherlich eine normale Ausgabe, korrekt? Dann ist foreach schon gar nicht schlecht.

            Wolf29

            Kommentar


            • #7
              Nimm das var_dump($this->inhalt); aus dem Template wieder raus, du Horn!

              Kommentar


              • #8
                Ja Waaahnsinn!

                Es klappt so wie ichs brauche! Vielen herzlichen dank an euch!

                Hätte ich mir nicht träumen lassen das das noch zum laufen kommt!

                Greetz
                hossi

                Kommentar


                • #9
                  Dann bitte den Thread als "erledigt" markieren.

                  Kommentar


                  • #10
                    Eine Sache noch

                    Hallo nochmal

                    habe den Thread nochmal auf "ungelöst" gesetzt, da ein erneutes Problem aufgetreten ist, welches mit der vorherigen Sache zusammenhängt.

                    Meine Ausgabe sieht nun wie folgt aus:
                    (Ausgangspunkt ist eine Tabelle mit zwei Spalten mit momentan zwei Datensätzen ID 1 und 2)

                    Code:
                    id    name_navi     link_navi
                    1     Home           1
                    2     Seite 2         2
                    Ausgabe im Browser:
                    Code:
                    Home 1 Seite 2 2
                    Jetzt habe ich aber das Problem, dass meine die Navigation ja mal "anklickbar" sein sollte um über die einzelnben Seiten zu navigieren.

                    Das funktioniert aber nicht, da das Template wie folgt aussieht:
                    Code:
                    <? foreach($this->navi as $text):?> <?=$text?> <?endforeach;?>
                    Es müsste also so sein, dass der Name und der Link _zwei extra_ Variablen in der tpl-Datei sind zB.

                    $this->name_navi & $this->link_navi

                    damit ich letztendlich den link so
                    <a href="$this->link_navi">$this->name_navi</a>
                    aufabauen kann.

                    Liege ich richtig, wenn ich dem array (Zeile 2) in meiner Abfrage

                    PHP-Code:
                    // Datenbankabfrage Navigation
                    $Rows = array(); 
                    $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                    while(
                    $result2 mysql_fetch_array($dbabfrage2))
                    {
                        
                    $Rows[] = $result2['name_navi'];
                        
                    $Rows[] = $result2['link_navi'];

                    noch ein paar optionen eintrichtern muss, oder bin ich auf dem Holzweg?

                    Danke.

                    Greetz
                    hossi

                    Kommentar


                    • #11
                      Ja du bist auf dem richtigen Weg. So sollte es funktionieren

                      Kommentar


                      • #12
                        Zitat von hossi86 Beitrag anzeigen
                        PHP-Code:
                        // Datenbankabfrage Navigation
                        $Rows = array(); 
                        $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                        while(
                        $result2 mysql_fetch_array($dbabfrage2))
                        {
                            
                        $Rows[] = $result2['name_navi'];
                            
                        $Rows[] = $result2['link_navi'];

                        Hier teilst du den EINEN Datensatz ($result2) auf ZWEI Felder im Ergebnisarray $Rows auf. Die eckigen Klammern sorgen dafür, das ein neuer Eintrag im Array erzeugt wird. Lass dir einfach mal $Rows per var_dump ausgeben, dann siehst du, was ich meine...

                        Besser wäre:
                        PHP-Code:
                        $Rows = array(); 
                        $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                        while(
                        $result2 mysql_fetch_array($dbabfrage2))
                        {
                            
                        $Rows[] = $result2// kompletten Datensatz im Array ablegen

                        So kopierst du den gesamten Datensatz in das Ergebnisarray. Zugriff auf die Elemente dann mit
                        PHP-Code:
                        foreach($Rows as $row) {
                            echo 
                        $row['name_navi'];
                            echo 
                        $row['link_navi'];

                        Kommentar


                        • #13
                          Zitat von lstegelitz Beitrag anzeigen
                          Hier teilst du den EINEN Datensatz ($result2) auf ZWEI Felder im Ergebnisarray $Rows auf. Die eckigen Klammern sorgen dafür, das ein neuer Eintrag im Array erzeugt wird. Lass dir einfach mal $Rows per var_dump ausgeben, dann siehst du, was ich meine...

                          Besser wäre:
                          PHP-Code:
                          $Rows = array(); 
                          $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                          while(
                          $result2 mysql_fetch_array($dbabfrage2))
                          {
                              
                          $Rows[] = $result2// kompletten Datensatz im Array ablegen

                          So kopierst du den gesamten Datensatz in das Ergebnisarray. Zugriff auf die Elemente dann mit
                          PHP-Code:
                          foreach($Rows as $row) {
                              echo 
                          $row['name_navi'];
                              echo 
                          $row['link_navi'];

                          Ok, die logik verstehe ich. Aber mein Problem ist, dass ich in meiner index.php kein echo ausgeben kann / darf, da es mir den Wert sonst irgendwo ins Template schreibt.

                          Ich habs jetzt mal so versucht:
                          PHP-Code:
                          // Datenbankabfrage Navigation
                          $Rows = array(); 
                          $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                          while(
                          $result2 mysql_fetch_array($dbabfrage2))
                          {
                              
                          $Rows[] = $result2// kompletten Datensatz im Array ablegen
                          }  
                          foreach(
                          $Rows as $row) {
                              
                          $Template->name_navi $row['name_navi'];
                              
                          $Template->link_navi $row['link_navi'];


                          //übergabe an die tpl.Datei
                          $Template->name_navi $row;
                          $Template->link_navi $row
                          Leider kann ich das nicht recht testen, da ich jetzt nicht verstehe, wie das Foreach in der Tpl.-Datei aussehen sollte, ich habs mal so versucht:

                          Code:
                          <? foreach($this->name_navi as $name) , ($this->link_navi as $link):?><?=$name?><?=$link?><?endforeach;?>
                          Bekomme aber leider folgenden Fehler:

                          Parse error: syntax error, unexpected ',' in C:\public\xampp\htdocs\pxcms\2\design\design1.php on line 7

                          Bin jetzt etwas ratlos.

                          Greetz
                          hossi

                          Kommentar


                          • #14
                            Du solltest dem Template das ganze array geben und dort dann die foreach schleife machen, so könnte das aussehen:

                            PHP-Code:
                            $Rows = array(); 
                            $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                            while(
                            $result2 mysql_fetch_array($dbabfrage2))
                            {
                                
                            $Rows[] = $result2// kompletten Datensatz im Array ablegen
                            }  
                            foreach(
                            $Rows as $row) {
                                
                            $Template->name_navi $row['name_navi'];
                                
                            $Template->link_navi $row['link_navi'];


                            //übergabe an die tpl.Datei
                            $Template->navi $Rows
                            und in der .tpl datei

                            PHP-Code:
                            <? foreach($this->navi as $row):?>
                            <a href="<?=$row['link_navi']?>"><?=$row['name_navi']?></a>
                            <?endforeach;?>

                            Kommentar


                            • #15
                              Zitat von SnowTiger Beitrag anzeigen
                              Du solltest dem Template das ganze array geben und dort dann die foreach schleife machen, so könnte das aussehen:

                              PHP-Code:
                              $Rows = array(); 
                              $dbabfrage2 mysql_query("SELECT * FROM navi ORDER BY id");
                              while(
                              $result2 mysql_fetch_array($dbabfrage2))
                              {
                                  
                              $Rows[] = $result2// kompletten Datensatz im Array ablegen
                              }  
                              foreach(
                              $Rows as $row) {
                                  
                              $Template->name_navi $row['name_navi'];
                                  
                              $Template->link_navi $row['link_navi'];


                              //übergabe an die tpl.Datei
                              $Template->navi $Rows
                              und in der .tpl datei

                              PHP-Code:
                              <? foreach($this->navi as $row):?>
                              <a href="<?=$row['link_navi']?>"><?=$row['name_navi']?></a>
                              <?endforeach;?>
                              Wundervoll, es klappt besten Dank

                              Kommentar

                              Lädt...
                              X