benji: Abwärtskompatibilität PHP's ....

Hallo !

Also, nach umfangreichen Forenfragen (vorhin, gestern) habe ich nun PHP 4.3.3 drauf, und zufrieden bin ich auch nicht ...

Also: Vorher hatte ich (so was in der Richtung) 4.0.1 drauf, und da hat folgendes Beispiel wunderbar funktioniert:

<?php
 if(isset($QUERY_STRING))
 {
  $ref_to = "";
 switch($QUERY_STRING)
 {
 case "upload": $ref_to = "server/upload.php"; break;
 case "download": $ref_to = "server/download.php"; break;
 case "real": $ref_to = "portal.php"; break;
 default: $ref_to = "librarys/errors/php-error.php"; break;
 }
 header("Location: " . $ref_to);
 exit;
 }
?>
<html>
<head>
<!--  usw. -->

oder zum Beispiel dashier:

<?php
 $t_datei = "http://$SERVER_NAME$SCRIPT_NAME";
 $t_dir = "http://$SERVER_NAME/librarys/";
 $t_localdir = "e:\homepages\webserver\";
 $t_localfile = $PATH_TRANSLATED;

$t_printurl = "http://$SERVER_NAME/server/print.php?$t_localfile";
 $t_wordurl = "http://$SERVER_NAME/server/word.php?$t_localfile";
 # if(isset($query_string)) $t_printurl .= "?" . $query_string; --> nur, wenn datei über online geholt wird

include $t_localdir."librarys\main-library.php";
?>

<html>

<head>
<title><?php
if(isset($title))
 echo $title;
else
 echo "~~~~ Webserver - kein zugeordneter Titel";
?>
</title>
<link rel="StyleSheet" href="<?php print $t_dir; ?>style.css" TYPE="text/css">
<script language="JScript" type="text/jscript" src="<?php print $t_dir; ?>shared.js"></script>
</head>

<body bgcolor="#ffffff" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" id="derbody">
<table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#6487dc" height="40">
 <tr>
<!-- usw. -->

Warum geht das jetzt nicht mehr ? Beim 1.Beispiel leitet er NIERGENDWOHIN weiter, beim 2. behauptet er, $SERVER_NAME und $PATH_TRANSLATET würde er nicht kennen. OK, in der PHP-doku habe ich nachgelesen, dass es dafür jetzt neue sachen gibt, aber es steht auch da, PHP abwärtskompatibel gehalten wird.

Irgendwie finde ich das jetzt blöd, denn die Beispiele gerade waren für meinen eigenen virtuellen-Webserver-im-LAN, und wenn ich jetzt PHP-Daten fürs Internet mache, also bei irgendeinem freewebspaceanbieter (gibt mit PHP leider so wenige), dann hat der vielleicht PHP4.0, und dann sind meine Scripte nicht mehr kompatibel !!!

Also, was ist hier falsch - oder lässt sich da was in der php.ini machen .... habe im manual nichts gefunden :(

benji

--
Soy el pequeño benji :)
  1. Hallo benji,

    Also: Vorher hatte ich (so was in der Richtung) 4.0.1 drauf,

    Dir ist klar, dass PHP 4.0.1 vor ca. 3,5 Jahren herausgegeben wurde?

    beim 2. behauptet er, $SERVER_NAME und $PATH_TRANSLATET würde er nicht kennen. OK, in der PHP-doku habe ich nachgelesen, dass es dafür jetzt neue sachen gibt, aber es steht auch da, PHP abwärtskompatibel gehalten wird.

    -> http://www.php-faq.de/q/q-formular-register-globals.html

    Achja, nur zur Info: PHP 4.1, das $_GET, $_POST, etc. angefangen hat zu unterstützen, ist auch schon fast seit 2 Jahren "draußen".

    und wenn ich jetzt PHP-Daten fürs Internet mache, also bei irgendeinem freewebspaceanbieter (gibt mit PHP leider so wenige), dann hat der vielleicht PHP4.0, und dann sind meine Scripte nicht mehr kompatibel !!!

    Zu einem Anbieter mit PHP 4.0 würde ich nicht mehr freiwillig gehen. In PHP 4.0 sind einige nicht mehr korrigierte Sicherheitslücken, da es dann bereits PHP 4.1 bzw. PHP 4.2 bzw. PHP 4.3 gab, als diese gefunden wurden.

    Also, was ist hier falsch

    Dein Code ist hoffnungslos veraltet...

    • oder lässt sich da was in der php.ini machen

    Du hast (wie immer) ungenügend gesucht. Aktiviere in der php.ini die Einstellung register_globals.

    Viele Grüße,
    Christian

    --
    Losung und Lehrtext für Sonntag, 12. Oktober 2003:
    Sie sollen erfahren, dass ich, der Herr, ihr Gott, bei ihnen bin und dass sie vom Hause Israel mein Volk sind, spricht Gott der Herr. (Hesekiel 34,30)
    Hat denn Gott sein Volk verstoßen? Das sei ferne! Denn ich bin auch ein Israelit, vom Geschlecht Abrahams, aus dem Stamm Benjamin. (Römer 11,1)
    (http://www.losungen.de/heute.php3, i.V. Götz)
  2. morgens,

    Also: Vorher hatte ich (so was in der Richtung) 4.0.1 drauf, und da hat folgendes Beispiel wunderbar funktioniert:
    [...]
     $t_datei = "http://$SERVER_NAME$SCRIPT_NAME";
     $t_dir = "http://$SERVER_NAME/librarys/";

    Bereits ab PHP 4.2 gab es da ein paar klitzekleine, aber feine Veränderungen: Für $SERVER_NAME mußt du jetzt zum Beispiel $_SERVER[SERVER_NAME] schreiben, und ähnliches trifft auf die anderen Variablen auch zu. Dazu kommt noch das "Problem" mit "register_globals", über das du auch gleich noch stolpern wirst, und wozu es im Forumsarchiv bereits ziemlich viel Lesenswertes gibt. Nachlesen kannst du es natürlich im Handbuch, beispielsweise hier: http://www.php.net/manual/de/language.variables.predefined.php

    Irgendwie finde ich das jetzt blöd, denn die Beispiele gerade waren für meinen eigenen virtuellen-Webserver-im-LAN, und wenn ich jetzt PHP-Daten fürs Internet mache, also bei irgendeinem freewebspaceanbieter (gibt mit PHP leider so wenige), dann hat der vielleicht PHP4.0, und dann sind meine Scripte nicht mehr kompatibel !

    phpinfo hat sich nicht geändert, das heißt, du weißt sehr genau, welche PHP-Version dein ISP fährt. Es wird dir kaum etwas anderes übrigbleiben, als dich vorher zu informieren, was dein Provider anbietet  -  und deine Überraschung wäre wahrscheinlich noch um einiges größer, wenn du dir tatsächlich PHP 5 gezogen und installiert hättest.

    Grüße aus Berlin

    Christoph S.

    1. Hallo,

      $_SERVER[SERVER_NAME]

      Wenn schon bitte so (_mit_ Anfuehrungszeichen):
      $_SERVER["SERVER_NAME"]
      Diese sogenannte superglobale Variable (ab PHP 4.1.0)
      ist die beste Variante. Sie kann auch in Funktionen verwendet
      werden, ohne dass man sie mit
      global $_SERVER;
      erst verfuegbar machen muss.

      Etwas aeltere Schreibweise (abwaertskompatibel, aber auch in
      den neuen Versionen noch unterstuetzt):
      $HTTP_SERVER_VARS["SERVER_NAME"]

      http://www.php.net/manual/de/language.variables.predefined.php

      Die deutsche Uebersetzung ist leider noch nicht soweit...
      Bitte verweise nur auf das englische Original:
      http://www.php.net/manual/en/language.variables.predefined.php
      http://www.php.net/manual/en/reserved.variables.php

      Gruesse,

      Thomas

      1. hallo Thomas,

        Wenn schon bitte so (_mit_ Anfuehrungszeichen):
        $_SERVER["SERVER_NAME"]

        Jaein. Nach der von dir selbst angegebenen Quelle http://www.php.net/manual/en/language.variables.predefined.php sind es Hochkommas, also ', und keine Anführungszeichen ". Wenn du dir die Liste der Variablen mit phpinfo anzeigen läßt, sind es dann wieder die "doppelten" Anführungszeichen. Und auf meiner Platte (Apache 2.0.47 und PHP 4.3.2 auf WinXP) funktioniert ein kleines Testskript zum Überprüfen dieser vordefinierten Variablen, aus dem ich das schnell rauskopiert hatte, tatsächlich völlig "ohne" Anführungszeichen  -  naja, daß etwas funktioniert oder zu funktionieren scheint, muß noch nicht bedeuten, daß es auch korrekt geschrieben ist.

        Diese sogenannte superglobale Variable (ab PHP 4.1.0) ist die beste Variante.

        Ich halte das mit den "superglobalen Variablen" für eine gute Idee, habe aber noch nicht ganz verstanden, warum das mit PHP 5 wieder etwas anders strukturiert werden soll.

        http://www.php.net/manual/de/language.variables.predefined.php
        Die deutsche Uebersetzung ist leider noch nicht soweit...

        Es gibt nahezu jeden Tag an irgendeiner Stelle des Gesamtpakets Übersetzungsfortschritte. Man kann ja nicht genau wissen, wann es auch die an dieser Stelle verlinkten Seiten erreichen wird ;-)

        Bitte verweise nur auf das englische Original:
        http://www.php.net/manual/en/language.variables.predefined.php
        http://www.php.net/manual/en/reserved.variables.php

        Prinzipiell hat ein "Original" natürlich immer Vorrang, das sollte aber jedem klar sein.

        Bei der Gelegenheit: ich habe mir lokal PHP 4.3.3 mit Apache 2.0.47 auf FreeBSD zusammengeschraubt, das funktioniert prima. Auf einer Windows-Kiste kriege ich es aber nicht hin. Da läuft PHP 4.3.2 wunderbar, aber wenn ich es durch 4.3.3 ersetzen will, läuft gar nichts mehr, nicht einmal phpinfo, und ich kriege nicht raus, woran das liegt. Hast du einen Hinweis (bitte nicht das Handbuch, das kenne ich, auch http://www.php.net/manual/de/install.apache2.php  -  das ist noch in englisch, also das Original)?
        PHP 5 habe ich dagegen testweise zum Laufen bringen können, aber das ist ein anderes Thema.

        Grüße aus Berlin

        Christoph S.

        1. Hallo Christoph,

          Wenn schon bitte so (_mit_ Anfuehrungszeichen):
          $_SERVER["SERVER_NAME"]
          Jaein. Nach der von dir selbst angegebenen Quelle http://www.php.net/manual/en/language.variables.predefined.php sind es Hochkommas, also ', und keine Anführungszeichen ".

          Es ist egal, ob Du hier einfache oder doppelte Anführungszeichen nimmst. Du sprichst im Endeffekt ein Element eines assoziativen Arrays an. Der Schlüssel ist ein String, und genau deswegen ist es egal.

          Und auf meiner Platte (Apache 2.0.47 und PHP 4.3.2 auf WinXP) funktioniert ein kleines Testskript zum Überprüfen dieser vordefinierten Variablen, aus dem ich das schnell rauskopiert hatte, tatsächlich völlig "ohne" Anführungszeichen

          Natürlich "funktioniert" das - SERVER_NAME gibt es als Konstante nicht und deswegen wird SERVER_NAME als String interpretiert. Wenn Du vorher jedoch irgendwo die Konstante SERVER_NAME definieren würdest - define ('SERVER_NAME', 'hallo'); - dann würdest Du im Endeffekt auf $_SERVER['hallo'] zugreifen... was natürlich nicht gewünscht ist.

          Diese sogenannte superglobale Variable (ab PHP 4.1.0) ist die beste Variante.
          Ich halte das mit den "superglobalen Variablen" für eine gute Idee, habe aber noch nicht ganz verstanden, warum das mit PHP 5 wieder etwas anders strukturiert werden soll.

          Wieso sollte das mit PHP5 anders werden? Auf http://www.php.net/ChangeLog-5.php und http://www.php.net/zend-engine-2.php entdecke ich weder das Wort "superglobal" noch die Zeichenfolge "$_".

          Da läuft PHP 4.3.2 wunderbar, aber wenn ich es durch 4.3.3 ersetzen will, läuft gar nichts mehr, nicht einmal phpinfo, und ich kriege nicht raus, woran das liegt. Hast du einen Hinweis (bitte nicht das Handbuch, das kenne ich, auch http://www.php.net/manual/de/install.apache2.php  -  das ist noch in englisch, also das Original)?

          Hast Du auch die php4ts.dll im winnt\system32-Verzeichnis durch die neue ersetzt?

          Viele Grüße,
          Christian

          --
          Losung und Lehrtext für Sonntag, 12. Oktober 2003:
          Sie sollen erfahren, dass ich, der Herr, ihr Gott, bei ihnen bin und dass sie vom Hause Israel mein Volk sind, spricht Gott der Herr. (Hesekiel 34,30)
          Hat denn Gott sein Volk verstoßen? Das sei ferne! Denn ich bin auch ein Israelit, vom Geschlecht Abrahams, aus dem Stamm Benjamin. (Römer 11,1)
          (http://www.losungen.de/heute.php3, i.V. Götz)
          1. hi Christian,

            wenn ich es durch 4.3.3 ersetzen will, läuft gar nichts mehr
            Hast Du auch die php4ts.dll im winnt\system32-Verzeichnis durch die neue ersetzt?

            Selbstverständlich. Ich sagte ja, das Handbuch hab ich gelesen ;-)

            Grüße aus Berlin

            Christoph S.

            1. Hallo Christoph,

              [PHP 4.3.3 geht nicht / php4ts.dll]
              Selbstverständlich. Ich sagte ja, das Handbuch hab ich gelesen ;-)

              Hmmm - ich selbst hatte mit Apache 2.0.47 und PHP 4.3.3 auf Windows noch keine Probleme.

              Läuft den eigentlich der CLI-Interpreter? (d.h. php info.php in der Kommandozeile)

              Viele Grüße,
              Christian

              --
              Losung und Lehrtext für Sonntag, 12. Oktober 2003:
              Sie sollen erfahren, dass ich, der Herr, ihr Gott, bei ihnen bin und dass sie vom Hause Israel mein Volk sind, spricht Gott der Herr. (Hesekiel 34,30)
              Hat denn Gott sein Volk verstoßen? Das sei ferne! Denn ich bin auch ein Israelit, vom Geschlecht Abrahams, aus dem Stamm Benjamin. (Römer 11,1)
              (http://www.losungen.de/heute.php3, i.V. Götz)
              1. hi Christian,

                Läuft den eigentlich der CLI-Interpreter? (d.h. php info.php in der Kommandozeile)

                Ja. Ich rufe es allerdings gewohnheitsmäßig anders auf und bekomme so etwas:
                D:\PHP>php.exe -i
                phpinfo()
                PHP Version => 4.3.3
                System => Windows NT PC1 5.1 build 2600
                Build Date => Aug 24 2003 22:01:16
                Server API => Command Line Interface
                Virtual Directory Support => enabled
                Configuration File (php.ini) Path => C:\XP\php.ini
                PHP API => 20020918
                PHP Extension => 20020429
                Zend Extension => 20021010
                Debug Build => no
                Thread Safety => enabled
                Registered PHP Streams => php, http, ftp, compress.zlib

                Der Apache liefert mir trotzdem Error 500  -  also interner Severfehler (das berühmte "premature end of script headers"). Aber meinen Apache sollte ich einrichten können, und zwischen PHP 4.3.2 und 4.3.3 gab es, soviel ich weiß, keine Veränderungen für den Apache. Überprüft und neu gestartet hab ich ihn selbstverständlich mehrfach.

                Christoph S.

                1. Hallo Christoph,

                  Der Apache liefert mir trotzdem Error 500  -  also interner Severfehler (das berühmte "premature end of script headers"). Aber meinen Apache sollte ich einrichten können, und zwischen PHP 4.3.2 und 4.3.3 gab es, soviel ich weiß, keine Veränderungen für den Apache. Überprüft und neu gestartet hab ich ihn selbstverständlich mehrfach.

                  Wärst Du nicht der, der Du bist, würde ich vermuten, dass Du die falsche php4apache2.dll verwendest, aber das kann ich ja ausschließen. Sorry, nicht den blassesten Schimmer was das für ein Problem sein könnte...

                  Viele Grüße,
                  Christian

                  --
                  Losung und Lehrtext für Sonntag, 12. Oktober 2003:
                  Sie sollen erfahren, dass ich, der Herr, ihr Gott, bei ihnen bin und dass sie vom Hause Israel mein Volk sind, spricht Gott der Herr. (Hesekiel 34,30)
                  Hat denn Gott sein Volk verstoßen? Das sei ferne! Denn ich bin auch ein Israelit, vom Geschlecht Abrahams, aus dem Stamm Benjamin. (Römer 11,1)
                  (http://www.losungen.de/heute.php3, i.V. Götz)
                  1. hi Christian,

                    vielen Dank für deine Nachdenk-Bemühungen  -  ich habs inzwischen. Wie so oft, lag das Problem an einer ganz anderen Stelle, das heißt, alles, was du eventuell als überprüfenswert empfehlen konntest (und was ich oft und oft geprüft habe), war und ist korrekt  -  aber meine php.exe ist es nicht gewesen.

                    Kurz: ich habe mir für Windows-Installationen angewöhnt, immer erst einmal die "CGI-Version" aufzuspielen, und wenn ich damit zurandekomme, danach dann den ganzen restlichen Kram aus dem ZIP-Archiv dazuzupacken (ich hab das sogar in irgendeinem Thread gestern als Vorgehensweise empfohlen). Das hat bis PHP 4.3.2 gut geklappt, weil der "Installer" eine ordentliche php.exe mitlieferte. Der Installer für PHP 4.3.3 liefert aber eine php.exe, die nur 24 KB groß ist (statt 44 KB) und exakt nur der "CLI-Interpreter" ist, den du sonst im Verzeichnis php/cli findest  -  du kannst ja mal die Größenangaben vergleichen.

                    Leider gibt es nirgends einen Hinweis darauf, daß dieser "Installer" (php-4.3.3-installer.exe) gar nicht über einen Webserver funktionieren kann und falsch zusammengestellt ist. Ich hatte ihn mir erst gestern zum x-ten mal gezogen ...

                    Sorry, nicht den blassesten Schimmer was das für ein Problem sein könnte...

                    Jetzt weißt du es ;-)

                    Grüße aus Berlin

                    Christoph S.

        2. Hallo,

          Wenn schon bitte so (_mit_ Anfuehrungszeichen):
          $_SERVER["SERVER_NAME"]
          Jaein. Nach der von dir selbst angegebenen Quelle http://www.php.net/manual/en/language.variables.predefined.php sind es Hochkommas, also ', und keine Anführungszeichen ". Wenn du dir die Liste der Variablen mit phpinfo anzeigen läßt, sind es dann wieder die "doppelten" Anführungszeichen.

          Es spielt keiner Rolle, ob einfache oder doppelte Anfuehrungszeichen.
          Hauptsache, Du machst welche. Denn die Schluessel sollen ja Strings sein,
          und nicht Konstanten.

          Und auf meiner Platte (Apache 2.0.47 und PHP 4.3.2 auf WinXP) funktioniert ein kleines Testskript zum Überprüfen dieser vordefinierten Variablen, aus dem ich das schnell rauskopiert hatte, tatsächlich völlig "ohne" Anführungszeichen  -  naja, daß etwas funktioniert oder zu funktionieren scheint, muß noch nicht bedeuten, daß es auch korrekt geschrieben ist.

          Es ist nicht korrekt, auch wenn es "funktioniert", siehe:
          http://www.php.net/manual/de/language.types.array.php#language.types.array.donts

          Die einzige Ausnahme, wo man die Anfuehrungszeichen weglassen kann,
          ist, wenn der Variablenname selbst schon zwischen doppelten Anfuehrungszeichen
          steht. Siehe
          http://www.php.net/manual/en/language.types.array.php#AEN3791
          "Note: To reiterate, inside a double-quoted string, it's valid to not surround
          array indexes with quotes so "$foo[bar]" is valid."

          Dein Problem hat sich ja in der Zwischenzeit zum Glueck geloest - ich
          haette Dir dabei leider nicht helfen koennen...

          Gruesse,

          Thomas

  3. Moin!

    OK, in der PHP-doku habe ich nachgelesen, dass es dafür jetzt neue sachen gibt, aber es steht auch da, PHP abwärtskompatibel gehalten wird.

    Die Abwärtskompatibilität scheitert manchmal durchaus an Details. Wer sich sein PHP selbst kompiliert, wird beispielsweise bei den aktuellen Versionen am Ende überdeutlich darauf hingewiesen, dass sich einige Default-Einstellungen geändert haben.

    Irgendwie finde ich das jetzt blöd, denn die Beispiele gerade waren für meinen eigenen virtuellen-Webserver-im-LAN, und wenn ich jetzt PHP-Daten fürs Internet mache, also bei irgendeinem freewebspaceanbieter (gibt mit PHP leider so wenige), dann hat der vielleicht PHP4.0, und dann sind meine Scripte nicht mehr kompatibel !!!

    Dieses Problem besteht allerdings zwischen jeder einzelnen Version. Schau einfach mal in die Doku: Etliche Versionen sind erst mit einer Sub-Version eingeführt worden, stehen also mit Pech gar nicht zur Verfügung.

    Beispielsweise stehen einige mysql-Funktionen erst ab Version 4.3.0 zur Verfügung. Oder get_defined_vars() - gibts erst seit PHP 4.0.4.

    Deshalb gibt es im Prinzip nur zwei Möglichkeiten: Entweder verwendest du ausschließlich Funktionen, die wirklich in allen PHP-Versionen (oder PHP4-Versionen) vorkommen, oder du entwickelst auf einem System, welches identisch ist mit dem späteren Produktivsystem. Oder du schreibst deine Skripte explizit mit Prüfungen, ob die benötigten Funktionen existieren und dann ggf. Ersatzfunktionen definieren.

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
  4. hi,

    Also, nach umfangreichen Forenfragen (vorhin, gestern) habe ich nun PHP 4.3.3 drauf, und zufrieden bin ich auch nicht ...

    einen blick in die change logs hast du natürlich für überflüssig gehalten.

    gruss,
    wahsaga