Übergeben eines Arrays mithilfe eines versteckten HTML-Formularelements

78

Ich versuche, ein Array in einem versteckten Feld zu veröffentlichen und möchte dieses Array nach dem Absenden eines Formulars in PHP abrufen.

$postvalue = array("a", "b", "c");
<input type="hidden" name="result" value="<?php echo $postvalue; ?>">

Nach dem Drucken des angegebenen Werts wird jedoch nur eine Array-Zeichenfolge angezeigt. Wie kann ich das lösen?

Shrishail
quelle
1
Sie müssen es auf irgendeine Weise serialisieren. Überprüfen Sie die Funktionen serialize und json_encode. Ich würde empfehlen, mit dem json_encode zu arbeiten.
Gazler

Antworten:

118

Verwenden:

$postvalue = array("a", "b", "c");
foreach($postvalue as $value)
{
    echo '<input type="hidden" name="result[]" value="'. $value. '">';
}

Und Sie erhalten $_POST['result']als Array.

print_r($_POST['result']);
Shakti Singh
quelle
Wird der Name für ein Array von Arrays wie folgt aussehen: name = "result [[]]"?
Samuel Giftson
1
@SamuelGiftson vielleicht so name="result[][]"
Nurkartiko
38

Es gibt hauptsächlich zwei Möglichkeiten, dies zu erreichen:

  1. Serialisieren Sie die Daten auf folgende Weise:

    $postvalue = serialize($array); // Client side
    
    $array = unserialize($_POST['result']; // Server side
    

Und dann können Sie die gebuchten Werte mit unserialisieren unserialize($postvalue). Weitere Informationen hierzu finden Sie in den PHP-Handbüchern .

Alternativ können Sie die Funktionen json_encode()und json_decode()verwenden, um eine JSON-formatierte serialisierte Zeichenfolge abzurufen. Sie können die übertragenen Daten sogar mit verkleinern gzcompress()(beachten Sie, dass dies leistungsintensiv ist) und die übertragenen Daten mit sichern base64_encode()(damit Ihre Daten in sauberen Nicht-8-Bit-Transportschichten überleben). Dies könnte folgendermaßen aussehen:

    $postvalue = base64_encode(json_encode($array)); // Client side

    $array = json_decode(base64_decode($_POST['result'])); // Server side

Eine nicht empfohlene Methode zum Serialisieren Ihrer Daten (aber sehr kostengünstig) besteht darin, sie einfach implode()in Ihrem Array zu verwenden, um eine Zeichenfolge zu erhalten, bei der alle Werte durch ein bestimmtes Zeichen getrennt sind. Auf der Serverseite können Sie dann das Array mit abrufen explode(). Beachten Sie jedoch, dass Sie kein Zeichen für die Trennung verwenden sollten, das in den Array-Werten auftritt (oder es dann maskiert), und dass Sie die Array-Schlüssel mit dieser Methode nicht übertragen können.

  1. Verwenden Sie die Eigenschaften von speziellen benannten Eingabeelementen:

    $postvalue = "";
    foreach ($array as $v) {
      $postvalue .= '<input type="hidden" name="result[]" value="' .$v. '" />';
    }
    

    Auf diese Weise erhalten Sie Ihr gesamtes Array in der $_POST['result']Variablen, wenn das Formular gesendet wird. Beachten Sie, dass hierdurch keine Array-Schlüssel übertragen werden. Sie können dies jedoch erreichen, indem Sie result[$key]als Namen für jedes Feld verwenden.

Jede dieser Methoden hat ihre eigenen Vor- und Nachteile. Was Sie verwenden, hängt hauptsächlich davon ab, wie groß Ihr Array sein wird, da Sie mit all diesen Methoden versuchen sollten, eine minimale Datenmenge zu senden.

Eine andere Möglichkeit, dies zu erreichen, besteht darin, das Array in einer serverseitigen Sitzung zu speichern, anstatt es clientseitig zu übertragen. Auf diese Weise können Sie über die $_SESSIONVariable auf das Array zugreifen und müssen nichts über das Formular übertragen. Schauen Sie sich dazu ein grundlegendes Anwendungsbeispiel für Sitzungen auf php.net an .

s1lence
quelle
Ich musste einfache Anführungszeichen um das valueAttribut verwenden. Andernfalls wurden die Daten beim ersten doppelten Anführungszeichen in der serialisierten Version gekürzt.
VeeK
Ich habe das mit json_encode gemacht. Das zweite Argument für json_decode musste in meinem Fall wahr sein (um assoziatives Array anstelle von StdClass als Standard zurückzugeben)
jamil
21

Sie können serialize und base64_encode auf der Clientseite verwenden. Verwenden Sie danach unserialize und base64_decode auf der Serverseite.

Mögen:

Verwenden Sie auf der Clientseite:

    $postvalue = array("a", "b", "c");
    $postvalue = base64_encode(serialize($array));

   // Your form hidden input
   <input type="hidden" name="result" value="<?php echo $postvalue; ?>">

Verwenden Sie auf der Serverseite:

    $postvalue = unserialize(base64_decode($_POST['result']));
    print_r($postvalue) // Your desired array data will be printed here
Kabir Hossain
quelle
Dies sollte die richtige Antwort sein, besser als foreach zu verwenden, können Sie Objekte in Arrays und mehrstufige Arrays übergeben
Leonardo Sapuy
Diese Antwort bekommt nicht genug Kredit. Nur die Verwendung von serialize () oder json_encode () sind Dinge, die die meisten Leute versucht haben und die aufgrund von Anführungszeichen scheitern, wenn sie hier ankommen. Diese Antwort geht noch einen Schritt weiter und codiert sie so, dass dieses Problem auf elegante Weise irrelevant wird. Bravo!
Kaji
Danke, genau das habe ich gesucht. Eine kleine Bemerkung. $ postvalue = base64_encode (serialize ($ array)); sollte $ postvalue = base64_encode sein (serialize ($ postvalue));
Anatak
9

Entweder serialisieren:

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo serialize($postvalue); ?>">

bei Empfang: unserialize($_POST['result'])

Oder implodieren:

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo implode(',', $postvalue); ?>">

Bei Erhalt: explode(',', $_POST['result'])

Ēriks Daliba
quelle
serialize kann Ihre Anführungszeichen oder Klammern durcheinander bringen und mit HTML verwechseln. Ich würde akzeptierte Antwort verwenden
Zachu
1

Wenn Sie ein Array veröffentlichen möchten, müssen Sie eine andere Notation verwenden:

foreach ($postvalue as $value){
<input type="hidden" name="result[]" value="$value.">
}

Auf diese Weise haben Sie drei Eingabefelder mit dem Namen result [] und wenn veröffentlicht, $_POST['result']wird ein Array

Nicola Peluchetti
quelle
1
<input type="hidden" name="item[]" value="[anyvalue]">

Lassen Sie es in einem wiederholten Modus sein, es wird dieses Element in der Form als Array veröffentlichen und die verwenden

print_r($_POST['item'])

Um den Artikel abzurufen

Diagboya Ewere
quelle
1

Es ist besser, zuerst in eine JSON-Zeichenfolge zu codieren und dann beispielsweise in umgekehrter Reihenfolge mit Base64 zu codieren: Verwenden Sie zuerst die Funktionen base64_decode und dann json_decode. So stellen Sie Ihr PHP-Array wieder her.

heximal
quelle
-1

Sie können es so machen:

<input type="hidden" name="result" value="<?php foreach($postvalue as $value) echo $postvalue.","; ?>">
Genesis
quelle
6
Oder benutze einfach implode ;-)
Alex