Assoziative Arrays dynamisch bilden?
Stefan Welscher
- php
0 Tom0 Stefan Welscher0 Tom
Moin moin,
ich hab ein PHP-Script welches über die Konsole gestartet wird und als Übergabeparameter die Variablen bekommt, wie sie normalerweise in der URL-Vorkommen (ganz ursprünglich kommen die Variablen auch da her, da das PHP-Script von einem Perl-Script gestartet wird, welches von einem PHP-Script eines Webservers gestartet wird (is kompliziert, aber unwichtig)).
Das PHP-Script hat die Aufgabe die über die Konsole übergebenen Variablen dem anschließend aufgerufenen weiteren PHP-Script zur Verfügung zu stellen.
Das ganze sieht so aus:
<?
$coca_file=$argv[1];
$arg_array=split("[?&]",$coca_file);
$file_arg=1;
foreach ($arg_array as $arg)
{
if ($file_arg) { $file_arg=0; $coca_file=$arg; continue; }
$arg_subarray=split("=",$arg);
if (preg_match("/^(.*?)\[(.*?)\]/",$arg_subarray[0],$result_array))
{
$var=$result_array[1];
$key=$result_array[2];
$value=$arg_subarray[1];
if (!is_array($$var)) { $$var=Array(); }
$$var[$key]=$value;
print "\n<br>\nDEBUG:".$var."[".$key."]=".$value.";\n<br>";
}
else
{
$var=$arg_subarray[0];
$value=$arg_subarray[1];
$$var=$value;
}
}
print_r(get_defined_vars());
include ($coca_file);
?>
Die Übernahme der Variablen klappt soweit problemlos, aber wenn Arrays ins Spiel kommen macht das Skript Blödsinn. Die Zuweisung von $var, $key und $value passt aber.
Die Frage ist also: Wie mache ich aus den drei Variablen $var, $key und $value ein Array-Element $$var[$key]=$var (ohne evtl. bestehende Elemente des Arrays zu eliminieren).
Hello,
Die Übernahme der Variablen klappt soweit problemlos, aber wenn Arrays ins Spiel kommen macht das Skript Blödsinn. Die Zuweisung von $var, $key und $value passt aber.
Die Frage ist also: Wie mache ich aus den drei Variablen $var, $key und $value ein Array-Element $$var[$key]=$var (ohne evtl. bestehende Elemente des Arrays zu eliminieren).
Das sieht mir verflixt danach aus, als wolltest Du das mühsam abgelegte "register globals" innerhalb PHP wieder implementiern. Das ist keine gute Idee.
Lege einen Array-Namen fest.
$_mein_sammelarray = array();
damit ist das deklariert und auch gleich definiert (initialisiert) und kann nicht aus Versehen von sonstwo eingeschleppt oder injiziert werden.
In diesem Array kannst Du nun alle Parameter aus der URi sammeln.
Dafür stellt PHP diverse Hilfsfunktionen zur Verfügung
Das sollte eigentlich schon genügen für Deine Zwecke.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Absolut genial :daumen: !
Konnte den SC jetzt auf 10 Zeilen reduzieren:
<?
$coca_file=$argv[1];
$arg_array=split("[?&]",$coca_file);
$file_arg=1;
foreach ($arg_array as $arg)
{
if ($file_arg) { $file_arg=0; $coca_file=$arg; continue; }
parse_str($arg);
}
include ($coca_file);
?>
Hat btw. nix mit register_globals zu tun, auch wenn ich register_globals immer verwende ;) .
Hello,
Hat btw. nix mit register_globals zu tun, auch wenn ich register_globals immer verwende ;)
Das solltest Du Dir nochmal überlegen, ob Dui das das auch weiterhin verwenden willst.
Hier gibt es bestimmt auch noch ein paar nette Mitleser, die Dich nochmal eindringlich über die Risiken aufklären können.
Und die von Dir verwendeten Methoden, Arrays aus dem Environment sozusagen freien Einlass ins Script zu gewähren, ist ebenso kritisch.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg