PHP-Code im Echo verwenden/maskieren?

WiZdooM

Erfahrenes Mitglied
Hallo

Es ist mal wieder Montag und ich brauch mal einen Denkanstoss.

Ich bin dabei einige Formulare zu optimieren und zu verbessern. Ich möchte nun die einzelnen Abschnitte eines großen Formulares in 3 Teile splitten (aus Gründen der Übersichtlichkeit) und diese dann "durchblättern". Dennoch sollte der gesamte Inhalt in einer Datei stehen. Dazu dachte ich mir, eine Verzweigung anzulegen, die prüft, welcher Abschnitt geladen werden soll und entsprechend die Elemente des jeweiligen Abschnitts mit echo ausgibt.
Mein Dummy den ich mir entwickelt hab funktioniert soweit. Ich kann damit schonmal 3 sehr (sehr,..., sehr) einfache "Seiten" durchblättern.
Ich weiß natürlich dass das Konzept sehr komplex werden kann und für andere nicht so einfach zu verstehen ist, aber ich möchte die Summe an Dateien einfach verkleinern. Sonst könnte ich ja hergehen und für jeden Abschnitt eine separate Datei verwenden.

Aber ich habe trotzdem ein Problem:
Ich habe nun in einer Tabelle mehrere Formularelemente, darunter auch einige Drop-Downlisten. Diese Listen fülle ich mir über for-Schleifen, die logischerweise in ihren eigenen PHP-Tags stehen.
Wie kann ich nun diese Code-Teile so "maskieren", dass ich diesen PHP-Code innerhalb meines HTML stehen hab und er beim Echo innerhalb des HTML auch wieder mit "<?php ?>" wird ?
Kann ich das in einem einzigen Echo für jeden Switch-Case-Fall unterkriegen, oder muss ich mehrere echos miteinander durch die "."-Notation verknüpfen? Oder sollte ich das besser vorher in eine Variable werfen und diese dann ausgeben ?
 
Ich hab zwar nicht ganz verstanden was du vorhast aber ich Tipp einfach mal auf 2 versch. Richtungen :)

1. Wenn du PHP-Code in einem String ausführen willst, lege ich dir die Funktion eval() ans Herz. Mach dich hier aber erst kundig, über Gefahren.

2. Wenn du den PHP-Code gerne maskiert hättest, sodass er NICHT ausgeführt wird, dann kannst du einfach htmlentities bentutzen, um < in &lt;, " durch &quot; usw zu ersetzen.


Ich hoffe da ist was dabei, sonst musst nochmal erklären wass du genau meinst und vorhast. For Dummies sozusagen.
 
Hi

Ich versuche es (auch für andere) zu verdeutlichen, was ich meine:
Dazu habe ich hier eine sehr vereinfachte Tabelle genommen. Die lediglich aus einer Zeile und einer Spalte besteht.

HTML:
<table>
<tr>
<td colspan="2" class="bground">
            <select name="KdG_day" id="KdG_day" class="input" style="width: 40px">
            <option selected="selected"></option>
            <?php
            for($i=1;$i<32;$i++){
                $index=sprintf("%02d",$i);
                echo "<option value=\"$i\">$i</option>";
            }
            ?>
            </select> .
            <select name="KdG_month" id="KdG_month" class="input" style="width: 40px">
            <option selected="selected"></option>
            <?php
            for($i=1;$i<13;$i++){
                $index=sprintf("%02d",$i);
                echo "<option value=\"$i\">$i</option>";
            }
            ?>
            </select> .
            <select name="KdG_year" id="KdG_year" class="input" style="width: 55px">
            <option selected="selected"></option>
            <?php
            for($i=1930;$i<1992;$i++)
                echo "<option value=\"$i\">$i</option>";
            ?>
        </select></td>
</tr>
</table>
Im normalen Dokument steht nun o.a. Code. Ich habe also HTML-Tags und zwischendrin PHP-Tags, bei denen die Select-Felder mit Zahlen gefüllt werden. Das ganze gibt am Ende das Geburtstdatum des Kunden.
Wie man sieht sind hier bereits die "s mit einem \ maskiert. Das funktioniert auch soweit.

