Mailinglisten-Archive |
Hallo! Darf ich mich kurz vorstellen: Ich bin Privatdozent im kfm. Bereich, Baujahr 57, Hobby Computer, schreibe in meiner Freizeit gerne Webseiten und programmiere seit 2 Jahren mit PHP. Bisher war ich nur Leser hier. Ich bitte heute um Euere Mithilfe. Ich möchte, für mich und andere, eine kleine Anleitung für das Umschreiben und Anpassen alter PHP-Skripte auf neuere PHP-Versionen erstellen. Dies in Hinsicht auf global_register und PHP_Self. Das was ich bisher im Internet gefunden habe, ist noch nicht zufriedenstellend. Ich habe etliche Skripte geschrieben, die ich z.T. auch meinen Schülern und anderen als Freeware anbiete (z.B. die Lernkartei, auf www.burkes.de/lernkartei/making-of/) und merke jetzt, nachdem ich auf localhost auf PHP 4.3 umgestiegen bin, dass ich da was tun muss, wenn die Skripte auch bei anderen laufen sollen. Ausserdem habe ich etliche gesammelte Codeschnipsel und Skripte, die ich anpassen muss, wenn ich sie jemals verwende. Mein Ziel ist es, a) alte Skripten anzupassen und b) neue Skripte von vornherein so zu schreiben, dass sie auf verschiedenen Servern mit verschiedenen php-Versionen und verschiedenen global_register-einstellungen laufen, und nicht nur auf meinem Server. Also, was ich jetzt nach wochenlanger Recherche als Amateur weiß fasse ich zusammen: 1. register_globals in der Datei php.ini steht seit PHP 4.1 bei einer anderen Voreinstellung, nämlich auf off, und manche Provider (und natürlich alle nicht wissenden localhost-PHP-Newbies) ändern die Einstellung nicht. Dadurch werden übergebene Werte nicht automatisch in Variabeln umgewandelt und es kommt zu Fehlermeldungen in alten Skripten, die darauf bauten. a) Zu lösen sei dies durch die Verwendung von $_SERVER['PHP_SELF'], wobei $_Server als array alle Übergabewerte enthält, wobei die automatische Umwandlung durch register_globals on natrlich nebenher laufen kann. b) Seit 4.1 gibt es ferner auch $_REQUEST - ein assoziatives Array zusammengesetzt aus den GET, POST und Cookie Variablen; dürfte wohl nur für Fremdskripte interessant sein, die mit diesem Array arbeiten. Allerdings: in einem Diskussionsarchiv, wo jemand mit $PHP_SELF nicht klarkam, fand ich die folgende, abschließende Nachricht: ################## Mein Provider-Support teilte mit: Verwenden Sie bitte PHP_REQUEST anstelle von PHP_SELF. Ist ein offizieller Bug der aktuelle PHP Version. ################# c) Verkomplizierend kommt hinzu, dass der Zugriff über Array früher anders notiert wurde, nämlich über $HTTP_SERVER_VARS['PHP_SELF'], und, was Übergabevariable betrifft: $_GET und $POST, genauer: $HTTP_GET_VARS (sofern per HTTP-GET-Methode übergeben wurde) $_GET (offenbar Kurzform zu oben mit zusätzlichem Vorteil, dass sie automatisch global ist) $HTTP_POST_VARS (sofern per HTTP-POST-Methode übergeben wurde). $_POST (Kurzform, automatisch global) Ob diese auf allen Server noch gelten und künftig gelten sollen weiß ich nicht. Kann man Übergabevariable auch mit $_SERVER auslesen? d) Und da gibts noch eine Variable Skript_Name, das offenbar es nur unter Apache gibt, und das auch so etwas wie PHP_Self zu sein scheint (ich hab's nicht getestet) 2. a) Angeblich haben viele PHP-Versionen einen BUG bei PHP_SELF; man müsse erst ein ? oder nochmehr Text anhängen, dann funktioniere es (ähnliches habe ich auch erlebt, hielt es aber nicht für einen Bug). Auf irgendeiner PHP-Seite fand ich dann folgenden Beitrag: ############################## $PHP_SELF Bug beheben Um diesen Bug, und die damit verbundene, oft sehr schwer zu lokalisierende Fehlerquelle (ansich ist ja alles richtig programmiert) zu umgehen, setzen wir einfach eine kleine Funktion an den Anfang der Datei wo der Fehler auftritt. Diese Funktion weißt $PHP_SELF dann den richtigen Wert zu und Sie können die Variable ohne Probleme verwenden: //Anfang Funktion zum fixen des $PHP_SELF Bugs function scriptname($buffer) { $buff_array = explode("/", $buffer); $x = count($buff_array); $x--; $scriptname = $buff_array[$x]; return $scriptname; } $php_self = scriptname($SCRIPT_NAME); ####################################### b) Auf einem Diskussionsforum fand ich einen einschlägigen Beitrag von Miro Dietiker als Empfehlung für Serverumstellung (April 2003): <?PHP if(isset($PHP_REQUEST)) { $PHP_SELF = $PHP_REQUEST; } ?> Ich hab das mal ausprobiert, scheint zu funktionieren. 3. Weniger dokumentiert ist ein zweites Problem: Mit Updating auf neuere PHP-Versionen kann es sein, dass die Fehlermeldung-Unterdrückung oder -Filterung in der Datei php.ini verlorenging und jetzt alle Fehlermeldungen angezeigt werden. Daher dann die immer noch übrigbleibenden Fehlermeldungen "variable undefined" obwohl man register_globals längst umgestellt hat. Es handelt sich im Abschnitt "Error handling and logging" und die Zeile "error_reporting = E_ALL" Wobei es noch eine Reihe anderer Alternativen gibt, die nur ausgewählte Fehlermeldungen bringen. Diese Meldungen zerschießen das Layout, auch wenn das Programm funktioniert. Es werden offenbar auch Nicht-Fehler (aber Schwachstellen) angezeigt. Ich las eine Installationsempfehlung, wonach man dies kurzerhand ausschalten soll (ich hab's im Moment auf E_Error umgestellt). Diese Schwachstellen sind, so wie ich das verstanden habe, dass Variablen aus Sicherheitsgründen erstmal definieren soll und dann erst überschreiben. Also: $neu=""; $neu=$row[4]; Sonst könne von außen Manipulation getrieben werden. Ich will keine Diskussion über den Sinn dieser Sicherheitsmaßnahmen einleiten. Ich denke, ein Provider wird die Fehlermeldungen filtern und in der Anleitung sollten User daraufhingewiesen werden, dass sie dies können, aber sich Gedanken über die Variablendefinitionen machen müssen. Mich interessiert in dem Zusammenhang nur, wie man speziell mit Übergabevariablen umgeht, wenn man sie das erste mal im Skript hat. z.B. wäre denkbar: $neu=""; $neu=$_Server['neu'] aber ich habe keine Ahnung, ob das einen Sinn hat. 4. Ich habe seit einer Woche das PHP 4.3 installiert, basierend auf Xitami, und register_globals on gesetzt und Fehlermeldungen reduziert. Die meisten Skripte gehen jetzt, aber manche php-Variablen gehen trotzdem nicht. Wahrscheinlich habe ich sie fehlerhaft definiert und sie gingen nur zufällig, so habe ich die Variable stets kleingeschrieben, das ergab im Endeffekt einen leeren String, wenn man aber ein Fragezeichen und/oder weiteren Text anhing, dann klappte es . Ich habe jetzt als Erstmaßnahme folgendes gemacht, zu Beginn jedes Skripts: $self = $_SERVER['PHP_SELF'] und im Text habe ich alle $php_self durch $self ersetzt. Klappt. Aber jetzt gehts weiter - die Skripts sollen auch auf anderen Servern laufen, z.B. mit älteren PHP-Versionen (wo es noch kein $_SERVER gab) und/oder anderen Einstellungen. Was könnte man bezgl. PHP_SELF tun? Kann/Soll man eine der o.g. Ersetzungsformeln verwenden oder eine andere erarbeiten, soweit es um alte Skripte geht? Und was könnte man bezüglich der Übergabevariablen innerhalb des Skripts tun? Annex: Was könnte man bezgl. PHP_SELF von vornherein tun, wenn man künftig pogrammiert? Grüße Peter -- Peter Burkes Blumenstr. 6 93055 Regensburg burkes at gmx.de www.burkes.de www.user-archiv.de --
php::bar PHP Wiki - Listenarchive