Umstellung auf PHP5...
SebastianJu
- php
0 Cyx230 SebastianJu0 Cyx23
0 dedlfix
0 Cybaer0 SebastianJu0 Sven Rautenberg0 Cybaer
0 Ingo Turski
Hallo,
mein Provider hat von PHP4 auf 5 umgestellt und nun funktioniert meine Navigation nicht mehr. Ich habe ein wenig getestet und scheinbar kommt er damit nicht zurecht:
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
Da gibt er einfach nichts zurück.
Während bei meiner lokalen Version dasjenige zurückgegeben wird was hinter dem .php/ steht passiert das online nicht. Doch darüber wird die entsprechende Kategorie aus der Datenbank herausgesucht.
Ist der Befehl veraltet? Wie lautet denn die Alterntive?
Freundliche Grüße!
Sebastian
Hallo,
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
Da gibt er einfach nichts zurück.
Nichts? $aPath_info sollte hier "Array" ausgeben.
Grüsse
Cyx23
Ja, Array gibt es zurück... Ich schreib mal bei der anderen Antwort mehr...
Grüße!
Sebastian
Hallo,
Ja, Array gibt es zurück... Ich schreib mal bei der anderen Antwort mehr...
du hast ja auch ein Array erzeugt.
Vielleicht hat sich die Ausgangsvaribale geändert o.ä. und $aPath_info[0]
enthält den gewünschten Wert, bzw. $_SERVER['PHP_SELF'] reicht hier?
Grüsse
Cyx23
echo $begrüßung;
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
Ist der Befehl veraltet?
Nein.
Wie lautet denn die Alterntive?
echo "$verabschiedung $name";
Der Pfad lautet zB http://www.software-...de/...-cat.php/Impressum-...-VBA
Damit wird normalerweise alles hinter php/ ausgelesen und darüber dann die Kategorie bestimmt. Ist halt ein Pfad mit Keywords.
Der entsprechende Codeteil lautet:
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
$path_info=$aPath_info[1];
Normalerweise ist nun in der letzten Variable drin:
Impressum-...-VBA
Ist es aber nun nicht mehr.
Testcode online:
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
$path_info=$aPath_info[1];
echo "A".$path_info."B".$_SERVER['PHP_SELF']."C".$aPath_info;
ergibt:
AB/sebastian-jurk-cat.phpCArray
Also unter A ist nichts und php_self ist nur ein Bruchstück...
- Alle Fehlermeldungen einschalten, auch die sonst unterdrückten Notice-Meldungen: error_reporting auf E_ALL stellen (und display_error auf on).
Wird das im Php-Code gemacht? Ist mir noch nie begegnet. Tritt wie gesagt nur online auf.
- Kontrollausgaben machen: echo oder besser var_dump(). Was steht denn in $_SERVER['PHP_SELF'] drin?
- phpinfo() aufrufen und nachschauen, was alles in $_SERVER steht.
Welche Infos sind denn da interessant?
Grüße!
Sebastian
Hallo
Testcode online:
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
$path_info=$aPath_info[1];
echo "A".$path_info."B".$_SERVER['PHP_SELF']."C".$aPath_info;ergibt:
AB/sebastian-jurk-cat.phpCArray
Also unter A ist nichts und php_self ist nur ein Bruchstück...
Was soll da auch sein? Normalerweise ist anzunehmen, dass der Pfad zu einer Datei mit der Endung ".php" mit der Endung ".php" endet. Was soll dahinter (alles vor ".php" ist $path_info[0], alles danach (was auch immer) $path_info[1]) deiner Meinung nach noch kommen?
Wundert mich eher, dass es bisher funktionierte.
- phpinfo() aufrufen und nachschauen, was alles in $_SERVER steht.
Welche Infos sind denn da interessant?
Für $_SERVER['PHP_SELF'] z.B. alles, was in $_SERVER drinsteht. Warum folgst du nicht einfach dem Rat und schaust einfach, was dich erwartet?
Tschö, Auge
echo $begrüßung;
Der Pfad lautet zB http://www.software-...de/...-cat.php/Impressum-...-VBA
Damit wird normalerweise alles hinter php/ ausgelesen und darüber dann die Kategorie bestimmt. Ist halt ein Pfad mit Keywords.
Du nutzt also PATH_INFO, dann schau doch in $_SERVER['PATH_INFO'] nach.
Testcode online:
$aPath_info=explode(".php/",$_SERVER['PHP_SELF']);
$path_info=$aPath_info[1];
echo "A".$path_info."B".$_SERVER['PHP_SELF']."C".$aPath_info;ergibt:
AB/sebastian-jurk-cat.phpCArray
var_dump($aPath_info) sollte anzeigen, dass dein Array aus nur einem Element besteht. Du siehst ja auch, dass in $_SERVER['PHP_SELF'] nichts mehr nach dem .php/ steht, das man noch abspalten kann.
Arrays gibt man besser mit print_r() oder var_dump() aus. Dann erhält man auch mehr Information als nur ein "Array".
Also unter A ist nichts und php_self ist nur ein Bruchstück...
Anscheinend hat sich der Inhalt von $_SERVER['PHP_SELF'] in dieser Version oder Konfiguration geändert. Teilweise sind die Inhalte von $_SERVER von der konkreten Umständen des Servers und der Einbindung PHPs in diesen abhängig.
- Alle Fehlermeldungen einschalten, auch die sonst unterdrückten Notice-Meldungen: error_reporting auf E_ALL stellen (und display_error auf on).
Wird das im Php-Code gemacht? Ist mir noch nie begegnet. Tritt wie gesagt nur online auf.
Auf der Testmaschine steht das idealerweise irgendwo in einer übergreifenden PHP-Konfiguration: php.ini oder .htaccess (dort als Zahlenwert). Ansonsten kann man beide Direktiven auch noch im Script setzen. error_reporting mit der gleichnamigen Funktion und display_errors über ini_set().
Notice-Meldungen werden beispielsweise ausgegeben, wenn du auf Variablen zugreifen willst, die gar nicht existieren, beispielsweise aufgrund von Tippfehlern oder falschen Annahmen. Im obigen Beispiel sollte $aPath_info[1] angemeckert werden, weil es das Element nicht gibt.
- phpinfo() aufrufen und nachschauen, was alles in $_SERVER steht.
Welche Infos sind denn da interessant?
Schau rein, besonders im letzten Abschnitt, dann siehst du, in welchen Feldern von $_SERVER die für dich interessanten Werte drinstehen.
echo "$verabschiedung $name";
Hi,
Der Pfad lautet zB http://www.software-...de/...-cat.php/Impressum-...-VBA
da frage ich doch gleich mal: warum?
Aus SEO-Sicht kannst Du statt dem / auch ein ? setzen
Davon abgesehen ist das Aufsplitten in ein Array völlig überflüssig.
$path_info = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if(!$path_info || $_SERVER['PHP_SELF']==$_SERVER['SCRIPT_NAME']) echo 'keine Auswahl';
else echo $path_info;
reicht völlig und wirft beim Aufruf ohne / auch keine Notice.
freundliche Grüße
Ingo
Hi,
da frage ich doch gleich mal: warum?
Es läßt sich damit ohne Änderung auch ein statischer Dateiname bilden. Das und ...
Aus SEO-Sicht kannst Du statt dem / auch ein ? setzen
... der Umstand, daß dem nicht immer so war oder sein muß, sowie kleinere Gründe lassen mich / seit je her favorisieren
Davon abgesehen ist das Aufsplitten in ein Array völlig überflüssig.
Stimmt. Und mit $path_info=$_SERVER['PATH_INFO'];
geht es sogar noch kürzer! ;-)
Gruß, Cybaer
echo $begrüßung;
Stimmt. Und mit
$path_info=$_SERVER['PATH_INFO'];
geht es sogar noch kürzer! ;-)
$_SERVER['PATH_INFO'] enthält doch bereits den gesuchten Wert. Warum noch einmal umkopieren?
echo "$verabschiedung $name";
Hi,
$_SERVER['PATH_INFO'] enthält doch bereits den gesuchten Wert. Warum noch einmal umkopieren?
Ach, ach was! :)
Gruß, Cybaer
Hi,
Und mit
$path_info=$_SERVER['PATH_INFO'];
geht es sogar noch kürzer! ;-)
allerdings mit führendem / und im Falle des Aufrufs ohne / kommt eine Notice: Undefined index: PATH_INFO in ...
Und viel kürzer wäre dann
if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']!='/') echo substr($_SERVER['PATH_INFO'],1);
else echo 'keine Auswahl';
auch nicht.
freundliche Grüße
Ingo
Hi,
if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']!='/') echo substr($_SERVER['PATH_INFO'],1);
else echo 'keine Auswahl';
> auch nicht.
`$path_info=(empty($_SERVER['PATH_INFO']))?'':substr($_SERVER['PATH_INFO'],1);`{:.language-php} ist immer noch deutlich kürzer. ;-)
Gruß, Cybaer
PS: Bei mir "real" wäre es theoretisch ein `$path_info=@ifsetor($_SERVER['PATH_INFO']);`{:.language-php} - praktisch packe ich den Wert aber eh immer in eine Konstante. :) Wobei ich dabei, je nach Verfügbarkeit, entweder auf "/" oder "?" als Trennzeichen setzen kann, damit die Scripte ohne Änderung Server-übergreifend laufen.
--
Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
Moin!
Der Pfad lautet zB http://www.software-...de/...-cat.php/Impressum-...-VBA
da frage ich doch gleich mal: warum?
Aus SEO-Sicht kannst Du statt dem / auch ein ? setzen
Aber "Cool URIs don't change" - dein Vorschlag geht also vollkommen in die falsche Richtung, weil er eine unnötige Veränderung bedeuten würde.
- Sven Rautenberg
Hi,
Aber "Cool URIs don't change" - dein Vorschlag geht also vollkommen in die falsche Richtung, weil er eine unnötige Veränderung bedeuten würde.
Zumindest im konkreten Fall.
Aber: Ich habe auch mal für einen Kunden eine "/"-Applikation geschrieben, und später wechselte der Kunde dann von Unix/Apache auf Windows/IIS (auf "Wunsch" des Mutterkonzerns) - und ich also die Applikation von "/" auf "?" (seitdem arbeiten meine Scripts, bzw. das ihnen allen zugrundeliegende Framework, automatisch mit "/" oder mit "?" - je nachdem, was der Server hergibt).
Im Sinne des "Cool URIs don't change" wäre es also (heutzutage) durchaus sinnvoller, von vorneherein und ausschließlich das überall verfügbare "?" zu verwenden. Bringen mich natürlich keine 10 Pferde zu ... ;-)
Gruß, Cybaer
echo $begrüßung;
Aber: Ich habe auch mal für einen Kunden eine "/"-Applikation geschrieben, und später wechselte der Kunde dann von Unix/Apache auf Windows/IIS (auf "Wunsch" des Mutterkonzerns) - und ich also die Applikation von "/" auf "?" (seitdem arbeiten meine Scripts, bzw. das ihnen allen zugrundeliegende Framework, automatisch mit "/" oder mit "?" - je nachdem, was der Server hergibt).
Wie ich vor einiger Zeit mal herausfand kennt wohl (mittlerweile?) auch der IIS das Feature PathInfo. Wenn ich mich recht erinnere, kann man bei http://example.org/path/to/file.ext/path/info sogar das file.ext entfallen, wenn das als Default-Datei für den Aufruf des Verzeichnisses /path/to/ eingestellt ist. Allerdings konnte ich seitdem (aus zeitlichen Gründen) die Erkenntnisse aus diesem Versuch noch nicht in einer realen Anwendung unterbringen, um weitere Erfahrung damit zu sammeln.
echo "$verabschiedung $name";
Hi,
Wie ich vor einiger Zeit mal herausfand kennt wohl (mittlerweile?) auch der IIS das Feature PathInfo.
Also PATH_INFO/PATH_TRANSLATED bietet er durchaus an, aber AFAIK nicht im Sinne des Apaches.
Aber wenn MS hier verbessert hat, würde es mich freuen.
Allerdings wenn, dann muß man es wohl erst explizit freischalten. Denn ein spontaner Test auf den ersten "auskunftsfreudigen" IIS' im Netz (also die ersten passenden Hits beim Googeln nach offenen phpinfos - ich habe nur Apache, nicht aber IIS unter Win laufen) ergab das gewohnte Bild: www.example.com/info.php/Test -> 404
Allerdings konnte ich seitdem (aus zeitlichen Gründen) die Erkenntnisse aus diesem Versuch noch nicht in einer realen Anwendung unterbringen, um weitere Erfahrung damit zu sammeln.
Also falls Du die Zeit mal finden solltest: Kurzer Eintrag mit Topic "Look back" auch auf IIS" (oder so ähnlich) würde mich freuen. :-)
Gruß, Cybaer
Hi,
Wie ich vor einiger Zeit mal herausfand kennt wohl (mittlerweile?) auch der IIS das Feature PathInfo.
Also PATH_INFO/PATH_TRANSLATED bietet er durchaus an, aber AFAIK nicht im Sinne des Apaches.
Aber wenn MS hier verbessert hat, würde es mich freuen.
Allerdings: Da der IIS mom. PATH_INFO IMHO falsch anwendet, wäre er selbst mit einem optionalen "Look back"-Feature à la Apache entweder zum Apache-Verhalten inkompatibel, oder zu sich selbst.
Gruß, Cybaer
echo $begrüßung;
Allerdings wenn, dann muß man es wohl erst explizit freischalten. Denn ein spontaner Test auf den ersten "auskunftsfreudigen" IIS' im Netz [...] ergab das gewohnte Bild: www.example.com/info.php/Test -> 404
Meine Ergebnisse mit den erreichbaren Testobjekten:
Nach dieser "Messreihe" sieht es wohl so aus, dass das abhängig von der PHP-Version ist. Die 5er kann es, die 4er nicht. Grad wollte ich aufhören, lief mir noch ein 6er über den Weg, der PHP 4.4.4 als ISAPI eingebunden hatte. Kurz weitergeforscht ergibt sich, dass mit ISAPI und FCGI auch die 4er PHP-Version mitspielt.
echo "$verabschiedung $name";
Hi,
Meine Ergebnisse mit den erreichbaren Testobjekten:
Wow, cool, danke! :-))
- IIS/5.0 (PHP 4.3.11) erfolgreich (der hat geschwindelt, das war ein Apache)
Wie erkennst Du Schwindler? Einfach daran, daß sie statt typischer IIS-Variablen Apache-Variablen ausgeben (also z.B. _SERVER["SERVER_ADDR"] statt _SERVER["LOCAL_ADDR"])?
Nach dieser "Messreihe" sieht es wohl so aus, dass das abhängig von der PHP-Version ist.
Gelobt sei dene Ausdauer! :-)
Gruß, Cybaer
echo $begrüßung;
- IIS/5.0 (PHP 4.3.11) erfolgreich (der hat geschwindelt, das war ein Apache)
Wie erkennst Du Schwindler? Einfach daran, daß sie statt typischer IIS-Variablen Apache-Variablen ausgeben (also z.B. _SERVER["SERVER_ADDR"] statt _SERVER["LOCAL_ADDR"])?
Das waren mehrere Indizien. Im konkreten Fall stand bei SERVER_VERSION zwar "Microsoft-IIS/5.0, doch gleich drüber war SERVER_SIGNATURE vorhanden, eine typische Apache-Konfiguration. Außerdem gab sich das Betriebssystems als Linux zu erkennen, und alle Pfadangaben waren Unix-typisch: /bin, /usr/bin, /home etc. statt c:...
echo "$verabschiedung $name";
Hi,
Ist der Befehl veraltet?
Nein, aber wozu überhaupt? Alles was in PATH_INFO steht (also ab dem "/" nach dem Scriptnamen) steht ohnehin in $_SERVER['PATH_INFO'] zur Verfügung - sofern der Server das überhaupt unterstützt.
Gruß, Cybaer
Ist es besser einen neuen Thread aufzumachen und auf den alten zu verlinken oder wird das hier gelesen noch?
Jedenfalls habe ich ein wenig herumprobiert...
$path_info=ltrim($_SERVER['PATH_INFO'],"/"); liefert schon das selbe Ergebnis wie mein Explode. Ich hatte nur $aPath_info=explode(".php/",$_SERVER['PHP_SELF']); benutzt weil ich den ersten Teil des Arrays auch noch im Code benutzt habe für Variablenzuweisung. Damit hatte ich gleich alle benötigten Teile extrahiert...
Leider funktioniert $_SERVER['PATH_INFO'] zwar lokal aber nicht online...
Problem: Online gibt es kein Path_info und das php_self gibt nur den Namen des Skriptes ohne den Anhang zurück.
Allerdings gibt es online ein: _SERVER["ORIG_PATH_INFO"]
Darin steht das selbe wie in Path_Info lokal. Ein anderes Path_Info gibt es online wohl nicht mehr.
Ich muss nun wohl tricksen schätze ich. Irgendwie eine der Variablen abfragen und wenn eine leer ist die entsprechende andere...
Wenn Provider mal was ändern...
Grüße!
Sebastian
Moin!
Ich muss nun wohl tricksen schätze ich. Irgendwie eine der Variablen abfragen und wenn eine leer ist die entsprechende andere...
Genau das wirst du tun müssen.
Wenn Provider mal was ändern...
Das hat übrigens nach meinem Kenntnisstand nichts mit PHP5 selbst zu tun. Alles, was in $_SERVER drinsteht, wird dir vom Webserver zur Verfügung gestellt, PHP ist da nur der Bote. Und als Serveradmin kann der Provider da natürlich Einfluß nehmen, insbesondere vom gewohnten Standard abweichen - warum auch immer.
- Sven Rautenberg
Hi,
Alles, was in $_SERVER drinsteht, wird dir vom Webserver zur Verfügung gestellt, PHP ist da nur der Bote.
Ich weiß ja, daß Du es weißt, aber es sollte IMHO hier der Hinweis nicht fehlen, daß einige der $_SERVER-Einträge vom Client kommen und manipuliert sein, also z.B. Schadcode enthalten könnten - PHP_SELF gehört dazu. Man sollte das immer bedenken, und wenn es geht, sollte man sie durch Einträge vom Server ersetzen (z.B. statt HTTP_HOST besser SERVER_NAME verwenden).
Und als Serveradmin kann der Provider da natürlich Einfluß nehmen, insbesondere vom gewohnten Standard abweichen - warum auch immer.
Ja, z.B. auf 'nem IIS kein DOCUMENT_ROOT definieren ... =:-o
Gruß, Cybaer
Hi,
Ist es besser einen neuen Thread aufzumachen und auf den alten zu verlinken oder wird das hier gelesen noch?
nein und vermutlich ja. Solange dieser Thread nicht archiviert ist, bleibe bitte auch hier.
Problem: Online gibt es kein Path_info und das php_self gibt nur den Namen des Skriptes ohne den Anhang zurück.
Allerdings gibt es online ein: _SERVER["ORIG_PATH_INFO"]
Darin steht das selbe wie in Path_Info lokal.
dann nutze dieses doch.
freundliche Grüße
Ingo
Hallo,
ich hatte in diesem Thread das letzte Mal nur nicht antworten können weil kein "Nachricht beantworten" zu sehen war. Da habe ich gedacht es ist schon zu alt...
Daher hier noch mal wie es jetzt gelöst ist als Kopie:
...
Jedenfalls klappt es nun mit dem Code wieder. Die Lösung ist:
if (ltrim($_SERVER['PATH_INFO'],"/") == "")
{
$path_info=ltrim($_SERVER['ORIG_PATH_INFO'],"/");
}
else
{
$path_info=ltrim($_SERVER['PATH_INFO'],"/");
}
...
Ist zwar nicht schön dass es solche Unterschiede gibt aber auf die Weise funktioniert es jetzt lokal und online...
Grüße!
Sebastian