Nizzan: Template

Hallo,

ich verstehe eines nicht so ganz. Ich wurde gerne was in einem Template ausgeben lassen. Die Abfrage mache ich wie folgt:

PHP-Code:
// Fußzeile auslesen //
$fusszeile_forum = "SELECT
fusszeile_forum

FROM
userdata

WHERE benutzername='$von'";
$return = mysql_query($fusszeile_forum) OR die(mysql_error());
while($_data = mysql_fetch_assoc($return))

dann etwas weiter unten kommt folgendes:

PHP-Code:
$ausgabe = str_replace("{fusszeile_forum}",$_data['fusszeile_forum'],$ausgabe); // Beitrag editieren

So im Template sieht das dann wie folgt aus:
Code:

{fusszeile_forum}

So wenn ich das genau so mache wie ich das oben geschrieben haben, dann passiert einfach gar nichts. Es trägt mir in das Template einfach nichts ein. Ok ich dachte kann auch sein dass in
PHP-Code:
$_data['fusszeile_forum']
nichts drin ist. Aber wenn ich das dann so ausgeben lassen tu:
PHP-Code:
echo $_data['fusszeile_forum'];
dann gibt er mir genau das aus was er eigentlich haben sollte.

Kann mit denn jemand sagen, warum er das nicht im Template so macht?

