Navigation mit übergebenen Variablen?
guelcki
- php
0 David0 Sönke Tesch0 guelcki0 guelcki0 Sönke Tesch0 guelcki0 Stephan Huber0 guelcki
0 Sönke Tesch
0 Kalle
Hallo!
Hab meine Homepage mit PHP realisiert. Zum verlinken von Inhalt habe ich Konstrukte wie <a href="index.php?id=1">... verwendet. Die Variable wurde durch Call By Reference definiert. Dies bald ja nicht mehr möglich, dann gibt es nur noch Call By Value.
Wie realisiere ich denn jetzt die Navigation?
Wenn ich im Quelltext die Variable vorher z.B. mit $id=0; definiere, wird die Variable ja bei jedem erneuten Aufruf der Datei wieder auf 0 gesetzt, und kein Link funktioniert mehr.
Wie kann ich erreichen, dass die Variable nur beim ersten Auruf der Datei definiert wird?
Vielen Dank für die Hilfe
guelcki
P.S.: Meine PHP Kentnisse sind nicht sonderlich fundiert
Hallo
P.S.: Meine PHP Kentnisse sind nicht sonderlich fundiert
macht nichts, jeder hat klein angefangen...
also, mach doch einfach folgendes:
if (empty($id)) $id = 0;
wenn nun $id leer ist, dann wird es auf 0 gesetzt. beim herumnavigieren wird id ja (so habe ich das verstanden) entsprechend dem menü gesetzt, also ist die bedingung falsch und $id wird nicht mehr belegt.
Grüße
David
Hab meine Homepage mit PHP realisiert. Zum verlinken von Inhalt habe ich Konstrukte wie <a href="index.php?id=1">... verwendet.
Igitt, mal abgesehen davon, daß viele Suchmaschinen und die meisten Menschen sich sowas nicht merken (können), ist das Fragezeichen-Anhängsel nie für solche Zwecke gedacht gewesen.
Benutze wenn möglich besser $_SERVER["PATH_INFO"].
Die Variable wurde durch Call By Reference definiert. Dies bald ja nicht mehr möglich, dann gibt es nur noch Call By Value.
Wie realisiere ich denn jetzt die Navigation?
Wie hast Du sie denn bis jetzt realisiert? Ansich sieht die Geschichte normalerweise so aus, daß man (Variablen-/Parameter-) Namen und den Wert an die URL anhängt (wie Du es gemacht hast) und dann im Skript einfach die Variable abfragt. Etwa so
switch ($_GET["id"])
{
case 1: echo "Seite 1"; break;
case 2: echo "Seite 2"; break;
blablabla
}
Was das mit call by sowieso zu tun hat, ist mir etwas schleierhaft.
Die path_info-Variante sähe übrigens so aus:
switch ($_SERVER["PATH_INFO"])
{
case "kontakt": echo "Seite 1"; break;
case "ueber_mich": echo "Seite 2"; break;
blablabla
}
Die URLs in etwa so: "index.php/kontakt" und "index.pho/ueber_mich". index.php muß natürlich nicht index.php heißen ,)
Wenn ich im Quelltext die Variable vorher z.B. mit $id=0; definiere, wird die Variable ja bei jedem erneuten Aufruf der Datei wieder auf 0 gesetzt, und kein Link funktioniert mehr.
Warum definierst Du sie dann? Du willst doch den Wert aus der URL, und den gibt Dir PHP im Feld $_GET. phpinfo() gibt Dir einen Einblick in die wunderbare Welt der vordefinierten Variablen.
Wie kann ich erreichen, dass die Variable nur beim ersten Auruf der Datei definiert wird?
Wieso nur beim ersten Aufruf? Möchtest Du danach keine Navigation mehr haben?
Gruß,
soenk.e
Vielen Dank für eure Hilfe!
An Sönke:
Wenn ich versuche, die Seite über $_SERVER[...] anzusteuern, habe ich ein Problem. Das auslesen des PATH klappt, bloß wenn ich versuche einen Link wie index.php/kontakt auszuführen, meckert Apache. Ich denke, das Apache ein reales Verzeichnis KONTAKT sucht.
Wie konfigurier ich das in diesem Fall?
Nochmal vielen Dank
guelcki
Achso, bisher habe ich einfach einen Link zum Beispiel so genannt: ...index.php?id='kontakt'..., und dann mit if den Inhalt abgefragt. (Im Script habe ich der Variable nie einen Wert zugewiesen.)
Das Problem tritt nun auf, wenn man beim ersten Aufruf nur index.php aufruft. Früher wurde nun im Script trotzdem $id abgefragt. Da es nicht existierte, wurde durch die IF Abfrage die Variable auf $id='' gesetzt. Das nennt man soweit ich weiß Call By Reference. Und das geht jetzt nicht mehr, denn bei Call by Value wird eine nicht existente Variable nicht mehr durch eine IF Abfrage auf '' gesetzt. Das bedeutet PHP meldet einen Fehler, weil eine nicht existente Variable überprüft wurde. Ich muß also mindestens einmal die Variable definieren, und da lag mein Problem.
Wenn du mir erklärst, wie ich das Problem mit dem index.php/KONTAKT löse, habe ich diese Sorgen ja nicht mehr.
Danke
guelcki
Achso, bisher habe ich einfach einen Link zum Beispiel so genannt: ...index.php?id='kontakt'..., und dann mit if den Inhalt abgefragt.
Bitte benutze keine Anführungszeichen in der Adresse. In PHP hilft Dir urlencode(), die Daten zu maskieren. Siehe auch den [pref:t=34030&m=185170] etwas weiter oben.
Das Problem tritt nun auf, wenn man beim ersten Aufruf nur index.php aufruft. Früher wurde nun im Script trotzdem $id abgefragt. Da es nicht existierte, wurde durch die IF Abfrage die Variable auf $id='' gesetzt.
Moment, wenn eine if-Abfrage eine Variable ändert und das nicht soll, dann benutzt Du den falschen Operator. Zum Prüfen auf Gleichheit wird == verwendet, das einfache = ist eine Zuweisung!
Das bedeutet PHP meldet einen Fehler, weil eine nicht existente Variable überprüft wurde. Ich muß also mindestens einmal die Variable definieren, und da lag mein Problem.
Diese Warnung kannst Du, wie hier bereits beschrieben, mit isset() umgehen.
Wenn ich versuche, die Seite über $_SERVER[...] anzusteuern, habe ich ein Problem. Das auslesen des PATH klappt, bloß wenn ich versuche einen Link wie index.php/kontakt auszuführen, meckert Apache. Ich denke, das Apache ein reales Verzeichnis KONTAKT sucht.
Nanu? Er sucht zwar "kontakt" und findet es nicht, wühlt sich dann aber weiter nach oben und stolpert über das Skript. Ansich sollte das also automatisch funktionieren, siehe http://kino-fahrplan.de/privat/st/self/index.php/tralala/blablabla. Das Skript enthält nur
<?php
phpinfo(INFO_VARIABLES);
?>
Als einzige Möglichkeit fällt mir da eine Webserver-Einstellung namens AcceptPathInfo ein (http://httpd.apache.org/docs-2.0/mod/core.html#acceptpathinfo). Gibt's aber erst beim (noch selten) vertretenen Apache 2.
Gruß,
soenk.e
Zuerst mal: if ($xx==...)setzt die Variable nur, wenn sie nicht vorher definiert wurde, das Verfahren nennt man Call by Reference. Das bedeutet, wenn eine Variable ausgelesen wird, ohne dass sie vorher definiert wurde, wird sie mit '' definiert. Das ist gewollt so, und ist eine Art der Variablen Definition.
Aber in der neuesten PHP Version, wird Call by Reference nicht mehr unterstützt, jetzt geht nur noch Call by Value, also Variablen MÜSSEN zuerst mit $xx= gesetzt werden.
Zweitens: Hab mich geirrt, Apache sucht kein Verzeichnis, sondern meldet mir einen Internal Server Error, wenn ich zum Beispiel index.php/usdfg aufrufe. Aus der Log Datei sehe ich, dass der Error vom PHP Interpreter herrührt. Der unterstützt bei mir also diese Methode nicht. Nutze die WAMP Installation (PHP läuft in dieser als CGI)
Trotzdem vielen Dank für deine Hilfe
guelcki
Hallo guelcki,
Zuerst mal: if ($xx==...)setzt die Variable nur, wenn sie nicht vorher definiert wurde, das Verfahren nennt man Call by Reference.
Das bedeutet, wenn eine Variable ausgelesen wird, ohne dass sie vorher definiert wurde, wird sie mit '' definiert. Das ist gewollt so, und ist eine Art der Variablen Definition.
Ich weiss nicht, wo Du das her hast, pass by reference oder value sind zwei Methoden, um eine Variable an eine Funktion zu übergeben. Da Du nichts von Funktionen in Deinen Seiten erwähnst, hast Du da wohl was falsch verstanden. (Call time pass by reference ist deprecated, soweit ich weiss).
Meinst Du nicht eher die Einstellung für "register-globals", d.h. das in neueren PHP Versionen die per GET oder POST übermittelten Parameter nicht mehr automatisch in gleichnamige Variablen umgewandelt werden, und daraus resultiert Dein Problem?
Viele Grüße
Stephan
Kann sein, dass ich damals im Informatikunterricht nicht so richtig aufgepasst habe, aber auf jeden Fall ging das mit der automatischen Erstellung von nicht definierten Variablen in PHP. Bei meiner Suse 8.0 Version funktioniert das auch noch so.
Zu registers-global: Variablen die ich z.B. mit index.php?id=1 übergebe, liest meine Windows PHP Version aus. Nur wenn ich das mit dem angestellten /xxx probiere, funktioniert das unter Windows nicht.
Bis danne
guelcki
Zuerst mal: if ($xx==...)setzt die Variable nur, wenn sie nicht vorher definiert wurde, das Verfahren nennt man Call by Reference. Das bedeutet, wenn eine Variable ausgelesen wird, ohne dass sie vorher definiert wurde, wird sie mit '' definiert. Das ist gewollt so, und ist eine Art der Variablen Definition.
Aber in der neuesten PHP Version, wird Call by Reference nicht mehr unterstützt, jetzt geht nur noch Call by Value, also Variablen MÜSSEN zuerst mit $xx= gesetzt werden.
Nein, da hast Du etwas falsch verstanden (oder es wurde falsch erklärt:). Du kannst auch in den neueren PHP-Versionen auf nicht-existierende Variablen zugreifen. Der Unterschied wird vielmehr sein, daß in der PHP-Konfiguration eine Einstellung geändert wurde, so daß die Warnung vor diesen Zugriffen (bzw. Warnungen allgemein) nicht mehr verschluckt werden.
Es handelt sich hier auch nur um eine Warnung, weil es zwar prinzipiell etwas unsauber ist, etwas zu benutzen, von dem man keine Ahnung hat, was drin ist, aber im Falle von PHP kein allzu schwerwiegender Fehler, da PHP Variablen automatisch "leert" (wie Du ja beschrieben hast).
Worum es aber eigentlich geht:
Wenn es um "by reference" und "by value" geht, dreht es sich eigentlich immer nur um die Möglichkeit, Variablen an Funktionen zu übergeben ("by reference") oder nur ihren Wert ("by value"). Und hier gibt es dann auch die von Dir wahrscheinlich befürchtete Einschränkung:
function test($x)
{
$x++;
};
$a="1";
test(&$a);
Dieses Skript wird mit der Warnung
"Call-time pass-by-reference has been deprecated - argument passed
by value; If you would like to pass it by reference, modify the
declaration of test()."
quitiert. Es ist also nicht mehr standardmäßig möglich, eine Variablenreferenz ('test(&$a)', man beachte das Und-Zeichen & vor $a) an eine Funktion zu übergeben, sondern nur noch den Wert einer Variablen. Letzteres passiert, wenn test() mit $a, also ohne &, aufgerufen wird.
Die Alternative, auf die in der Warnung hingewiesen wird, ist die Übernahme der Referenz in die Funktionsdeklaration:
function test(&$x)
Hier wird dann nicht mehr der Wert einer Variable übernommen, sondern $x wird zu einem Alias für die übergebene Variable $a (und verändert dementsprechend nicht nur den Inhalt von $x in der Funktion, sondern gleichzeitig auch jenen von $a im aufrufenden Code).
Zweitens: Hab mich geirrt, Apache sucht kein Verzeichnis, sondern meldet mir einen Internal Server Error, wenn ich zum Beispiel index.php/usdfg aufrufe. Aus der Log Datei sehe ich, dass der Error vom PHP Interpreter herrührt. Der unterstützt bei mir also diese Methode nicht. Nutze die WAMP Installation (PHP läuft in dieser als CGI)
Sehr merkwürdig. Am cgi-handler vom Apache kann es eigentlich nicht liegen, schließlich ist erstens PATH_INFO eine Standard-CGI-Variable (siehe http://hoohoo.ncsa.uiuc.edu/cgi/env.html) und kommt der Fehler zweitens Deiner Aussage nach von PHP. Daß der PHP-Interpreter die CGI-Variablen nicht auslesen kann, kommt mir allerdings ebenso extrem spanisch vor. Was ist denn das für eine Fehlermeldung genau?
Gruß,
soenk.e
Wie kann ich erreichen, dass die Variable nur beim ersten Auruf der Datei definiert wird?
<?
$id = ($id) ? $id : 0;
?>
Wenn $id übergeben wird, nimm den Wert. Wenn $id fehlt (beim ersten Aufruf), setze ihn auf Null.
Gruß aus Worms, Kalle.