Jetzt muss das o.a. Stück Code aber innerhalb eines Weges meiner Switch-Case per Echo ausgespuckt werden. Ich würde jetzt hergehen und den Code in einfache Hochkomma stecken. Nur bricht der "String" beim ersten ?> ab und beendet den PHP Block und der Browser bekommt Codesalat.

PHP:
switch($type){
case 1:
echo '
<table>
<tr>
<td colspan="2" class="bground">
            <select name="KdG_day" id="KdG_day" class="input" style="width: 40px">
            <option selected="selected"></option>
            <?php
            for($i=1;$i<32;$i++){
                $index=sprintf("%02d",$i);
                echo "<option value=\"$i\">$i</option>";
            }
            ?>
            </select> .
            <select name="KdG_month" id="KdG_month" class="input" style="width: 40px">
            <option selected="selected"></option>
            <?php
            for($i=1;$i<13;$i++){
                $index=sprintf("%02d",$i);
                echo "<option value=\"$i\">$i</option>";
            }
            ?>
            </select> .
            <select name="KdG_year" id="KdG_year" class="input" style="width: 55px">
            <option selected="selected"></option>
            <?php
            for($i=1930;$i<1992;$i++)
                echo "<option value=\"$i\">$i</option>";
            ?>
        </select></td>
</tr>
</table>';
break;
case 2: echo '//noch mehr code';
break;
}
Mit nur einem String lässt sich das auf diese Art nicht realisieren, da müsste ich mehrere Echos nacheinander ablaufen lassen.

Tja über eval bin ich auch schon gestolpert, nur hab ich keine Ahnung wie ich dieses Sprachkonstrukt so nutze, dass wie o.a. PHP ausgewertet wird, ein Echo erfolgt und in diesem ge-Echoten String eben meine Formularfelder gefüllt werden. Alle Beispiele die ich bisher gefunden hab verwursteln nur Variablen innerhalb von eval, womit ich wieder bei dem Problem mit den 's und "s bin.

Im PHP-Manual hat ein gewisser admiral [at] nuclearpixel [dot] com vor vier Jahren folgendes gepostet:

PHP:
 <?php

function my_eval($arr) {
    return ('echo stripslashes("'.addslashes($arr[0]).'");');
}

function eval_html3($string) {
    $string = '<?php ?>'.$string.'<?php ?>';
    $string = str_replace( '?>', '', str_replace( array( '<?php', '<?' ), '', preg_replace_callback( "/\?>(.*?)(<\?php|<\?)/", "my_eval", $string ) ) );
    return eval($string);
}
?>
Aber ich bin sehr am zweifeln, ob das für o.a. Code funktioniert.

Wenn ich mehrere Strings Echoe und meine for-schleifen im original PHP-Tag stehen lasse wird mein Vorhaben wahrscheinlich funktionieren.

PHP:
switch($type){
case 1: echo '
<table>
<tr>
<td colspan="2" class="bground">
            <select name="KdG_day" id="KdG_day" class="input" style="width: 40px">
            <option selected="selected"></option>';
            for($i=1;$i<32;$i++){
                $index=sprintf("%02d",$i);
                echo "<option value=\"$i\">$i</option>";
            }
            echo '...';
break;
case 2: ...
break;
}
 
Zuletzt bearbeitet:
Du hättest die For-schleifen doch über JavaScript ausgeben können.
Das hätte dein Problem Vermutlich auch gelöst und spart auch noch traffic :)
 
Du hättest die For-schleifen doch über JavaScript ausgeben können.
Das hätte dein Problem Vermutlich auch gelöst und spart auch noch traffic :)

Ich komme mal mit dem Standart-Argument:
Und wenn der Client kein JS benutzt/benutzen darf?

Ich denke mal das passt schon so ;) Die paar Byte mehr oder weniger machen heutzutage nix mehr aus find ich, denn kaum einer geht heute noch mit ".V90"-Modem ins Netz.
 
Zurück