Gruß

  1. Hello,

    $ausgabe = str_replace("{fusszeile_forum}",$_data['fusszeile_forum'],$ausgabe);

    Ich kann es nicht wirklich explizit im PHP-Manual finden im Moment. Irgenwo steht es bestimmt auch ausführlich. Aber geh mal davon aus, dass es an den geschweiften Klammern liegt. Nimm doch z.B. <fusszeile_forum> dafür. Das kann PHP eichtig interpretieren als Zeichenkette und schneidet nicht die Klammern weg, und der Browser würde es nicht anzeigen, falls es aus Versehen noch durchrutscht. Die Seite wäre damit zwar nicht mehr valides HTML, könnte aber i.d.R. trotzdem angezeigt werden.

    http://de.php.net/types.string

    Und wenn Du statt {bezeichner}  nun  <{bezeichner}>  schreibst, geht es in PHP auch wieder, aber der Browser würde diesen Platzhalter anzeigen. Wo das nun wieder niedergeschrieben ist, weiß ich nicht, aber alle meine Browser tun es.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo und guten morgen Tom,

      das komische ist eben, dss er nur bei der Fusszeile da Probleme macht, denn bei allem anderen, wie z.B.

      • Namen
      • Beiträge
      • usw.

      geht das ohne wenn und aber. Ich kann das einfach nicht verstehen. Aber ich werde das mal so versuchen, wie du mir das geschrieben hast.

      Gruß Nizzan

      1. Hello,

        hast Du denn mal

        $ausgabe = str_replace('{fusszeile_forum}',$_data['fusszeile_forum'],$ausgabe);

        statt

        $ausgabe = str_replace("{fusszeile_forum}",$_data['fusszeile_forum'],$ausgabe);

        ausprobiert?

        Die doppelten Häkchen als String-Eröffner veranlassen PHP zur Ersetzung bestimmter Zeichen.
        Die geschweiften Klammern werden innerhalb der doppelten Häkcken als Begrenzer für den darin enthaltenen Variablennamen angesehen.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello,

          es steht nur implizit in der Erklärung:

          <cite>
          Variablen-Analyse (parsing)
          Wird ein String in doppelten Anführungszeichen oder mit heredoc angegeben, werden enthaltene Variablen ausgewertet (geparst).

          Es gibt zwei Syntax-Typen: eine einfache und eine komplexe. Die einfache Syntax ist die geläufigste und bequemste. Sie bietet die Möglichkeit eine Variable, einen Array-Wert oder eine Objekt-Eigenschaft auszuwerten (parsen).

          Die komplexe Syntax wurde in PHP 4 eingeführt und ist an den geschweiften Klammern {}erkennbar, die den Ausdruck umschließen.

          Einfache Syntax
          Sobald ein Dollarzeichen ($) auftaucht, wird der Parser versuchen, gierig so viele Zeichen wie möglich zu bekommen, um einen gültigen Variablennamen zu bilden. Schließen Sie Ihren Varaiblennamen in geschweifte Klammern ein, wenn Sie ausdrücklich das Ende des Namens angeben wollen.

          <?php
          $beer = 'Heineken';
          echo "$beer's Geschmack ist großartig";  // funktioniert, "'" ist kein gültiges
                                                   // Zeichen für einen Variablennamen
          echo "Er hat einige $beers getrunken";  // funktioniert nicht, 's' ist ein gültiges
                                                   // Zeichen für einen Variablennamen
          echo "Er hat einige ${beer}s getrunken"; // funktioniert
          echo "Er hat einige {$beer}s getrunken"; // funktioniert
          ?>

          </cite>

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
        2. Hallo Tom,

          ok ich habe das nun mal so gemcht, wie du mir das gerade geschrieben hast. Leider zeigt das auch kein Erfolg. Nun bekommst du hier einfach mal ein wenig mehr Code, denn ich finde den Fehler einfach nicht. Kann sein, dass du ja den Felher findest.

          Code:

          // Fußzeile auslesen //
          $fusszeile_forum = "SELECT
          fusszeile_forum

          FROM
          daten_user

          WHERE benutzername='$von'";
          $return = mysql_query($fusszeile_forum) OR die(mysql_error());
          while($_data = mysql_fetch_assoc($return))
          //echo $_data['fusszeile_forum'];

          Dann kommt das hier jetzt mit dem Template:

          $ausgabe = str_replace("{rang}",$benutzer_rang,$ausgabe); // rang ins template einsetzen

          $ausgabe = str_replace("{bild}",$bild,$ausgabe); // rang ins template einsetzen

          $ausgabe = str_replace("(edit)",$edit,$ausgabe); // Beitrag editieren

          $ausgabe = str_replace("{fusszeile_forum}",$_data['fusszeile_forum'],$ausgabe);
              $ausgabe=str_replace("{farbe}",$farbe,$ausgabe);
              $ausgabe=str_replace("{loeschen}",$loeschen,$ausgabe);

          if ($row["del"]!="1")
               {
                echo $ausgabe;
               }
              $zaehler++;
          };

          So das ist eigentlich mal das was eigentlich wichtig währe ich denke der Rest vom Code ist nicht so wichtig.

          Gruß Nizzan

          1. Hello,

            Du holst also aus der Datenbank den Wert wür den User

            $return = mysql_query($fusszeile_forum) OR die(mysql_error());

            Wieviele Datensätze willst Du verarbeiten?
            Voher kommt das Template und wie kommt das in das Script hinein?

            while($_data = mysql_fetch_assoc($return))
            //echo $_data['fusszeile_forum'];

            Warum 'while'?

            Dann kommt das hier jetzt mit dem Template:

            $ausgabe = str_replace("{rang}",$benutzer_rang,$ausgabe); // rang ins template einsetzen

            $ausgabe = str_replace("{bild}",$bild,$ausgabe); // rang ins template einsetzen

            $ausgabe = str_replace("(edit)",$edit,$ausgabe); // Beitrag editieren

            echo $_data['fusszeile_forum'];   ## und mal ein wenig über die Schle8fe nachdenken.

            $ausgabe = str_replace("{fusszeile_forum}",$_data['fusszeile_forum'],$ausgabe);
                $ausgabe=str_replace("{farbe}",$farbe,$ausgabe);
                $ausgabe=str_replace("{loeschen}",$loeschen,$ausgabe);

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
          2. Hallo Nizzan,

            if ($row["del"]!="1")

            wo kommt denn $row her?

            So das ist eigentlich mal das was eigentlich wichtig währe ich denke der Rest vom Code ist nicht so wichtig.

            Gibt es eine Testseite wo man sich das anschauen kann?

            Grüße aus Nürnberg
            Tobias

            1. Hi Tobias,

              if ($row["del"]!="1")
              wo kommt denn $row her?

              Diese ganze Konstruktion kommt mir unsinnig vor - im Grunde genommen läuft das doch darauf hinaus, dass die Daten nur ausgegeben werden, wenn im Feld del in der Datenbank keine 1 steht, da wäre es doch besser, sich auf PHP Seite gar nicht mehr mit den gelöschten Datensätzen aubzugeben und mit dem SQL Query bereits die "gelöschten" Datensätze rauszufiltern.

              Dazu müsste eigentlich nur das WHERE leicht angepasst werden:
              WHERE benutzername = '$von' AND del != '1'

              Dann würde im Nachfolgenden nämlich ein echo $ausgabe ausreichen. Nebenbei noch der Hinweis: Hoffentlich wurde vorher mysql_real_escape_string() o.ä. auf $von angewendet.

              MfG, Dennis.

              --
              Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
              Schon gewusst, dass Bugs und Feature Vorschläge für das CForum ins Entwicklerforum oder in den BugTracker gehören und nicht hier her?
              1. Hallo Dennis,

                was meinst du denn damit? Bzw.was kann pasieren, wenn man das NICHT gemacht hat?

                Nebenbei noch der Hinweis: Hoffentlich wurde vorher mysql_real_escape_string() o.ä. auf $von angewendet.

                MFG,
                Nizzan

                1. Hi Nizzan,

                  Nebenbei noch der Hinweis: Hoffentlich wurde vorher mysql_real_escape_string() o.ä. auf $von angewendet.

                  was meinst du denn damit?

                  Es kommt darauf an, woher deine Variablen $von kommt - wird die per GET, POST oder so übermittelt? Oder wo kommt die her?

                  Bzw.was kann pasieren, wenn man das NICHT gemacht hat?

                  Eventuell kann jemand deine ganze Datenbank löschen bzw. leeren.

                  MfG, Dennis.

                  --
                  Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
                  Schon gewusst, dass Bugs und Feature Vorschläge für das CForum ins Entwicklerforum oder in den BugTracker gehören und nicht hier her?
            2. Hallo,

              Sorry wenn ich jetzt was mache was bestimmt nicht gerne gesehen wird, aber hier mal der ganze Code:

              include("config.php"); // config datei laden.
              error_reporting(E_ALL);

              $ppu = array(); // posts per user

              $threadid = $_GET['threadid']; // threadid aus adressleiste auslesen
              unset($delete);
              if (isset($_GET["delete"]))
              {
                $delete=$_GET["delete"];
              }
              if (isset($delete))
              {
                $posts=mysql_query("select * from simple_posts where postid='$delete'");
                $post=mysql_fetch_assoc($posts);
                if (($post["von"]==$_SESSION["benutzername"]) || ($_SESSION["rights"]=="admin"))
                 {
                  mysql_query("update simple_posts set del='1' where postid='$delete'");
                  //mysql_query("delete from simple_posts where postid='$delete'");
                 }
              }

              $fp = fopen("template_post.html","r");  // teamplate zum lesen(r) &ouml;ffnen
              $template = fread($fp,filesize("template_post.html"));  // inhalt der template datei in die teamplate variable laden.

              $sql = "SELECT * FROM simple_posts  WHERE threadid = '".mysql_escape_string($threadid)."' ORDER BY postid ASC";
                    $result = mysql_query($sql) or die(mysql_error());
                    $zaehler=0;
                    while($row = mysql_fetch_Assoc($result)){
                if ($zaehler==0)
                 {
                  $farbe="#CDCDCD";
                 }
                else
                 {
                  if (round($zaehler/2)>$zaehler/2)
                   {
                    $farbe="#efefef";
                   }
                  else
                   {
                    $farbe="#efefef";
                   }
                 }
                     $von = $row['von'];

              if (!isset($ppu[$von])) {
                    $ppusql = "SELECT COUNT(*) AS anzahl FROM simple\_posts WHERE von='$von'"; //[1]
                    $ppuresult = mysql_query($ppusql) OR die(mysql_error());
                    $ppurow = mysql_fetch_assoc($ppuresult);
                    $ppu[$von] = $ppurow['anzahl']; ;
                 }

              //mysql_query("UPDATE threads SET status = 0 WHERE threadid = ".$threadid);

              $benutzer_rang = "init";
                      if ($von == "Admin")
                        $benutzer_rang = "Mitarbeiter | Admin";
                      else {
                        if ($ppu[$von] <= 50){ // alle Beitr&auml;ge unter und einschlie&szlig;lich 100
                          $benutzer_rang = "Anf&auml;nger";
                        }
                        elseif ($ppu[$von] <= 100){ // alle Beitr&auml;ge unter und einschlie&szlig;lich 500
                          $benutzer_rang = "Fortgeschrittener";
                        }
                  elseif ($ppu[$von] <= 200){ // alle Beitr&auml;ge unter und einschlie&szlig;lich 500
                          $benutzer_rang = "Halbprofi";
                        }
                  elseif ($ppu[$von] <= 300){ // alle Beitr&auml;ge unter und einschlie&szlig;lich 500
                          $benutzer_rang = "Profi";
                        }
                        elseif ($ppu[$von] <= 10000){ // alle Beitr&auml;ge unter und einschlie&szlig;lich 1000
                          $benutzer_rang = "Champion";
                        }
                        else
                          $benutzer_rang = "Super Champion";
                     }

              if (file_exists("profilbilder/forum/". $von.".jpg")) // Das Anzeigebild abrufen
              {
                $bild='<img src="profilbilder/forum/'.$von.'.jpg">';
              }
              else
              {
                $bild='';
              }

              $titel = $row['titel'];  // titel besorgen
                  $von = $row['von'];  // von besorgen
                  $datum = $row['datum']; // datum besorgen
                  $post = $row['post']; // post besorgen

              // Fußzeile auslesen //
              $fusszeile_forum = "SELECT
              fusszeile_forum

              FROM
              daten_user

              WHERE benutzername='$von'";
              $return = mysql_query($fusszeile_forum) OR die(mysql_error());
              while($_data = mysql_fetch_assoc($return))
              //echo $_data['fusszeile_forum'];

              //$edit = "";
                  if (($von==$_SESSION["benutzername"]) || ($_SESSION["rights"]=="admin"))
                   {
                   $loeschen='<a href="topic.php?threadid='.$threadid.'&amp;delete='.$row["postid"].'" onclick="this.href = (confirm('Willst du diesen Eintrag wirklich löschen?')) ? 'topic.php?threadid='.$threadid.'&amp;delete='.$row["postid"].'' : '#';"><img src="grafiken/del.gif" style="border:none;" width="15" height="14"></a>';
                }
                  else
                   {
                    $loeschen="";
                   }

              if (($von==$_SESSION["benutzername"]) || ($_SESSION["rights"]=="admin"))
                   {
                $edit="<a href='edit_thread.php?threadid=".$threadid."'><img src='grafiken/edit.gif' style='border:none;' width='15' height='14'></a>";
                   }
                  else
                   {
                    $edit="";
                   }

              $anzahl = $ppu[$von];

              $datum = strftime("%d.%m.%Y",$datum); //  datum formatieren
                  //Echo "Benutzerrang ->".$benutzer_rang."<-<br>";
                  $ausgabe = $template;

              $ausgabe = str_replace("{von}",'<a href = s.php?user=' . $von . '>' . $von . '</a>',$ausgabe);  // von ins template einsetzen
                  $ausgabe = str_replace("{titel}",$titel,$ausgabe);  // titel ins template einsetzen
                  $ausgabe = str_replace("{datum}",$datum,$ausgabe); // datum ins template einsetzen

              $ausgabe = str_replace("{anzahl}",$ppu[$von],$ausgabe);
                  $ausgabe = str_replace("{text}",echo_message($post,false,true),$ausgabe); // den post text ins template einsetzen
                  $ausgabe = str_replace("{rang}",$benutzer_rang,$ausgabe); // rang ins template einsetzen

              $ausgabe = str_replace("{bild}",$bild,$ausgabe); // rang ins template einsetzen

              $ausgabe = str_replace("(edit)",$edit,$ausgabe); // Beitrag editieren

              $ausgabe = str_replace("{message}",'<a href = post.php?show=write&amp;empfaenger=' . $von . '>Message schreiben</a>',$ausgabe); // den post text ins template einsetzen

              $ausgabe = str_replace("{fusszeile_forum}",$_data['fusszeile_forum'],$ausgabe);
                  $ausgabe=str_replace("{farbe}",$farbe,$ausgabe);
                  $ausgabe=str_replace("{loeschen}",$loeschen,$ausgabe);

              if ($row["del"]!="1")
                   {
                    echo $ausgabe;
                   }
                  $zaehler++;
              };
              ?>

              1. Hello,

                liest Du denn meine Antworten überhaupt?

                while($_data = mysql_fetch_assoc($return))
                //echo $_data['fusszeile_forum'];

                Schau Dir das genau an und erkläre mir bitte haarklieb in deutscher Sprache, was hier passiert.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. Hallo,

                  while($_data = mysql_fetch_assoc($return))
                  //echo $_data['fusszeile_forum'];

                  Das ist nur nee Schleife. Das hat nichts zu sagen.

                  Gruß Nizzan

                  1. Hello,

                    while($_data = mysql_fetch_assoc($return))
                    //echo $_data['fusszeile_forum'];

                    Das ist nur nee Schleife. Das hat nichts zu sagen.

                    Hast Du es überprüft?
                    Ich dachte, dass Du den Inhalt von $_data vermisst hast.
                    Wie ist der denn _nach_ der Schleife?

                    Hast Du ihn Dir mal zur Kontrolle ausgeben lassen?

                    Harzliche Grüße aus http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    1. Hallo Tom

                      while($_data = mysql_fetch_assoc($return))
                      //echo $_data['fusszeile_forum'];

                      Ja steht doch oben, dass ich das versucht habe mit echo. Ich vermisse das ganze eben nur im Template. Wenn ich das mit Echo ausgebe, dann geht es....

                      MFG,
                      Nizzan

                      1. Hello,

                        while($_data = mysql_fetch_assoc($return))
                        //echo $_data['fusszeile_forum'];

                        Ja steht doch oben, dass ich das versucht habe mit echo. Ich vermisse das ganze eben nur im Template. Wenn ich das mit Echo ausgebe, dann geht es....

                        Nein, da steht, dass Du den Wert von $_data['fusszeile_forum'] _in_ der Schleife ausgeben lassen hast.

                        Dies ist nun der letzte Hinweis, den ich Dir in dieser Sache gebe!

                        Harzliche Grüße aus http://www.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        1. Hallo,

                          Dies ist nun der letzte Hinweis, den ich Dir in dieser Sache gebe!

                          weißt du wenn es dir zu viel wird, dann lass es einfach. Ich schaffe das auch ohne dich.

                          MFG,
                          Nizzan

                          1. Hello,

                            Dies ist nun der letzte Hinweis, den ich Dir in dieser Sache gebe!

                            weißt du wenn es dir zu viel wird, dann lass es einfach. Ich schaffe das auch ohne dich.

                            Das musst Du dann wohl auch.

                            Harzliche Grüße aus http://www.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            1. Hallo,

                              Das musst Du dann wohl auch.

                              weißt du, du bist nicht der einzigste der mit hilft.

                              Gruß Nizzan

                              1. Hello,

                                Das musst Du dann wohl auch.

                                weißt du, du bist nicht der einzigste der mit hilft.

                                Vielleicht aber der einzige?

                                Harzliche Grüße aus http://www.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
              2. Hallo Nizzan,

                Sorry wenn ich jetzt was mache was bestimmt nicht gerne gesehen wird, aber hier mal der ganze Code: [...]

                tu dir den Gefallen und rücke den Code mal vernünftig ein ...

                while($_data = mysql_fetch_assoc($return))

                dann wäre dir nämlich aufgefallen, dass die Klammern um den Inhalt der Schleife fehlt (du solltest überhaupt etwas konsequenter Klammern setzten, um einige if- und else-Blöcke fehlen ebenfalls Klammern[1]). Damit wird afaik nur die erste Zeile als Inhalt der Schleife angesehen (in deinem Fall also der Kommentar) - ich vermute mal, dass dir Tom das sagen wollte.

                [1] ja, ich weiß sie sind nicht Pflicht, aber imho sehr zu empfehlen

                Grüße aus Nürnberg
                Tobias

                1. echo $begrüßung;

                  dann wäre dir nämlich aufgefallen, dass die Klammern um den Inhalt der Schleife fehlt (du solltest überhaupt etwas konsequenter Klammern setzten, um einige if- und else-Blöcke fehlen ebenfalls Klammern[1]).

                  Nein, die fehlen nicht, wenn nur eine Anweisung folgt. [*]

                  Damit wird afaik nur die erste Zeile als Inhalt der Schleife angesehen (in deinem Fall also der Kommentar)

                  Nicht die _erste_Zeile_ interessiert sondern die _folgende_Anweisung_. Kommentare gelten jedoch nicht als Anweisung.

                  ich vermute mal, dass dir Tom das sagen wollte.

                  Nein, das wollte er nicht sagen, sondern dass - wie immer - eine Kontrollausgabe von Variableninhalten, die anscheinend nicht das enthalten was man vermutet, und das am besten mit var_dump()[**], entscheidende Hinweise zur Fehlersuche ergibt.

                  Zum Beispiel könnte man dann zu der Erkenntnis gelangen, dass die Schleife etwas anderes erzeugt als erwartet und vielleicht auch noch, dass sie dort völlig fehl am Platze ist.

                  echo "$verabschiedung $name";

                  [*] Inwieweit die Klammern der Bequemlichkeit des Programmierers nützlich sind, später eine Schleife/if-Anweisung zu erweitern, ist dabei nicht relevant.

                  [**] var_dump() gibt im Gegensatz zu echo und print_r() den Typ der Variablen mit aus. Damit kann man Integer-0, Leerstring, false und null voneinander unterscheiden.