Ergebnis 1 bis 20 von 46

Thema: Browsergames (Techniken)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    BTW, falls man Zugriff auf PHP 5.1 oder höher hat kann man auch PDO verwenden. Mit PDO hat man nicht nur auto-escapte Variablen (Achtung, % und _ werden AFAIK immer noch nicht gefiltert) sondern auch Zugriff auf erweiterte Funktionalität wie Transaktionen, die, sobald man sich etwas mit ihnen beschäftigt hat, sehr nützlich sein können.

  2. #2
    Welches Anzeigesystem benutzt man denn hauptsächlich bei Browsergames?
    Frames?
    Include? (?content=)
    Oder doch diese ominösen Templates?

  3. #3
    Kann man alles, muss man gar nichts. Wobei Templates schon geschickt waeren (wie bei jeder Art von Website).

  4. #4
    Zumal Templates keine Alternative zu Frames und Includes sind - Templates bauen auf Includes auf und können mit Frames kombiniert werden.

    Templates funktionieren ganz grob so:
    1.) Du lädst das Template in eine Variable.
    $template = file_get_contents('templates/omgsupertemplate.htm');
    2.) Das Template enthält Platzhalter, die du durch konkrete Werte ersetzt.
    $template = str_replace('%sinndeslebens%', 'Brot essen', $template);
    $template = str_replace('%fontsize%', $variable, $template);

    3.) Nachdem du alle Ersetzungen durchgeführt hast machst du, was auch immer du mit dem Output tun willst.
    echo $template;

    Zur Veranschaulichung hier noch mal ein Vorher-Nachher-Vergleich. ($variable == 42)
    VORHER
    Code:
    <html>
      <body>
        <div style="font-size: %fontsize%">
          Der Sinn des Lebens ist: %sinndeslebens%.
        </div>
      </body>
    </html>

    NACHHER
    Code:
    <html>
      <body>
        <div style="font-size: 42">
          Der Sinn des Lebens ist: Brot essen.
        </div>
      </body>
    </html>

    Templates sind ziemlich mächtig und erlauben es dir, PHP- und HTML-Code sauber zu trennen, was die Wartbarkeit der Seite beträchtlich erhöhen kann. Du kannst auch problemlos Templates ineinander verschachteln (wie das geht sollte offensichtlich sein) und so auch komplexe Layouts hinkriegen.


    Edit:
    Ich wurde darauf hingewiesen, daß es nicht offensichtlich ist. Hier also noch mal genau:

    Wenn du dein Template abgearbeitet hast, also mit Schritt 2 durch bist, hast du den ganzen Kram in einer Variable. Die kannst du nun wiederum ganz normal in ein anderes Template einfügen. Und schon hast du den Kram verschachtelt. Du muß nur eben darauf achten, daß du alles, was in einem Untertemplate abgearbeitet wird, in einer eigenen Templatedatei ablegst.

    Geändert von Jesus_666 (20.12.2006 um 11:03 Uhr)

  5. #5
    Manni hat da eine sehr gute Klasse geschrieben, die die Arbeit mit Templates ziemlich einfach macht. Vielleicht ist er ja so nett und veröffentlicht die mal.

  6. #6
    @Jeez:

    Also, im Grunde habe ich das System verstanden, doch bleiben noch ein paar Fragen offen:

    Das Includesystem (mit Content) ist ja recht einleuchtend.
    Ich schreibe "?content=start"
    Und an der jeweiligen Stelle "if($content=="start") { include...."
    Bzw ich benutze einen Switch.
    Allerdings werden die verschiedenen Seiten bei Templates meineswissens nicht per Variable angesteuert.
    Also anstatt "www.blah.de/index.php?content=start" steht dann dort "www.blah.de/start.php"

    Und jetzt verstehe ich nicht, wie ich ein solches System mit Templates aufbauen muss.

  7. #7
    Zuerst mal natürlich if ($_REQUEST['content'] === 'start'). $content ist nur dann direkt verfügbar, wenn du dir Autoglobals erzeugen läßt - und das ist erstens nicht auf allen Servern eingerichtet und zweitens kann es zu Sicherheitslücken führen, wenn man nicht aufpaßt.
    Falls du dir $content aus dem Userinput selbst erzeugt hast ist die Stelle natürlich in Ordnung.


    Von deinem System auf meins umzusatteln ist gar nicht so schwer - immerhin funktionieren beide dadurch, daß an der entsprechenden Stelle die Templates geladen werden. Anstatt einfach die Datei zu inkludieren lädst du sie in eine Variable und fügst die in das Haupttemplate ein, das du am Ende ausgibst.

    Mein System basiert ja darauf, daß du keinen Output hast, den du nicht explizit anforderst (dadurch, daß du ein echo $bla; machst). Du lädst also erst die Grundseite als Template und fügst dann dort alle weiteren Teile ein. Um also eine andere Seite zu "inkludieren" setzt du einfach an der entsprechenden Stelle in der Grundseite einen Platzhalter und packst da per str_replace() die geladene Seite rein.


    BTW, was meinst du mit "werden bei Templates nicht per Variable angesteuert"? Templates sind völlig unabhängig davon, wie man den Inputverarbeitet - und sowohl das, was ich mache als auch das, was du da beschreibst sind Templates; meine sind nur abstrakter gehalten.

  8. #8
    @Jeez:

    Nunja, was ich mit ansteuern meinte:

    Klickt ein User auf den Link "?content=start", so sagt er ja dem Server, dass die Variable Content den Wert "start" annimmt.
    Jetzt handelt der Server, beispielsweise nach dem if-Schema, also "wenn die Variable Contetnt den Wert "start" annimmt, dann inkludiert er die start.php an die entsprechende Stelle.
    Also steuert man die verschiedenen Inhalte an, indem man per Klick auf einen Link die Variable Content ändert, und der Server demntsprechend reagiert.

    Achja und Autoglobals?
    Damit arbeite ich gar nicht.
    Ich hole mir den Wert von Content einfach mit GET.
    Also $content=$_GET["content"];

    So und wenn ich ohne dieses System arbeiten würde, so würde ich ganz einfach den Link auf "start.php" setzen.
    Allerdings müsste ich auf diese Weise sämtliche Strukturen implementieren.
    Also jede einzelne Datei per HTML ein Menü, einen Header, einen Footer, etc. einbringen - und diese Methode ist definitiv zu arbeitsaufwändig, vorallem, wenn sich das Menü mal ändern sollte.
    In diesem Fall müsste man Änderungen in sämtlichen Dateien vornehmen.

    Und ich dachte mir eben, dass diese letzte Variante eben mit Templates funktionieren würde.
    Leider fehlt mir da momentan noch der Durchblick.

    Um die Sache verständlicher zu machen ein kleines Beispiel:

    Da wäre die Datei "/inhalt/omgrofl.html"
    Eine weitere Datei wäre die normale "inhalt/lamor.html"

    Index.php
    HTML-Code:
    <table>
    <td>
    Menu
    <br />
    <a href="/inhalt/omgrofl.html">Rofl</a>
    </td>
    <td>
    Standard --> lamor.html
    </td>
    </table>
    Wie man sieht sollen Standardmäßig die Inhalte der "lamor.html" zu sehen sein.

    So, meine Frage hierzu:
    Wie muss der PHP Code der index.php aussehen, und wie der Inhalt der "lamor.html" und der "omgrofl.html" ?

    Geändert von Antares (20.12.2006 um 18:15 Uhr)

  9. #9
    Seiten, die ihren Inhalt auf Dateien mit *.php verteilen arbeiten ebenso mit Inkludierung.

    Statt dem Inhalt wird eben das Grundgerüst drum herum inkludiert.

    PHP-Code:
    <?php
    include ( 'HTMLKopf.php' );
    // Inhalt
    include ( 'HTMLFuss.php' );
    ?>
    Zitat Zitat
    Achja und Autoglobals?
    Damit arbeite ich gar nicht.
    Ich hole mir den Wert von Content einfach mit GET.
    Also $content=$_GET["content"];
    $_GET ist eine Autoglobale, warum nicht direkt damit arbeiten?

  10. #10
    Okay, hier mal ein kleines Beispiel. Ich verwende hier meine eigenen Kontentionen; beispielsweise steht die Dateiendung .hic für HTML-Includes.
    PHP-Code:
    <?php
    // Das Grundgerüst der Seite.
    $template file_get_contents('res/base.hic');

    switch (
    $_REQUEST['target'])
    {
      case 
    'contact':
        
    $body file_get_contents('res/contact.inc');
        break;
      case 
    'about':
        
    $body file_get_contents('res/about.inc');
        
    $body str_replace('{time}'date('H:i:s'), $body);
        break;
      case 
    'home':
      default:
        
    $body file_get_contents('res/home.inc');
    }

    $template str_replace('{body}'$body$template);
    ?>
    Code:
    [res/base.inc]
    <html>
      <head>
        <title>{title}</title>
      </head>
      <body>
        <div><img src="src/banner.png" alt="Tollsoft ist toll!"></div>
        <div>
    {body}
        </div>
        <div>
          Dieser Footer ist (c)2014, Tollsoft.<br>
          Best viewed with NCSA Mosaic at 640x480.
        </div>
      </body>
    </html>

    Code:
    [res/about.inc]
          <h1>Die Firma Tollsoft</h1><br>
          Die Firma Tollsoft wurde gegründet, um tolle Sachen zu machen.<br>
          Wir produzieren auch Uhrzeiten, so wie diese: {time}

    Komplexere Sachen löse ich dadurch, daß ich sie in einer separaten PHP-Datei behandle und die bei Bedarf inkludiere.

  11. #11
    Zum Thema index.php?content=start vs. start.php:

    Ob du jetzt in der index.php ne Abfrage machst, ob $content === "start" oder ob du in der start.php einfach nur den Kram hast, der nach der Abfrage ausgeführt würde, kommt ja dann aufs gleiche raus.

    Mit Jeez' Variante könnte man etwa so verfahren:
    contact.php
    PHP-Code:
    <?php 
    $template 
    file_get_contents('res/base.hic'); 
    $body file_get_contents('res/contact.inc'); 
    $template str_replace('{body}'$body$template); 
    ?>
    about.php
    PHP-Code:
    <?php 
    $template 
    file_get_contents('res/base.hic'); 
    $body file_get_contents('res/about.inc'); 
    $body str_replace('{time}'date('H:i:s'), $body); 
    $template str_replace('{body}'$body$template); 
    ?>
    Das hat zwar den Nachteil, dass ein paar Zeilen doppelt sind, aber dafür hat man ordentliche Links.

    Übrigens noch ein kleines Beispiel, wie das mit Mannis Klasse aussehen könnte:

    start.tpl (Endung kann natürlich auch anders sein)
    HTML-Code:
    <html>
      <head>
        <title>{title}</title>
      </head>
      <body>
        <INCLUDE! navigation.tpl>
        <div>{text}</div>
      </body>
    </html>
    navigation.tpl
    HTML-Code:
        <ul>
          <BLOCK! navigation>
          <li><a href="{navigation.href}">{navigation.name}</a></li>
          </BLOCK!>
        </ul>
    start.php
    PHP-Code:
    <?php
      
    include "template.class.php";
      include 
    "setup_template.php";
      include 
    "navigation.php";

      
    $template->set_variable(array("title" => "Start""text" => "Lorem Ipsum"));
      
      
    $template->parse("start");
    ?>
    setup_template.php
    PHP-Code:
    <?php
      $template 
    = new Template('templates/''templates/cached/');
      
      
    $templatedir dir($template->path);
      while((
    $filename $templatedir->read()) !== false)
      {
        if(
    preg_match('#^(.*?)\.tpl$#i'$filename$m))
        {
          
    $templates[$m[1]] = $filename;
        }
      }
      
    $template->setfile($templates);
    ?>
    navigation.php
    PHP-Code:
    <?php
      $navigation 
    = array();
      
    $navigation[] = array("href" => "start.php""name" => "Start");
      
    $navigation[] = array("href" => "downloads.php""name" => "Downloads");
      
    $template->set_block_variable("navigation"$navigation);
    ?>
    Dazu drei Anmerkungen:
    1. Es sieht mit den vielen Dateien ziemlich umständlich aus, aber davon muss man pro Seite nur zwei (z.B. start.tpl und start.php) schreiben
    2. Die setup_template.php kann man sich sparen, indem man nur die Templates lädt, die man braucht, aber ich lass aus Bequemlichkeit immer alle laden, die sich im entsprechenden Verzeichnis befinden.
    3. Mannis Klasse erlaubt foreach-Schleifen (<BLOCK!>), Bedingungen (<IF!>, <ELSE!>) und Includes (<INCLUDE!>) und ist damit sehr flexibel.

  12. #12
    @DFYX & Jeez:
    Danke für die Tutorials !


    Ich wollte gerne mal eine Injection testen.
    Also hab ich mir nen Code zusammengebastelt.
    Leider funktioniert das nicht...

    test.php
    PHP-Code:
    <?php
    $verbindung 
    mysql_connect ("...",
            
    "...""...")
            or die (
    "keine Verbindung möglich.
             Benutzername oder Passwort sind falsch"
    );
            
            
    mysql_select_db("usr_web455_4")
            or die (
    "Die Datenbank existiert nicht.");
        
    //Dateien ausgeben

    $id=$_GET["id"];

    $abfrage "SELECT * FROM test WHERE id='$id'";
    $ergebnis mysql_query($abfrage);


    ?>

    form.php
    HTML-Code:
    <form action="test.php" method="GET">
    <input type="text" name="id"><br />
    
    <input type="submit" value="Submit">
    </form>
    Ins Input schreibe ich 1'"; $abfrage="DELETE FROM test"; //
    Trotzdem funktioniert es nicht...

  13. #13
    Zitat Zitat
    Ins Input schreibe ich 1'"; $abfrage="DELETE FROM test"; //
    Das wäre auch ein PHP Skript,d as du da absendest, so geht das nicht! Die Injection geschieht ja innerhalb einer Zeichenkette, die als Query asgeführt wird.

    PHP-Code:
    $abfrage "SELECT * FROM test WHERE id='$id'"
    Eine Injection müsste so aussehen: 1'; DELETE FROM `test` WHERE '1'='1

    Damit lautet die Abfrage:

    PHP-Code:
    $abfrage "SELECT * FROM test WHERE id='1'; DELETE FROM `test` WHERE '1'='1'"
    Womit du zwei funktionsfähige Queries hast.

    PHP lässt es aber nicht ganz so einfach zu:

    1. Magic Quotes escapen einige Sonderzeichen. Diese Einstellung ist sehr oft aktiviert, fällt aber in der nächsten Version von PHP weg. Dann ist die Einstellung unveränderlich deaktiviert, d.h. keine maskierung mehr.
    2. MySQL-Sicherheitsmechanismus: Nur eine Abfrage kann innerhalb von mysql_query() ausgeführt werden. Wiege dich da aber nicht in Sicherheit, das ist kein Schutz. Vor allem wenn die Magic Quotes bald deaktiviert werden.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •