phpbar.de logo

Mailinglisten-Archive

[php] Abändern alter PHP-Skripte auf neue PHP-Versionen

[php] Abändern alter PHP-Skripte auf neue PHP-Versionen

Burkes burkes at gmx.de
Son Jul 4 16:47:41 CEST 2004


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