Christian: var. Parameteranz. bei eig. Funktion - Warnings bei 4.1.3

Guten Abend Forum,

bisher hatte ich keine Probleme bei meinem Verfahren, lokal mit xampp (php v. 5.0.3) an meinen Seiten zu arbeiten und sie dann komplett auf den Webspace (hier v. 4.1.3) zu laden. Bis jetzt.

1.) Kann ich in der php.ini oder so einstellen, dass er mir auch Fehler anzeigt, die für früheren PHP-Versionen im Code bestehen?

2.) zum eigentlichen Problem:

Ich habe eine test.php:

<?php
 require_once "funktionen.php";
 redirect("home.php");
?>

und eine funktionen.php: (Auszug)

//>> Weiterleitungsfunktion
function redirect($ziel, $hostdir) {                         //[DIES IST ZEILE 3]
 if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
     if (php_sapi_name() == 'cgi') {
         header('Status: 303 See Other');
        } else {
         header('HTTP/1.1 303 See Other');                    //[DIES IST ZEILE 8]
        }
 }
 if (!isset($hostdir)) {
   $host = $_SERVER['HTTP_HOST'];
   $path = dirname($_SERVER['PHP_SELF']);
  header('Location: http://'.$host.($path == '/' ? '' : $path).'/'.$ziel);     //[DIES IST ZEILE 14]
 } else {
  header('Location: http://'.$hostdir.'/'.$ziel);
 }
 exit;
}

Führe ich die test.php auf dem lokalen Server aus, funktioniert die Weiterleitung.
Auf dem Webserver hingegen wird Folgendes ausgegeben:

Warning: Missing argument 2 for redirect() in /home/gymbrake/gymnasium-brake.de/V-Planer/funktionen.php on line 3

Warning: Cannot add header information - headers already sent by (output started at /home/gymbrake/gymnasium-brake.de/V-Planer/funktionen.php:3) in /home/gymbrake/gymnasium-brake.de/V-Planer/funktionen.php on line 8

Warning: Cannot add header information - headers already sent by (output started at /home/gymbrake/gymnasium-brake.de/V-Planer/funktionen.php:3) in /home/gymbrake/gymnasium-brake.de/V-Planer/funktionen.php on line 14

Ich wundere mich, warum die erste Warnung auftaucht, denn ich habe mir vor dem Schreiben der Funktion erst nochmal das Kapitel für eigene Funktionen im PHP Handbuch durchgelesen.
Und da steht unter http://de.php.net/manual/de/functions.arguments.php#functions.variable-arg-list:

"Variable Anzahl von Parametern

PHP 4 unterstützt eine variable Anzahl von Parametern in benutzerdefinierten Funktionen. [...]

Es ist keine spezielle Syntax erforderlich. Die Parameter können wie gehabt explizit in den Funktionsdeklarationen angegeben werden, und werden sich wie gewohnt verhalten."

Die weiteren beiden Warnungen verstehe ich nicht. Erwartet hätte ich sie, wenn ich vor dem Senden des Headers schon Seiteninhalt gesendet hätte.
Ach so! Tauchen die auf, weil die erste Warnung "Seiteninhalt" ist und somit schon was an den Browser gesendet wurde?
Handelt es sich also nur um das Problem mit der variablen Parameteranzahl?

