Probleme mit Variablenvariablen

Hallo,

ich bin recht verzweifelt. Ich habe unter Debian linux lenny php5
installiert. Ich möchte gerne Variablen aus Variablen generieren.
Also:
$n = 1;
$arte = "Test";
$var = ${$arte . $n};
$$var = "Hallo";

echo "$var ist: ${$arte . $n}";
Leider gibt das Echo nur den Variablennamen aus.
Ich habe schon einiges Probiert.
Nach dem Beispiel vom php.net sollte es funktionieren:

<?

$arg = "foo";
$val = "bar";

//${$arg$val} = "in valid"; // Invalid
${$arg . $val} = "working";

echo $foobar; // "working";
//echo $arg$val; // Invalid
//echo ${$arg$val}; // Invalid
echo ${$arg . $val}; // "working"

?>

Kann es sein, dass irgendetwas im php.ini eingestellt werden muß. Ich weiß
nicht weiter.

Vielen Dank für Hilfe.

Marc
Marc Wiemers [ So, 06 Januar 2008 21:49 ] [ ID #1901157 ]

Re: Probleme mit Variablenvariablen

Marc Wiemers meinte:
> Hallo,
>
> ich bin recht verzweifelt. Ich habe unter Debian linux lenny php5
> installiert. Ich möchte gerne Variablen aus Variablen generieren.

Warum? Habe jetzt schon etliche Jahre mit PHP verbracht, ohne jemals
variable Variablen benötigt zu haben.

> Kann es sein, dass irgendetwas im php.ini eingestellt werden muß. Ich weiß
> nicht weiter.

Nope.

Ach ja:

Wahrscheinlich willst du (aus deinen Ausführungen werd ich nicht so
recht schlau; und short-tags sind böse):

<?php

$n = 1;
$arte = "Test";
$var = $arte.$n;
$$var = "Hallo";

echo "$var ist: ${$arte . $n}";

?>

Gregor


--
http://photo.gregorkofler.at ::: Landschafts- und Reisefotografie
http://web.gregorkofler.com ::: meine JS-Spielwiese
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Gregor Kofler [ So, 06 Januar 2008 22:25 ] [ ID #1901159 ]

Re: Probleme mit Variablenvariablen

Marc Wiemers schrieb:

> Ich möchte gerne Variablen aus Variablen generieren.

Nein, das möchtest du nicht. Du möchtest dein Konzept reparieren.
Variable Variablen sind böse[tm].

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mo, 07 Januar 2008 00:11 ] [ ID #1901163 ]

Re: Probleme mit Variablenvariablen

Hallo Gregor,

Gregor Kofler wrote:

> Ach ja:
>
> Wahrscheinlich willst du (aus deinen Ausführungen werd ich nicht so
> recht schlau; und short-tags sind böse):
>
> <?php
>
> $n = 1;
> $arte = "Test";
> $var = $arte.$n;
> $$var = "Hallo";
>
> echo "$var ist: ${$arte . $n}";
>
> ?>

Genau das will ich aber es geht nicht. echo gibt dann kein Hallo aus.

Was gibt es für Alternativen wenn das böse ist?

Marc
Marc Wiemers [ Mo, 07 Januar 2008 08:41 ] [ ID #1902057 ]

Re: Probleme mit Variablenvariablen

Marc Wiemers schrieb:
> Was gibt es für Alternativen wenn das böse ist?

kommt darauf an was du damit erreichen willst.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 07 Januar 2008 08:50 ] [ ID #1902058 ]

Re: Probleme mit Variablenvariablen

Marc Wiemers schrieb:
> Hallo Gregor,
>
> Gregor Kofler wrote:
>
>> Ach ja:
>>
>> Wahrscheinlich willst du (aus deinen Ausführungen werd ich nicht so
>> recht schlau; und short-tags sind böse):
>>
>> <?php
>>
>> $n = 1;
>> $arte = "Test";
>> $var = $arte.$n;
>> $$var = "Hallo";
>>
>> echo "$var ist: ${$arte . $n}";
>>
>> ?>
>
> Genau das will ich aber es geht nicht. echo gibt dann kein Hallo aus.

Dann kontrolliere noch mal ob du wirklich 1:1 obigen Code verwendet
hast. Wie rufsat du den Code auf: php -f testfile?

Ansonsten kannst du auch noch mit gdb debuggen, wenn es wirklich nicht
geht kannst du ja nochmal deine PHP Pakete de/installieren

>
> Was gibt es für Alternativen wenn das böse ist?

Was willst du damit erreichen.

>
> Marc
Stefan Braumeister [ Mo, 07 Januar 2008 09:48 ] [ ID #1902059 ]

Re: Probleme mit Variablenvariablen

Marc Wiemers schrieb:
>> Wahrscheinlich willst du (aus deinen Ausführungen werd ich nicht so
>> recht schlau; und short-tags sind böse):
>>
>> <?php
>>
>> $n = 1;
>> $arte = "Test";
>> $var = $arte.$n;
>> $$var = "Hallo";
>>
>> echo "$var ist: ${$arte . $n}";
>>
>>>
>
> Genau das will ich aber es geht nicht. echo gibt dann kein Hallo aus.

Gregors Vorschlag weicht geringfügig von Deiner Vorgabe ab. Bei Dir steht:

$var = ${$arte . $n};

Das heißt im Klartext: $var = $Test1 und gibt eine Notice "Undedefined
variable", weil $Test1 zu diesem Zeitpunkt noch nicht definiert ist.

Bei Gregor steht:

$var = $arte.$n;

Ohne geschweifte Klammern. Das heißt im Klartext: $var = "Test1" und führt
zu Deinem gewünschtem Ergebnis.

> Was gibt es für Alternativen wenn das böse ist?

Gregor meint nur Short-Tags, also "<?". Diese müssen extra in der php.ini
freigeschaltet werden. Nimm besser immer normale Tags: "<?php". Dann klappts
auch mit dem Nachbarcomputer.

viele grüße
ralph
rkhbng [ Mo, 07 Januar 2008 12:09 ] [ ID #1902062 ]

Re: Probleme mit Variablenvariablen

"Marc Wiemers" <jupiter_42 [at] gmx.de> schrieb im Newsbeitrag news:flresc$82v$1 [at] saphir.steine.home...
> Hallo,
>
> ich bin recht verzweifelt. Ich habe unter Debian linux lenny php5
> installiert. Ich möchte gerne Variablen aus Variablen generieren.
> Also:
> $n = 1;
> $arte = "Test";
> $var = ${$arte . $n};
> $$var = "Hallo";
>
> echo "$var ist: ${$arte . $n}";
> Leider gibt das Echo nur den Variablennamen aus.
> Ich habe schon einiges Probiert.
> Nach dem Beispiel vom php.net sollte es funktionieren:
>
> <?
>
> $arg = "foo";
> $val = "bar";
>
> //${$arg$val} = "in valid"; // Invalid
> ${$arg . $val} = "working";
>
> echo $foobar; // "working";
> //echo $arg$val; // Invalid
> //echo ${$arg$val}; // Invalid
> echo ${$arg . $val}; // "working"
>
> ?>
>
> Kann es sein, dass irgendetwas im php.ini eingestellt werden muß. Ich weiß
> nicht weiter.
>
> Vielen Dank für Hilfe.
>
> Marc

Hi Marc,

Du machst einen kleinen Fehler. $Test1 ist nicht initialisiert.

mit

> $var = ${$arte . $n};

Setzt Du $var auf den Wert aus $Test1. Wenn Du $Test1 vorher setzt,
kannst Du sehen, was passiert:

$Test1="Welt";
$n=1;
$arte="Test";
$var=${$arte.$n};
$$var="Hallo";
echo $var."*".$Test1."*".$Welt."*".$$var;

erzeugt bei mir: Welt*Welt*Hallo*Hallo

Verstanden? Ich glaube, was Du eigentlich wolltest ist:

$n=1;
$arte="Test";
$var=$arte.$n;
$$var="Hallo";
echo $var."*".$$var;

Das erzeugt den Output: Test1*Hallo

Du warst also einmal zu indirect. Wahrscheinlich hast Du geglaubt,
mit $var = ${$arte.$n} konntest Du in $var eine Referenz auf $Test1
erzeugen. Das ist aber nicht so. ${$arte.$n} wird *nur* interpretiert und
ergibt. wie gesagt, den Inhalt von $Test1 (also "").

Gruß Andreas
DFS [ Mo, 07 Januar 2008 12:28 ] [ ID #1902063 ]

Re: Probleme mit Variablenvariablen

>"Niels Braczek" <nbraczek [at] freenet.de> schrieb im Newsbeitrag news:flrn52$s9d$02$1 [at] news.t-online.com...
>Marc Wiemers schrieb:
>
>> Ich möchte gerne Variablen aus Variablen generieren.
>
>Nein, das möchtest du nicht. Du möchtest dein Konzept reparieren.
>Variable Variablen sind böse[tm].
>...

Das halte ich für zu sehr vereinfacht.

Die PHP-Sprachentwickler erlauben den Anwendungsentwicklern einen gewissen
Zugriff auf Funktionalitäten des Interpreters. Was man damit anstellen kann,
kann man z.B. in "Structure and Interpretation of Computer Programs" von
Abelson & Sussman nachlesen.

Ich möchte sagen, dass ist schon eine scharfe Waffe - mit der kann man sich
allerdings auch leicht ins Bein schießen :))

Gruß Andreas
DFS [ Mo, 07 Januar 2008 12:44 ] [ ID #1902064 ]

Re: Probleme mit Variablenvariablen

> Nein, das möchtest du nicht. Du möchtest dein Konzept reparieren.
> Variable Variablen sind böse[tm].

Naja, in Template-Engines könnte ich mir das vorstellen.
Jonas Werres [ Mo, 07 Januar 2008 12:47 ] [ ID #1902065 ]

Re: Probleme mit Variablenvariablen

Hallo,

ja was will ich damit.
Die Variable kommt aus einer Abfrage mehrerer Checkboxen.
<INPUT TYPE=hidden Name=Autor1 VALUE=0>
<INPUT TYPE=hidden Name=Autor1 VALUE=123>
<INPUT TYPE=hidden Name=Autor1 VALUE=243>

<INPUT TYPE=hidden Name=Autor2 VALUE=0>
<INPUT TYPE=hidden Name=Autor2 VALUE=234>
<INPUT TYPE=hidden Name=Autor2 VALUE=456>

diese möcht ich gerne auswerten. Wobei ich nicht weiß wieviele Autor es
gibt. Ich habe schon versucht mit isset (${$autor.$n} abzufragen was aber
auch schon nicht ging. Dann haben ich eine Variable anzahlAutoren eingefügt
leider gibt aber ${$test.$n} dann auch nicht das gewünschte aus.
Vielleicht gibt es einen besseren Weg das Auszuwerten?
Vielen Dank für eine Antwort!

Marc


Christoph Herrmann wrote:

> Marc Wiemers schrieb:
>> Was gibt es für Alternativen wenn das böse ist?
>
> kommt darauf an was du damit erreichen willst.
>
Marc Wiemers [ Mo, 07 Januar 2008 12:59 ] [ ID #1902066 ]

Re: Probleme mit Variablenvariablen

Marc Wiemers schrieb:
> ja was will ich damit.
> Die Variable kommt aus einer Abfrage mehrerer Checkboxen.
> <INPUT TYPE=hidden Name=Autor1 VALUE=0>
> <INPUT TYPE=hidden Name=Autor1 VALUE=123>
> <INPUT TYPE=hidden Name=Autor1 VALUE=243>
>
> <INPUT TYPE=hidden Name=Autor2 VALUE=0>
> <INPUT TYPE=hidden Name=Autor2 VALUE=234>
> <INPUT TYPE=hidden Name=Autor2 VALUE=456>
>
> diese möcht ich gerne auswerten. Wobei ich nicht weiß wieviele Autor es
> gibt. Ich habe schon versucht mit isset (${$autor.$n} abzufragen was aber
> auch schon nicht ging. Dann haben ich eine Variable anzahlAutoren eingefügt
> leider gibt aber ${$test.$n} dann auch nicht das gewünschte aus.

Das funktioniert aber nur, wenn register_globals angeschaltet ist oder
simuliert wird. In Verbindung mit solchen Konstrukten können schnell mal
unitialisierte Variablen (wie schon im anderen Beitrag erwähnt) heraus
kommen was beides zusammen ein Sicherheitsrisiko verursacht.

> Vielleicht gibt es einen besseren Weg das Auszuwerten?
> Vielen Dank für eine Antwort!

$counter = 1;
while(isset($_POST['Autor' . $counter]))
{
print $_POST['Autor' . $counter];
++$counter;
}

In der Variante wird nicht auf Variablen, sondern auf die Indizes des
POST Array zugegriffen, wo deine Daten nach dem Bestätigen des Formulars
liegen (solange method="post" im Formtag angegeben wurde). Bevor man
diese speichert in Datenbank oder Datei natürlich noch validieren und
gegebenenfalls maskieren.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 07 Januar 2008 13:10 ] [ ID #1902067 ]

Re: Probleme mit Variablenvariablen

> <INPUT TYPE=hidden Name=Autor1 VALUE=0>
> <INPUT TYPE=hidden Name=Autor1 VALUE=123>
> <INPUT TYPE=hidden Name=Autor1 VALUE=243>
>
> <INPUT TYPE=hidden Name=Autor2 VALUE=0>
> <INPUT TYPE=hidden Name=Autor2 VALUE=234>
> <INPUT TYPE=hidden Name=Autor2 VALUE=456>
1. Gehören Attribute in HTML in Anführungszeichen. Ich finde
Großschreibung schon nciht schön (und ich glaube, bei XHTML ist die auch
nciht emhr erlaubt?), aber gemischt? (Name)
2. Sind das Hidden-Felder. Keine Checkboxen. Gleiche namen amchen da
keine Sinn, weil ein Wert den anderen überschreibt.
3. Kann man in Formularen Arrays benutzen:

> <input type="checkbox" id="author1" name="autor[]" value="0"> <label
for="autor1">Autor 1</label>
> <input type="checkbox" id="author1" name="autor[]" value="0"> <label
for="autor1">Autor 1</label>
> <input type="checkbox" id="author1" name="autor[]" value="0"> <label
for="autor1">Autor 1</label>
> <input type="checkbox" id="author1" name="autor[]" value="0"> <label
for="autor1">Autor 1</label>
....
Jonas Werres [ Mo, 07 Januar 2008 13:25 ] [ ID #1902068 ]

Re: Probleme mit Variablenvariablen

..oO(Marc Wiemers)

>ja was will ich damit.
>Die Variable kommt aus einer Abfrage mehrerer Checkboxen.
><INPUT TYPE=hidden Name=Autor1 VALUE=0>
><INPUT TYPE=hidden Name=Autor1 VALUE=123>
><INPUT TYPE=hidden Name=Autor1 VALUE=243>
>
><INPUT TYPE=hidden Name=Autor2 VALUE=0>
><INPUT TYPE=hidden Name=Autor2 VALUE=234>
><INPUT TYPE=hidden Name=Autor2 VALUE=456>

Das sind zwar keine Checkboxen, aber egal. Aber auch dieser Code oben
kann nicht funktionieren - Du wirst immer nur das letzte Element jeden
Namens bekommen, also 243 für 'Autor1' und 456 für 'Autor2'. Willst Du
alle haben, noch dazu in beliebiger Anzahl, dann benutze Array-Syntax:

<input type="checkbox" name="autor1[]" value="0">
<input type="checkbox" name="autor1[]" value="123">
<input type="checkbox" name="autor1[]" value="243">

<input type="checkbox" name="autor2[]" value="0">
<input type="checkbox" name="autor2[]" value="234">
<input type="checkbox" name="autor2[]" value="456">

Siehe dazu auch

11.10. Wie kann man Checkboxen verarbeiten?
http://php-faq.de/q/q-formular-checkbox.html

How do I get all the results from a select multiple HTML tag?
http://www.php.net/manual/en/faq.html.php#faq.html.select-mu ltiple

Wird das Formular nun abgeschickt (angenommen per POST), dann sind -
sofern etwas ausgewählt wurde - $_POST['autor1'] und $_POST['autor2']
Arrays und enthalten die Werte der jeweils ausgewählten Checkboxen.

HTH
Micha
Michael Fesser [ Mo, 07 Januar 2008 13:26 ] [ ID #1902069 ]

Re: Probleme mit Variablenvariablen

..oO(Jonas Werres)

>> <INPUT TYPE=hidden Name=Autor1 VALUE=0>
>> <INPUT TYPE=hidden Name=Autor1 VALUE=123>
>> <INPUT TYPE=hidden Name=Autor1 VALUE=243>
>>
>> <INPUT TYPE=hidden Name=Autor2 VALUE=0>
>> <INPUT TYPE=hidden Name=Autor2 VALUE=234>
>> <INPUT TYPE=hidden Name=Autor2 VALUE=456>
>
>1. Gehören Attribute in HTML in Anführungszeichen.

Jein. Wenn der Wert nur aus Zahlen, Buchstaben und einer Handvoll
weiterer Zeichen besteht, dann geht's auch ohne. Aber besserer Stil
ist es natürlich, grundsätzlich alle Attributwerte in (einfache oder
doppelte) Anführungszeichen zu setzen. In X(HT)ML ist das ohnehin
vorgeschrieben.

>Ich finde
>Großschreibung schon nciht schön (und ich glaube, bei XHTML ist die auch
>nciht emhr erlaubt?)

Korrekt. X(HT)ML ist case-sensitive, HTML nicht.

Micha
Michael Fesser [ Mo, 07 Januar 2008 13:32 ] [ ID #1902070 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:
>> Nein, das möchtest du nicht. Du möchtest dein Konzept reparieren.
>> Variable Variablen sind böse[tm].
>
> Naja, in Template-Engines könnte ich mir das vorstellen.

Da nimmt man Hashes. Statt $$var einfach $data[$var]. Man braucht in
üblichen Anwendungen keine variablen Variablen.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mo, 07 Januar 2008 16:54 ] [ ID #1902079 ]

Re: Probleme mit Variablenvariablen

Andreas Thiele schrieb:
>>"Niels Braczek" <nbraczek [at] freenet.de> schrieb im Newsbeitrag news:flrn5=
2$s9d$02$1 [at] news.t-online.com...
>>Marc Wiemers schrieb:
>>
>>> Ich möchte gerne Variablen aus Variablen generieren.
>>
>>Nein, das möchtest du nicht. Du möchtest dein Konzept reparieren.
>>Variable Variablen sind böse[tm].
>>...
>
> Das halte ich für zu sehr vereinfacht.

Ich kenne keine Problemstellung (außerhalb von Debugging zumindest), di=
e
sich nicht mit Hashes lösen ließe.

> Ich möchte sagen, dass ist schon eine scharfe Waffe - mit der kann ma=
n sich
> allerdings auch leicht ins Bein schießen :))

So ein Werkzeug gehört definitiv nicht in Hände von Leuten, die danac=
h
fragen müssen, wie es funktioniert.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mo, 07 Januar 2008 16:58 ] [ ID #1902080 ]

Re: Probleme mit Variablenvariablen

Jonas Werres meinte:
>> Nein, das möchtest du nicht. Du möchtest dein Konzept reparieren.
>> Variable Variablen sind böse[tm].
>
> Naja, in Template-Engines könnte ich mir das vorstellen.

Hab ich auch nur assoziative Arrays.

Gregor


--
http://photo.gregorkofler.at ::: Landschafts- und Reisefotografie
http://web.gregorkofler.com ::: meine JS-Spielwiese
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Gregor Kofler [ Mo, 07 Januar 2008 17:10 ] [ ID #1902081 ]

Re: Probleme mit Variablenvariablen

Michael Fesser schrieb:

> ..oO(Jonas Werres)
>
>>> <INPUT TYPE=hidden Name=Autor1 VALUE=0>
>>> <INPUT TYPE=hidden Name=Autor1 VALUE=123>
>>> <INPUT TYPE=hidden Name=Autor1 VALUE=243>

Hier weist Du _einem_ Namen mehrere Werte zu. Das wird nicht
funkionieren. Du musst schon unterschiedliche Namen verwenden oder
Arrays benutzen.

>> 1. Gehören Attribute in HTML in Anführungszeichen.
>
> Jein. Wenn der Wert nur aus Zahlen, Buchstaben und einer Handvoll
> weiterer Zeichen besteht, dann geht's auch ohne.

Falsch. Sie gehören _immer_ in Anführungszeichen. Dass es bei den
meisten Browsern auch ohne funktioniert, ändert daran nichts.

Gruß. Claus
Claus Reibenstein [ Mo, 07 Januar 2008 18:14 ] [ ID #1902090 ]

Re: Probleme mit Variablenvariablen

Niels Braczek schrieb:

> Variable Variablen sind böse[tm].

-v

Gruß. Claus
Claus Reibenstein [ Mo, 07 Januar 2008 18:16 ] [ ID #1902091 ]

Re: Probleme mit Variablenvariablen

Claus Reibenstein schrieb:
> Niels Braczek schrieb:
>
>> Variable Variablen sind böse[tm].
>
> -v

Das gehört in die gleiche Schublade wie register_globals=3Don oder eval=
().
Wenn man *genau* weiß, was man tut, ist es ok - ansonsten Finger weg.

Debugging wird erheblich erschwert. Man weiß nicht mehr, welche
Variablen im aktuellen Scope existieren. Man kann mit variablen
Variablen nichts machen, was man nicht auch mit assoziativen Arrays
erreichen kann.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mo, 07 Januar 2008 18:25 ] [ ID #1902093 ]

Re: Probleme mit Variablenvariablen

..oO(Claus Reibenstein)

>Michael Fesser schrieb:
>
>> Jein. Wenn der Wert nur aus Zahlen, Buchstaben und einer Handvoll
>> weiterer Zeichen besteht, dann geht's auch ohne.
>
>Falsch. Sie gehören _immer_ in Anführungszeichen. Dass es bei den
>meisten Browsern auch ohne funktioniert, ändert daran nichts.

| In certain cases, authors may specify the value of an attribute
| without any quotation marks. The attribute value may only contain
| letters (a-z and A-Z), digits (0-9), hyphens (ASCII decimal 45),
| periods (ASCII decimal 46), underscores (ASCII decimal 95), and colons
| (ASCII decimal 58). We recommend using quotation marks even when it is
| possible to eliminate them.

http://www.w3.org/TR/html401/intro/sgmltut.html#h-3.2.2

Micha
Michael Fesser [ Mo, 07 Januar 2008 18:26 ] [ ID #1902094 ]

Re: Probleme mit Variablenvariablen

> Hab ich auch nur assoziative Arrays.
Ja, ohne ist amn nciht aufgeschmissen. Aber es sieht schöner aus und das
halte ich bei Templates für nciht zu unterschätzen. Mich nervt schon das
ewige <?php echo $blah ?> bei Symfony im Gegensatz zu {$blah} bei Smarty
(ja, ich weiß, man kann das einbinden). Wenn dazu noch data[""] kommt,
wird es bei vielen Variablen ätzend.
In Templates, wo keine andere Logik drinsteckt, sehe ich auch kein
Problem mit Debugging.
Jonas Werres [ Mo, 07 Januar 2008 18:38 ] [ ID #1902095 ]

Re: Probleme mit Variablenvariablen

Claus Reibenstein wrote:
> Michael Fesser schrieb:
>> ..oO(Jonas Werres)
>>> 1. Geh=C3=B6ren Attribute in HTML in Anf=C3=BChrungszeichen.

>> Jein. Wenn der Wert nur aus Zahlen, Buchstaben und einer Handvoll
>> weiterer Zeichen besteht, dann geht's auch ohne.

> Falsch. Sie geh=C3=B6ren _immer_ in Anf=C3=BChrungszeichen. Dass es bei=
den
> meisten Browsern auch ohne funktioniert, =C3=A4ndert daran nichts.

Nicht ganz richtig. Ich w=C3=BCrde es zwar nie anders machen, aber in der=

HTML-Spezifikation[1] steht was anderes:

| In certain cases, authors may specify the value of an attribute
| without any quotation marks. The attribute value may only contain
| letters (a-z and A-Z), digits (0-9), hyphens (ASCII decimal 45),
| periods (ASCII decimal 46), underscores (ASCII decimal 95), and
| colons (ASCII decimal 58).

Wie gesagt: Bitte trotzdem nicht machen.

[1] "http://www.w3.org/TR/html401/intro/sgmltut.html#idx-attribu te-6"

Gr=C3=BC=C3=9Fe

Der Stefan

--
"Ich habe nichts gegen Autorit=C3=A4ten, aber ich kann es nicht leiden, w=
enn
mir jemand sagt, was ich zu tun oder zu lassen habe." (Bernd Stromberg)=

http://weblog.ononlinework.de/
Stefan David [ Mo, 07 Januar 2008 18:44 ] [ ID #1902096 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:
>> Hab ich auch nur assoziative Arrays.
> Ja, ohne ist amn nciht aufgeschmissen. Aber es sieht schöner aus und das
> halte ich bei Templates für nciht zu unterschätzen. Mich nervt schon das
> ewige <?php echo $blah ?> bei Symfony im Gegensatz zu {$blah} bei Smarty

ja was denkst Du denn wie die Daten in Smarty gehalten werden? per magic
__get und __set etwa? Alles steht dort wie zu erwarten in einem
assoziativen array.

MfG, Ulf
Ulf Kadner [ Mo, 07 Januar 2008 19:38 ] [ ID #1902098 ]

Re: Probleme mit Variablenvariablen

Niels Braczek schrieb:

> Das gehört in die gleiche Schublade wie register_globals=on oder eval().
> Wenn man *genau* weiß, was man tut, ist es ok - ansonsten Finger weg.
>
> Debugging wird erheblich erschwert. Man weiß nicht mehr, welche
> Variablen im aktuellen Scope existieren. Man kann mit variablen
> Variablen nichts machen, was man nicht auch mit assoziativen Arrays
> erreichen kann.

Das hat sich wahrscheinlich jemand ausgedacht der Arrays nicht
verstanden hat. ;-)

MfG, Ulf
Ulf Kadner [ Mo, 07 Januar 2008 19:39 ] [ ID #1902099 ]

Re: Probleme mit Variablenvariablen

Ulf Kadner schrieb:
> Niels Braczek schrieb:
>
>> Das gehört in die gleiche Schublade wie register_globals=3Don oder e=
val().
>> Wenn man *genau* weiß, was man tut, ist es ok - ansonsten Finger weg=
=2E
>>
>> Debugging wird erheblich erschwert. Man weiß nicht mehr, welche
>> Variablen im aktuellen Scope existieren. Man kann mit variablen
>> Variablen nichts machen, was man nicht auch mit assoziativen Arrays
>> erreichen kann.
>
> Das hat sich wahrscheinlich jemand ausgedacht der Arrays nicht
> verstanden hat. ;-)

Wahrscheinlich derselbe, der register_globals=3Don als Standard gesetzt
hat und uns den safe_mode beschert hat... ;-)

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mo, 07 Januar 2008 19:43 ] [ ID #1902100 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:

>> Hab ich auch nur assoziative Arrays.

> Ja, ohne ist amn nciht aufgeschmissen. Aber es sieht schöner aus und =
das
> halte ich bei Templates für nciht zu unterschätzen. Mich nervt scho=
n das
> ewige <?php echo $blah ?> bei Symfony im Gegensatz zu {$blah} bei Smart=
y
> (ja, ich weiß, man kann das einbinden). Wenn dazu noch data[""] kommt=
,
> wird es bei vielen Variablen ätzend.
> In Templates, wo keine andere Logik drinsteckt, sehe ich auch kein
> Problem mit Debugging.

In Templates steht überhaupt kein PHP. Statt <?php echo $blah; ?> oder
{$blah} steht da zB. {blah}. Die Ersetzung wird von der Template-Engine
vorgenommen, nicht vom Template. YMMV.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mo, 07 Januar 2008 19:41 ] [ ID #1902101 ]

Re: Probleme mit Variablenvariablen

Hallo,

Christoph Herrmann wrote:

>
> $counter = 1;
> while(isset($_POST['Autor' . $counter]))
> {
> print $_POST['Autor' . $counter];
> ++$counter;
> }
>
> In der Variante wird nicht auf Variablen, sondern auf die Indizes des
> POST Array zugegriffen, wo deine Daten nach dem Bestätigen des Formulars
> liegen (solange method="post" im Formtag angegeben wurde). Bevor man
> diese speichert in Datenbank oder Datei natürlich noch validieren und
> gegebenenfalls maskieren.
>
Vielen Dank für die Erklärung. So geht es.

Marc
Marc Wiemers [ Mo, 07 Januar 2008 20:11 ] [ ID #1902102 ]

Re: Probleme mit Variablenvariablen

> In Templates steht überhaupt kein PHP. Statt <?php echo $blah; ?> oder
> {$blah} steht da zB. {blah}. Die Ersetzung wird von der Template-Engine
> vorgenommen, nicht vom Template. YMMV.

Ich wüsste nicht, dass das in der Definition von Template-Engine steht.
Symfony z.B. kompiliert die Templates nicht, sondern macht einfach
PHP-Code. Dem Template zugewiesen wird per __get im Control-Objekt
($this->name) und ist dann im Template z.B. als $name verfügbar.
Jonas Werres [ Mo, 07 Januar 2008 23:44 ] [ ID #1902106 ]

Re: Probleme mit Variablenvariablen

Ulf Kadner schrieb:

> Niels Braczek schrieb:
>
>> [variable Variablen]
>
> Das hat sich wahrscheinlich jemand ausgedacht der Arrays nicht
> verstanden hat. ;-)

Ich tippe eher auf ein Relikt (aka Altlast) aus jener Zeit, zu der PHP
noch keine assoziativen Arrays kannte. Oder gab's die schon immer?

Gruß. Claus
Claus Reibenstein [ Mo, 07 Januar 2008 23:46 ] [ ID #1902107 ]

Re: Probleme mit Variablenvariablen

> ja was denkst Du denn wie die Daten in Smarty gehalten werden? per magic
> __get und __set etwa?
So macht Symfony das wohl im Controlteil, ja. Zumindest nehme ich das
an, weil man dem Controlobjekt einfach die Variablen, die im Template
verfügbar sein sollen, als Attribute zuweist.

> Alles steht dort wie zu erwarten in einem
> assoziativen array.
Ja. Dazu muss man aber kompilieren. Es gibt Templateangines, die nicht
kompilieren. Savant, Symfony-Template, ... und da ist
<?php echo $date["name"] ?> auf die Datuer deutlich unangenehmer als
<?php echo $name ?>
Nicht lebensnotwendig, aber schöner. Und ich sehe keine Probleme,
solange die Templateengine jemand schreibt, der weiß, was er macht.
Jonas Werres [ Mo, 07 Januar 2008 23:48 ] [ ID #1902108 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:
>
> Ich wüsste nicht, dass das in der Definition von Template-Engine steh=
t.

Template-Engine !=3D Template.

> Symfony z.B. kompiliert die Templates nicht, sondern macht einfach
> PHP-Code. Dem Template zugewiesen wird per __get im Control-Objekt
> ($this->name) und ist dann im Template z.B. als $name verfügbar.

Dann ist das ein Skript und kein Template. Wie ich schon sagte: YMMV.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Di, 08 Januar 2008 00:13 ] [ ID #1902110 ]

Re: Probleme mit Variablenvariablen

Niels Braczek wrote:
> Andreas Thiele schrieb:
>>> "Niels Braczek" <nbraczek [at] freenet.de> schrieb im Newsbeitrag =
news:flrn52$s9d$02$1 [at] news.t-online.com...
>>> Marc Wiemers schrieb:
>>>
>>>> Ich möchte gerne Variablen aus Variablen generieren.
>>>
>>> Nein, das möchtest du nicht. Du möchtest dein Konzept =
reparieren.
>>> Variable Variablen sind böse[tm].
>>> ...
>>
>> Das halte ich für zu sehr vereinfacht.
>
> Ich kenne keine Problemstellung (außerhalb von Debugging zumindest), =
die
> sich nicht mit Hashes lösen ließe.

Ich finde, das ist nicht die Frage. Es gibt auch kein Problem, welches =
nicht
mit einem Assembler-Programm gelöst werden kann. Ist nur die Frage wie =
einfach
oder durchsichtig. Das Prinzip der 'variablen Variablen' stand doch vor =
deren
Einführung schon per eval() zur Verfügung. Konsequenter weise =
müsstest Du dann
die Enfernung von $$ und eval() aus php fordern.

>
>> Ich möchte sagen, dass ist schon eine scharfe Waffe - mit der kann =
man sich
>> allerdings auch leicht ins Bein schießen :))
>
> So ein Werkzeug gehört definitiv nicht in Hände von Leuten, die =
danach
> fragen müssen, wie es funktioniert.
>...

Eine sehr strenge Sicht. Dein Post gibt anderen Leuten Regeln vor.

Richtig finde ich allerdings, dass man solche Konstrukte nicht unnötig =
einsetzt,
dass heißt, man sollte seine Sprache schon kennen.

Andreas
DFS [ Di, 08 Januar 2008 10:42 ] [ ID #1902983 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:

>> Alles steht dort wie zu erwarten in einem assoziativen array.

> Ja. Dazu muss man aber kompilieren. Es gibt Templateangines, die nicht
> kompilieren. Savant, Symfony-Template, ... und da ist
> <?php echo $date["name"] ?> auf die Datuer deutlich unangenehmer als
> <?php echo $name ?>

Aber dazu brauchts keine variablen Variablen. Hier reicht extract() und
include() in einer Funktion:

function render($file, $vars) {
extract($vars);
include($file);
}

--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
dafox [ Di, 08 Januar 2008 18:17 ] [ ID #1902993 ]

Re: Probleme mit Variablenvariablen

Andreas Thiele schrieb:
> Niels Braczek wrote:

>> Ich kenne keine Problemstellung (außerhalb von Debugging zumindest),=
die
>> sich nicht mit Hashes lösen ließe.
>
> Ich finde, das ist nicht die Frage. Es gibt auch kein Problem, welches =
nicht
> mit einem Assembler-Programm gelöst werden kann. Ist nur die Frage wi=
e einfach
> oder durchsichtig.

Genau. eval() und variable Variablen tragen aber eher zur Obfuskierung
bei statt zur Transparenz.

> Das Prinzip der 'variablen Variablen' stand doch vor deren
> Einführung schon per eval() zur Verfügung. Konsequenter weise müs=
stest Du dann
> die Enfernung von $$ und eval() aus php fordern.

Nein, warum? In Händen von jemandem, der damit umzugehen weiß, möge=
n
diese Möglichkeiten ja sinnvoll sein - wenn ich persönlich das auch
nicht so sehe.

>> So ein Werkzeug gehört definitiv nicht in Hände von Leuten, die da=
nach
>> fragen müssen, wie es funktioniert.
>
> Eine sehr strenge Sicht. Dein Post gibt anderen Leuten Regeln vor.

Mag sein. Ich gebe meine Erfahrung weiter. Meine Regeln[tm] sind
natürlich nicht bindend. Es erspart einem (und gerade Neulingen) jedoch=

viele Probleme, sie zu befolgen. Ich tue es und erwarte es von allen,
die an Projekten unter meiner Aufsicht arbeiten. Was andere tun ist
deren Sache, solange sie nicht nach Lösung ihrer Probleme fragen müss=
en.
(Die Formulierung hört sich wahrscheinlich härter an als sie gemeint =
ist).

> Richtig finde ich allerdings, dass man solche Konstrukte nicht unnöti=
g einsetzt,
> dass heißt, man sollte seine Sprache schon kennen.

Das ist der Punkt. Wer mit eval() und variablen Variablen umzugehen
weiß, soll sie meinetwegen benutzen. Allerdings wird jemand, der damit
umgehen kann, diese Konstrukte idR nicht brauchen.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Di, 08 Januar 2008 19:47 ] [ ID #1902997 ]

Re: Probleme mit Variablenvariablen

> Dann ist das ein Skript und kein Template. Wie ich schon sagte: YMMV.

Zeig mir eine Definition, die besagt, dass ein Template kein Template
mehr ist, wenn die Werte mittels <?php echo $wert ?> eingebunden wird.
Symfony macht es so und nennt das Template.

Oder verstehe ich Dich falsch?
Jonas Werres [ Di, 08 Januar 2008 23:08 ] [ ID #1902998 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:

>> Dann ist das ein Skript und kein Template. Wie ich schon sagte: YMMV.
>
> Zeig mir eine Definition, die besagt, dass ein Template kein Template
> mehr ist, wenn die Werte mittels <?php echo $wert ?> eingebunden wird.

Die Definition habe ich genannt. Mir ist klar, dass nicht alle einhellig
meiner Meinung sind, daher sagte ich YMMV.

> Symfony macht es so und nennt das Template.
> Oder verstehe ich Dich falsch?

Das verstehst du schon richtig. <?php echo $wert ?> ist in Templates IMO
schon grenzwertig, weil *prinzipiell* Logik im "Template" untergebracht
werden *kann*. Das entzieht der Anwendung die Kontrolle und ist deswegen
im Prinzip schlechtes Design. Oft wird es aus pragmatischen Gründen
trotzdem gemacht, was daran aber nichts ändert.

Ein weiterer Vorteil echter (=3Dpassiver) Templates ist die Unabhängigk=
eit
von irgendeiner Skriptsprache. Ob ein Template mittels PHP, Basic oder
COBOL befüllt wird, geht das Template (und den Web-Designer !=3D
Programmierer) nichts an.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mi, 09 Januar 2008 00:35 ] [ ID #1903000 ]

Re: Probleme mit Variablenvariablen

> Das verstehst du schon richtig. <?php echo $wert ?> ist in Templates IMO
> schon grenzwertig, weil *prinzipiell* Logik im "Template" untergebracht
> werden *kann*. Das entzieht der Anwendung die Kontrolle und ist deswegen
> im Prinzip schlechtes Design.
Warum? Die Datenschicht wird ja auch zumindest teilweise in der gleichen
Sprache gemacht wie der Controlteil und könnte damit theoretisch Logik
enthalten.
Wenn man "könnte theoretisch" aufnimmt, dann gibt es ganz andere
Probleme. Vor allem, weil man ja auch in Smarty PHP reinpressen kann,
wenn man will.

> Ein weiterer Vorteil echter (=passiver) Templates ist die Unabhängigkeit
> von irgendeiner Skriptsprache. Ob ein Template mittels PHP, Basic oder
> COBOL befüllt wird, geht das Template (und den Web-Designer !=
> Programmierer) nichts an.
Natürlich nur, wenn es eine Engine gibt, die diese Templates auch
interpretiert. Wenn man die extra schreiben muss, könnte man (was
zugegebenermaßen ziemlich blöd wäre) auch eine schreiben, die <?php echo
$wert ?> verarbeitet.
Jonas Werres [ Mi, 09 Januar 2008 22:31 ] [ ID #1903846 ]

Re: Probleme mit Variablenvariablen

Jonas Werres schrieb:

>> Das verstehst du schon richtig. <?php echo $wert ?> ist in Templates I=
MO
>> schon grenzwertig, weil *prinzipiell* Logik im "Template" untergebrach=
t
>> werden *kann*. Das entzieht der Anwendung die Kontrolle und ist desweg=
en
>> im Prinzip schlechtes Design.

> Warum? Die Datenschicht wird ja auch zumindest teilweise in der gleiche=
n
> Sprache gemacht wie der Controlteil und könnte damit theoretisch Logi=
k
> enthalten.

Die Datenschicht hat die Aufgabe, das Speichermedium zu abstrahieren.
Der Controller weiß bei korrekter Implementierung nicht, ob die Daten i=
n
einer Datei oder in einer Datenbank stehen, oder ob die Daten live per
Tastatur oder Satellit ankommen.

> Wenn man "könnte theoretisch" aufnimmt, dann gibt es ganz andere
> Probleme. Vor allem, weil man ja auch in Smarty PHP reinpressen kann,
> wenn man will.

Smarty ist IMHO auch keine empfehlenswerte Template-Engine, eben weil
die Templates Logik enthalten (können).

>> Ein weiterer Vorteil echter (=3Dpassiver) Templates ist die Unabhäng=
igkeit
>> von irgendeiner Skriptsprache. Ob ein Template mittels PHP, Basic oder=

>> COBOL befüllt wird, geht das Template (und den Web-Designer !=3D
>> Programmierer) nichts an.

> Natürlich nur, wenn es eine Engine gibt, die diese Templates auch
> interpretiert. Wenn man die extra schreiben muss, könnte man (was
> zugegebenermaßen ziemlich blöd wäre) auch eine schreiben, die <?p=
hp echo
> $wert ?> verarbeitet.

Klar könnte man das. Das verletzt allerdings den semantischen Grundsatz=
=2E
<?php startet den PHP-Interpreter und sonst nichts.
'<?php echo $' als Starttag und '; ?>' als Endtag für Platzhalter sind
semantischer Unsinn.

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Mi, 09 Januar 2008 23:22 ] [ ID #1903849 ]
PHP » de.comp.lang.php.misc » Probleme mit Variablenvariablen

Vorheriges Thema: Wurzelverzeichnis dynamisch setzen
Nächstes Thema: foreach() in php5