übergebenes Array in Link verpacken
Cornelia K.
- php
Hi all
Ich stehe wohl auf der Leitung. Könnte mir bitte jemand sagen, was ich falsch mache? Hier die Aufgabenstellung:
Ich habe auf seite1.php ein Array "tierdetail", mit beispielsweise folgendem Inhalt: Katze, Hund.
Das Array mit dem Namen "tierdetail" wird korrekt via Formular (Checkbox) an seite2.php übergeben.
Jetzt brauche ich diese Info noch auf seite3.php. Folgenden Link habe ich dazu gemacht: <a href="seite3.php?tierdetail[]=<? echo"$tierdail"; ?>">Link</a>.
Das funktioniert aber nicht. Das Array ist dann gemäss print_r($tierdetail) leer!!??
Danke für jeden Hinweis.
Liebe Grüsse
Cornelia
Hallo Cornelia,
Jetzt brauche ich diese Info noch auf seite3.php. Folgenden Link habe ich dazu gemacht: <a href="seite3.php?tierdetail[]=<? echo"$tierdail"; ?>">Link</a>.
Hast du dir mal angeguckt, wie der erzeugt Link aussieht? Dort müsste im HTML-Quelltext so etwas stehen wie <a href="seite3.php?tierdetail[]=Array">Link</a>, da echo bei Arrays nur das Wort Array ausgibt. Es ist leicht einzusehen, dass dabei keine Informationen über die Elemente des Arrays vorhanden sind.
Ich würde dir dazu raten Sessions zu verwenden. Ansonsten musst du mit foreach über das Array iterieren und jedes Element einzeln mit "tierdetail[]=" kombinieren, dabei wird aber der URL-String schnell lang und unübersichtlich. Außerdem kann dann ein Besucher die Daten manipulieren, das ist häufig nicht erwünscht.
Das funktioniert aber nicht. Das Array ist dann gemäss print_r($tierdetail) leer!!??
Du solltest besser $_GET['tierdetail'] verwenden, da die Variante $tierdetail nur funktioniert, wenn die Konfigurationsoption register_globals aktiviert ist, was nicht zu empfehlen ist. Ab PHP 6 wird diese Möglichkeit deswegen auch komplett verschwinden.
Schöne Grüße,
Johannes
echo $begrüßung;
Ich würde dir dazu raten Sessions zu verwenden. Ansonsten musst du mit foreach über das Array iterieren und jedes Element einzeln mit "tierdetail[]=" kombinieren, dabei wird aber der URL-String schnell lang und unübersichtlich. Außerdem kann dann ein Besucher die Daten manipulieren, das ist häufig nicht erwünscht.
Abgesehen davon, dass die Session-Methode die vermutlich vernünftigere ist, gibt es unter PHP auch noch ein paar Möglichkeiten, ohne foreach die Daten in die URL zu bringen:
Für einfache Fälle tut es vielleicht ein implode('eindeutiges_trennzeichen', $array). Das kann man beim Empfänger wieder explodieren lassen.
Auf jeden Fall aber kann man komplexe Datentypen serialisieren und auf der anderen Seite mit unserialize() wiederherstellen.
Es ist aber in allen Fällen zu beachten, dass es sich bei einer URL um einen eigenen Kontext handelt, für den die Daten zu behandeln sind. urlencode() ist die dafür vorgesehene Funktion.
Außerdem kann es noch sein, dass die URL in einen HTML-Kontext eingebunden wird, dann wäre die URL auch noch für den HTML-Kontext zu behandeln: htmlspecialchars().
So ergibt sich am Ende:
echo '<a href="', htmlspecialchars('ziel?parameter=' . urlencode(serialize($array))), '">Linktext</a>';
Die Transport-Maskierungen für den HTML- und URL-Kontext werden vom Browser bzw. von PHP entfernt, so dass auf der Empfängerseite nur noch unserialize() auf $_GET['parameter'] angewendet werden muss, um das Array wiederherzustellen.
Obendrein kann einem noch das PHP-Feature Magic Quotes in die Quere kommen, doch das kann man deaktivieren bzw. seine Auswirkungen rückgängig machen.
echo "$verabschiedung $name";
Ich würde dir dazu raten Sessions zu verwenden.
Das ist wohl das Beste. Danke für den Hinweis! ;-)
Ich habe es nun mit $_SESSION versucht. Leider klappt es noch immer nicht ganz.
Aus dem Formular (Checkbox) auf seite1.php wird ein Array gebildet. Auf der seite2.php kann ich es mit print_r($tierdetail) sehen:
Array ( [0] => Katze [1] => Hund )
Jetzt muss das Array via Link auf der seite3.php gelangen. Hier der Code dazu:
session_start();
$_SESSION=$tierdetail;
echo "<a href='seite3.php'>seite3</a> ";
Auf der seite3.php kommt jetzt die Ausgabe:
session_start();
print_r($_SESSION);
Nur erscheint keine Ausgabe!!
Schreibe ich aber auf seite2.php vor der Session-Variable folgenden
Code, dann funktioniert es:
$tierdetail = array("0" => "Katze", "1" => "Hund");
Das Problem liegt meines Erachtens in dem aus seite1.php übergebenen
Array $tierdetail. Nur wo genau? Muss ich den Inhalt des Arrays erst auslesen und neu bilden?
Hallo Cornelia,
$_SESSION=$tierdetail;
echo "<a href='seite3.php'>seite3</a> ";
Mit error_reporting auf E_ALL gesetzt (was man beim Entwickeln _immer_ tun sollte) bekommt man ungefähr folgende Fehlermeldungen:
Notice: Unknown: Skipping numeric key 1. in Unknown on line 0
Notice: Unknown: Skipping numeric key 0. in Unknown on line 0
Der Grund dafür ist, dass du für das Array $_SESSION nur Strings als Indizes verwenden darfst. Du solltest $tierdetail deswegen auch nicht direkt der Variable $_SESSION zuweisen, sondern sie dem Array, wofür die Variable $_SESSION steht hinzufügen. Richtig gewesen wäre also:
$_SESSION['tierdetail'] = $_REQUEST['tierdetail'];
Ich habe $_REQUEST['tierdetail'] statt $tierdetail verwendet, denn die Variante, dass Formulardaten in normalen Variablen stehen funktioniert nur, wenn register_globals in der Konfiguration aktiviert ist, wovon von vielen Seiten abgeraten wird und was auch in zukünfitgen PHP-Versionen komplett abgeschafft wird. Stattdessen sollte man die superglobalen vordefinierten Array $_GET, $_POST, $_COOKIE oder $_REQUEST verwenden.
$tierdetail = array("0" => "Katze", "1" => "Hund");
Der kleine aber feine Unterschied liegt darin, dass du hier Strings "0" und "1" statt Zahlen als Array-Indizes verwendest.
Schöne Grüße,
Johannes