Grüße
Christian

  1. echo $begrüßung;

    bisher hatte ich keine Probleme bei meinem Verfahren, lokal mit xampp (php v. 5.0.3) an meinen Seiten zu arbeiten und sie dann komplett auf den Webspace (hier v. 4.1.3) zu laden. Bis jetzt.

    PHP5 ist teilweise doch erheblich anders als PHP4. Mal abgesehen, dass 4.1.3 schon recht betagt ist. Xampp lässt sich auch auf Version 4 umstellen, wenn auch nicht auf solch eine alte Version (jedenfalls nicht ohne Handarbeit).

    1.) Kann ich in der php.ini oder so einstellen, dass er mir auch Fehler anzeigt, die für früheren PHP-Versionen im Code bestehen?

    Welche Fehlermeldungen sind denn überhaupt eingeschaltet? Siehe dazu in der Ausgabe von phpinfo() die Werte display_errors, (display_startup_errors) und error_reporting (sollte während der Entwicklung auf E_ALL bzw. 2047 stehen)

    PHP 4 unterstützt eine variable Anzahl von Parametern in benutzerdefinierten Funktionen. [...]

    Es ist keine spezielle Syntax erforderlich.

    Das soll heißen: gar nichts angeben und wie dort erwähnt func_num_args(), func_get_arg(), and func_get_args() zu dessen Abfrage nutzen.

    Die Parameter können wie gehabt explizit in den Funktionsdeklarationen angegeben werden, und werden sich wie gewohnt verhalten."

    Das ist kein Widerspruch zur vorangehenden Aussage, da angegebenen Parameter ohne Default-Wert nicht ungestraft weggelassen werden können. Default-Wert ist ein Stichwort zur Lösung des Problems.

    Die weiteren beiden Warnungen verstehe ich nicht. Erwartet hätte ich sie, wenn ich vor dem Senden des Headers schon Seiteninhalt gesendet hätte.

    Hast du auch. Die erste Warnung veranlasste PHP dazu.

    Ach so! Tauchen die auf, weil die erste Warnung "Seiteninhalt" ist und somit schon was an den Browser gesendet wurde?

    Ja.

    Handelt es sich also nur um das Problem mit der variablen Parameteranzahl?

    Ja.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      Welche Fehlermeldungen sind denn überhaupt eingeschaltet? Siehe dazu in der Ausgabe von phpinfo() die Werte display_errors, (display_startup_errors) und error_reporting (sollte während der Entwicklung auf E_ALL bzw. 2047 stehen)

      Es steht auf E_ALL.

      PHP 4 unterstützt eine variable Anzahl von Parametern in benutzerdefinierten Funktionen. [...]

      Es ist keine spezielle Syntax erforderlich.

      Das soll heißen: gar nichts angeben und wie dort erwähnt func_num_args(), func_get_arg(), and func_get_args() zu dessen Abfrage nutzen.

      unschön und umständlich. aber na gut.

      Die Parameter können wie gehabt explizit in den Funktionsdeklarationen angegeben werden, und werden sich wie gewohnt verhalten."

      Das ist kein Widerspruch zur vorangehenden Aussage, da angegebenen Parameter ohne Default-Wert nicht ungestraft weggelassen werden können.

      Aber warum funktioniert dann folgendes nicht?:
      function redirect($ziel, $hostdir = "") {...}
      Sowieso blödsinn. Wieso ist der Default-Wert nicht "", wenn man ihn nicht angibt?
      Und außerdem kann man bei PHP 5.0.3 ja auch Parameter ohne Default-Wert ungestraft weglassen.

      Grüße
      duddle

      1. echo $begrüßung;

        Aber warum funktioniert dann folgendes nicht?:
        function redirect($ziel, $hostdir = "") {...}

        Definiere bitte "funktioniert nicht".

        Sowieso blödsinn. Wieso ist der Default-Wert nicht "", wenn man ihn nicht angibt?

        Weil er auch 0, NULL, array(), oder ein beliebiger anderer Wert sein kann. Woher soll PHP denn wissen, was du grad brauchst?

        Und außerdem kann man bei PHP 5.0.3 ja auch Parameter ohne Default-Wert ungestraft weglassen.

        Das kann ich mit PHP 5.0.4 nicht nachvollziehen. Ich bekomme bei

        function foo($bar, $weg) {}
        foo('bla');

        eine: Warning:  Missing argument 2 for foo() in ...

        echo "$verabschiedung $name";

        1. hi dedlfix,

          Definiere bitte "funktioniert nicht".

          Da kommt übliche "Die gewünschte Seite kann nicht angezeigt werden", was kommt, wenn die eingegebene Seite nicht vorhanden ist.
          Ich hab das jetzt aber auch nicht weiter verfolgt.
          Falls ich's noch einmal brauche, werde ich diese Variante noch einmal  probieren.

          Und außerdem kann man bei PHP 5.0.3 ja auch Parameter ohne Default-Wert ungestraft weglassen.

          Das kann ich mit PHP 5.0.4 nicht nachvollziehen. Ich bekomme bei

          function foo($bar, $weg) {}
          foo('bla');

          eine: Warning:  Missing argument 2 for foo() in ...

          Ja, das kommt bei mir auch. Aber jetzt wundert es mich umso mehr, warum meine ursprüngliche redirect-Funktion lokal einwandfrei funktionierte, obwohl ich immer nur redirect("home.php"); angegeben hab!
          Hat aber keinen Wert, den Grund dafür herauszufinden, wenn es eh eine falsche Syntax ist.

          Grüße
          Christian