Formulareingaben PHP nicht richtig
Stefan Hagemann
- php
0 Guy Gaz0 Stefan Hagemann
0 ChrisB0 Der Martin
0 Stefan Hagemann0 Guy Gaz0 Cheatah0 EKKi
Hallo,
ich arbeite gerade an einem größeren PHP Script. Hierbei habe ich ein 2D Array, dass so aussieht:
$array[0]["ID"] = 2;
$array[0]["Name"] = "Sebastian";
$array[0]["IP"] = "127.0.0.1";
$array[1]["ID"] = 3;
$array[1]["Name"] = "Jan";
$array[1]["IP"] = "127.1.0.1";
etc.
Ich übergebe das ganze so in meinem Formular:
echo "<input type='hidden' name='Info' value='$this->array'>";
Und so übernehme ich es dann im nächsten Script:
if(isset($_POST['Info'])) {
var_dump($_POST['Info']);
}
Lasse ich mir vor dem hidden Feld mit var dump das Array ausgeben, ist es wie oben beschrieben. Lasse ich es mir nach der Übertragung ausgeben, ist in $_POST['Info'] nur String(5) => "Array" gespeichert. Wieso bitte?
Danke für eure Hilfen. :)
Hallo!
echo "<input type='hidden' name='Info' value='$this->array'>";
Was ergibt denn an *dieser* Stelle im Script ein
echo ($this->array)
~~~?
GG
--
"If I do not seek to understand what is happening here
- then I've got peanuts in my head!"
(I. Hosein)
Hallo!
echo "<input type='hidden' name='Info' value='$this->array'>";
Was ergibt denn an *dieser* Stelle im Script ein
echo ($this->array)
>
>
>
>
> GG
Wenn ich das hier eingebe:
echo "Es wird nun übergeben: <br>";
var\_dump($this->array);
echo "<input type='hidden' name='Dead[]' value='" . $this->array . "'>";
echo "Es wird nun übergeben: <br>";
var\_dump($this->array);
Beides mal, sowohl nach und vor dem Feld ist das richtige Array mit den richtigen Werten ausgegeben.
Hi,
Wenn ich das hier eingebe:
echo "Es wird nun übergeben: <br>";
var_dump($this->array);
echo "<input type='hidden' name='Dead[]' value='" . $this->array . "'>";
echo "Es wird nun übergeben: <br>";
var_dump($this->array);Beides mal, sowohl nach und vor dem Feld ist das richtige Array mit den richtigen Werten ausgegeben.
Guy fragte nicht ohne Grund, was eine Ausgabe per *echo* ergibt.
MfG ChrisB
Guy fragte nicht ohne Grund, was eine Ausgabe per *echo* ergibt.
MfG ChrisB
Gut, ich hab jetzt verstanden, warum das ganze so ist, lediglich noch nicht wie man das ganze beheben kann. :D
Hallo!
Gut, ich hab jetzt verstanden, warum das ganze so ist, lediglich noch nicht wie man das ganze beheben kann. :D
Dazu gibt es mehrere Möglichkeiten.
HTML kennt nur Text - Du kannst komplexere Datenstrukturen wie Arrays oder Objekte nicht einfach so im HTML-Kontext verwenden.
Das von Dir benutzte PHP-Array hat mehrere Elemente - die könntest Du *einzeln* an (auch: hidden) Formularelemente als Werte übergeben, oder /serialisiert/ (zusammengefasst und im z.B: PHP-Kontext wiederherstellbar) als Wert ein _eines_ Formularelementes übertragen.
Dein genaues Vorhaben kenne ich aber nicht.
GG
Hallo!
var_dump($this->array);
Du bist leider auf dem Holzweg - ChrisB schrieb _deshalb_ vom Stringkontext und ich riet Dir ein echo, anstatt eines var_dump() zu versuchen.
Der von Dir erwartete Output führt aber auch nicht zu dem von Dir gewünschten Ergebnis.
Was sagt denn nun ein echo?
Ciao
GG
Hi,
echo "<input type='hidden' name='Info' value='$this->array'>";
Lasse ich mir vor dem hidden Feld mit var dump das Array ausgeben, ist es wie oben beschrieben. Lasse ich es mir nach der Übertragung ausgeben, ist in $_POST['Info'] nur String(5) => "Array" gespeichert. Wieso bitte?
Weil ein Array bei der direkten Überführung in einen String-Kontext von PHP immer nur als "Array" ausgegeben wird.
Wenn du dir das ganze etwas genauer angeschaut hättest, dann wäre dir aufgefallen, dass das nicht erst nach der Übertragung geschehen ist, sondern bereits so im value-Attribut deines Formularfeldes drin steht - weil du es so da rein geschrieben hast.
MfG ChrisB
Hallo!
Hi,
echo "<input type='hidden' name='Info' value='$this->array'>";
Lasse ich mir vor dem hidden Feld mit var dump das Array ausgeben, ist es wie oben beschrieben. Lasse ich es mir nach der Übertragung ausgeben, ist in $_POST['Info'] nur String(5) => "Array" gespeichert. Wieso bitte?
Weil ein Array bei der direkten Überführung in einen String-Kontext von PHP immer nur als "Array" ausgegeben wird.
Jetzt warst Du aber der Spielverderber;)
Ciao
GG
Wie soll ich es dann bitte übergeben? Mir fällt nur sowas noch ein:
echo "<input type='hidden' name='Info' value='" . $this->array . "'>";
Und das funktioniert ja auch nicht...
Hi,
echo "<input type='hidden' name='Info' value='$this->array'>";
dass das so nichts wird, weißt du ja nun schon. Was willst du denn eigentlich erreichen? Doch vermutlich, dass dem Script, das die Formulareingaben wieder verarbeitet, das ursprüngliche Array zur Verfügung steht.
Hast du schonmal dran gedacht, eine Session zu verwenden?
Ciao,
Martin
Hi,
echo "<input type='hidden' name='Info' value='$this->array'>";
dass das so nichts wird, weißt du ja nun schon. Was willst du denn eigentlich erreichen? Doch vermutlich, dass dem Script, das die Formulareingaben wieder verarbeitet, das ursprüngliche Array zur Verfügung steht.
Hast du schonmal dran gedacht, eine Session zu verwenden?
Ciao,
Martin
Ja, habe ich. Sessions sind aber aus anderen Gründen nicht möglich. Daher muss ich es irgendwie schaffen, dass das $array einfach wieder übergeben wird und neu verarbeitet werden kann.
Hallo!
Hast du schonmal dran gedacht, eine Session zu verwenden?
Ja, habe ich.
Aus Deinem ursprünglichen Post habe ich das Ansinnen, bereits erhaltene Werte weiterzugeben, nicht so wie Martin heraus lesen *können*, auch wenn ich mir so etwas dachte - er muß Wahsaga-Gene in sich tragen - sorry Martin!
Sessions sind aber aus anderen Gründen nicht möglich.
Welche das sind muß wiederum Martin erraten, oder magst Du es nicht verraten?
Daher muss ich es irgendwie schaffen, dass das $array einfach wieder übergeben wird und neu verarbeitet werden kann.
Dazu bekamst Du bereits Hinweise.
Ciao
GG
Tut mir leid, wenn ich mit Informationen arg haushalte. Ich habe jetzt immerhin hinbekommen, dank eurer Tipps, dass das ganze mit den Funktionen serialize() und unserialize() hinhaut. Funktioniert soweit - das Array wird übergeben. Allerdings immer noch nicht richtig.
array_push($test_class->New_Info,unserialize($_POST['Info']));
Hierbei wird das übergebene Array Info mit unserialize() wieder zusammengepackt und soll dann an das Array New_Info drangehängt werden. Klappt aber nicht.
Die Struktur war ja:
$array[0]["ID"] = 1;
$array[0]["Name"] = "Sebastian";
$array[0]["IP"] = "127.0.0.1";
$array[1]["ID"] = 2;
$array[1]["Name"] = "Jan";
$array[1]["IP"] = "129.2.0.1";
etc.
Nun wird das ganze aber so zusammengepackt, dass $array nur $test_class->New_Info[0] ist. (Wenn es als erstes Element angehängt wird). Das heißt ich kann erst mit $test_class->New_Info[0][0]["ID"] draufzugreifen. Dabei sollte es wie oben angehängt werden. Wie soll ich das bitte lösen? Zum anhängen gibt es ja array_push. Leider nicht für meinen Fall.
Danke!
Hi,
array_push($test_class->New_Info,unserialize($_POST['Info']));
Hierbei wird das übergebene Array Info mit unserialize() wieder zusammengepackt und soll dann an das Array New_Info drangehängt werden. Klappt aber nicht.
Doch, klappt offenbar nach deiner Beschreibung hervorragend.
Nun wird das ganze aber so zusammengepackt, dass $array nur $test_class->New_Info[0] ist. (Wenn es als erstes Element angehängt wird).
Wenn du es nicht als erstes Element in $test_class->New_Info einfügen möchtest, wieso nutzt du dann array_push?
Das heißt ich kann erst mit $test_class->New_Info[0][0]["ID"] draufzugreifen. Dabei sollte es wie oben angehängt werden.
Nein, du willst es offenbar *nicht* anhängen.
Wie soll ich das bitte lösen? Zum anhängen gibt es ja array_push.
Für Zuweisungen gibt es den Operator =
MfG ChrisB
Doch, klappt offenbar nach deiner Beschreibung hervorragend.
Naja, eben nicht 100%. Das Array wird zwar übergeben, bei der Weiterverarbeitung klappt aber nicht alles. (Manchmal schwer das zu erklären).
Nein, du willst es offenbar *nicht* anhängen.
Für Zuweisungen gibt es den Operator =
Nein, ich meinte das etwas anders. Ich möchte nicht mit der Struktur $test_class->New_Info[0][0]["ID"] auf mein Array zugreifen können. Ich möchte weiterhin mit $test_class->New_Info[0]["ID"] zugreifen können. Und ja, ich möchte es anhängen, weil es möglich ist, dass in $test_class->New_Info bereits Werte vorhanden sind und somit die Werte aus $array zusätzlich in $test_class->New_Info in diesem Fall angehängt werden müssen. Aber auch hierbei muss die Struktur $test_class->New_Info[0]["ID"] beibehalten werden, ANSTATT dem zusätzlichen [0]...
Hi,
Doch, klappt offenbar nach deiner Beschreibung hervorragend.
Naja, eben nicht 100%. Das Array wird zwar übergeben, bei der Weiterverarbeitung klappt aber nicht alles. (Manchmal schwer das zu erklären).
array_push hat geklappt, wie vorgesehen.
Dass du damit die falsche Funktion gewählt hast, ist eine andere Sache.
Nein, du willst es offenbar *nicht* anhängen.
Für Zuweisungen gibt es den Operator =Nein, ich meinte das etwas anders.
Ich möchte nicht mit der Struktur $test_class->New_Info[0][0]["ID"] auf mein Array zugreifen können. Ich möchte weiterhin mit $test_class->New_Info[0]["ID"] zugreifen können.
Dann wäre eine einfache Zuweisung des Arrays das einfachste.
Und ja, ich möchte es anhängen, weil es möglich ist, dass in $test_class->New_Info bereits Werte vorhanden sind und somit die Werte aus $array zusätzlich in $test_class->New_Info in diesem Fall angehängt werden müssen. Aber auch hierbei muss die Struktur $test_class->New_Info[0]["ID"] beibehalten werden, ANSTATT dem zusätzlichen [0]...
D.h., wenn schon ein $test_class->New_Info[0]["ID"] vorhanden ist, möchtest du es explizit überschreiben?
Oder möchtest du, dass die nummerischen Indices des hinzugefügten Arrays entsprechend weitergezählt werden?
Letzteres ist nicht ganz so trivial, weil du keinen einfach fortlaufenden Index hast/haben möchtest.
Aber vielleicht solltest du den Aufbau der Datenstruktur noch mal überdenken.
Wenn du die Werte ID, Name und IP in einem assoziativen Unterarray ablegst, dann dürfte damit die Verarbeitung in vielen Fällen leichter fallen.
MfG ChrisB
Hi,
Sessions sind aber aus anderen Gründen nicht möglich.
das finde ich zwar nur fast so merkwürdig wie Deinen Ansatz, diesen Umstand zu kompensieren; aber hast Du es schon mal mit Serialisierung versucht?
Cheatah
Hallo!
hast Du es schon mal mit Serialisierung versucht?
Dazu gab es bereits Hinweise - vielleicht testet OP diese gerade..
Ciao
GG
Hi,
aber hast Du es schon mal mit Serialisierung versucht?
Deine Glaskugel-Reinigungsfachkraft ist ihr Geld nicht wert.
(Sollte es nicht daran liegen, sondern daran, dass deine Glaskugel nur in die Zukunft, nicht aber in die Vergangenheit schauen kann, will ich über die Fähigkeiten besagter Reinignungsfachkraft nichts gesagt haben.)
MfG ChrisB
Mahlzeit Stefan Hagemann,
Hast du schonmal dran gedacht, eine Session zu verwenden?
Ja, habe ich. Sessions sind aber aus anderen Gründen nicht möglich.
Aha. Dass Du nicht verraten willst, *warum* das so ist, hilft den Leuten, die Dir wiederum helfen wollen/könnten, aber auch nicht weiter.
Sei's drum - nächste Frage: dass Du Dich bei Deinem aktuellen Vorgehen auf Gedeih und Verderb darauf verlässt, dass Werte, die *von außen* unkontrolliert in Dein verarbeitetendes Skript eingekippt werden und die Du offenbar ungeprüft weiterverarbeiten willst, auch die richtige Struktur sowie korrekte und gültige Werte besitzen, ist Dir bewusst? ... Oder anders gefragt: Du weißt schon, dass bis zum Beweis des Gegenteils stets "ALL INPUT IS EVIL!" gilt?
MfG,
EKKi