Tom: Existenz einer Unterfunktion abfragen, Tester benötigt

Hello,

ich ahbe es auf diese beiden Unterfunktionen von fopen() abgesehen.

'x'
Create and open for writing only; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call. This option is supported in PHP 4.3.2 and later, and only works for local files.

'x+'
Create and open for reading and writing; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call. This option is supported in PHP 4.3.2 and later, and only works for local files.

Aber:
This option is supported in PHP 4.3.2 and later

Ob eine Funktion vorhanden ist, kann ich im Script mit function_exists()
http://de.php.net/manual/en/function.function-exists.php
erfragen.

Wie kann ich aber erfragen, ob diese Funktion die Unterfunktion x schon kennt?

Bleibt mir da nur das Vabang-Spiel mit phpversion()?

Was passiert denn überhaupt definitionsgemäß, wenn man eine fertige Funktion mit einem Argumentwert aufruft, der nicht vorgesehen ist?

Könnte das kleine Script mal bitte jemand ausführen, der noch ein älteres PHP als Version 4.3.2 laufen hat? Ich habe nun ja leider auf 4.3.8 updated und will das nicht unbedingt wieder zurückdrehen.

<?php   ### opentest.php ###

error_reporting(E_ALL);
ini_set('track_errors','1');

$dateiname = 'opentest123.txt';

$fh = fopen($dateiname,'x+');

if (!$fh)
{
  echo "<br />Fehler: $php_errormsg<br />";
}
else
{
  echo "<br />Datei $dateiname wurde angelegt<br />";
}

fclose($fh);
?>

Bitte zweimal hintereinander aufrufen in einem Verzeichnis, in dem der Webserver schreiben darf.
Und bitte posten, welche PHP-Version auf welchem Apachen und welchem OS.

Danke Euch

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. Hello,

    noch etwas zum Thema "künstliche Fehler produziern" in PHP und dann gezielt abfragen:

    Es gibt die wunderhübschen Fehlermeldungen und Warnungen.
    Die kann man ja nun auch unterdrücken.
    In $php_errormsg steht leider auch nur die Hälfte drin dann.

    Gibt eine Möglichkeit, eine gezielte Fehlernummer zu erfragen?
    Das wäre mir wesentlich sympathischer, als die Fehlertexte aus $php_errormsg auszukugeln.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. hi,

      noch etwas zum Thema "künstliche Fehler produziern" in PHP und dann gezielt abfragen:

      bin mir gerade nicht so sicher, ob dir das was hilft. aber zum thema errorhandling mache ich das immer so:
      trigger_error('blabla', E_USER_ERROR);

      das ist dann zumindest schonmal ein richtiger fehler und keine ausgabe.
      dann kannst du dir mit

      php_admin_value display_errors Off;
        php_admin_value error_log "e:\eigene\_web\hu\log\phperror.log"
      #  php_admin_value log_errors On;   ***

      in deiner httpd.conf fürs verzeichnis oder in der .htaccess das logging anschalten und die error-ausgabe ausschalten. wenn du dann noch einen eigenen error-handler schreibst, kannst du mittels debug_backtrace() so ziemlich alles rausfinden was du willst.

      In $php_errormsg steht leider auch nur die Hälfte drin dann.

      da weiss ich gar nicht was drin steht...

      Gibt eine Möglichkeit, eine gezielte Fehlernummer zu erfragen?

      imho mit der oben genannten variante ja, denn die fehlernummer wird bei debug_backtrace mit angegeben. die funktion kannst du übrigens auch ohne einen fehler aufrufen - sehr praktisch.

      ***: komischerweise funktionierte bei mir das logging nur, wenn ich es auch in der php.ini schon an hatte. don't know why. müsste aber _eigentlich_ auch so gehen

      viele grüsse,
      andi

      1. nochwas vergessen:

        bei eigens ausgelösten fehlern, bekommst du nat. nur die 'USER_ERRROR' codes. das schleift etwas. aber vielleicht hilfts trotzdem.

        die woche habe ich erst gelernt:
        tail -f dateiname.log

        zeigt dir immer die hinzugekommenen zeilen einer datei an (gibts zb. auch in der cygwin installation)

        andi

        1. Hello Andi,

          Danke!
          die Tipps sind nicht ganz schlecht...;-) Da muss ich mich dann wohl mal reinwühlen.

          Allerdings wäre mir so auf die Schnelle sowas wie $php_errormsg, aber eben als $php_errorno lieber gewesen. Und da müsste es dann eine schöne Tabelle geben, in der steht

          Fehlernummer       Bedeutung
           0                  No Error
           2                  File not Found
           5                  Network Permission Error

          usw.

          Ich bin da von der DOSE und von Pascal und auch von eigenen Assemblerroutinen und Datenbanken enorm verwöhnt. Dann kann ein Programm nämlich gezielt reagieren.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Moin Tom,

            #####################################################################################

            PHP läuft als            CGI // 4.3.4
            Apache                   1.3.29
            OS                       debian Linux

            1. Durchlauf            "Datei opentest123.txt wurde angelegt"
            Auszug error.log         -kein Eintrag-

            2. Durchlauf            "Fehler: failed to open stream: File exists"
            Auszug error.log         [11-Aug-2004 02:42:38] PHP Warning:  fopen(opentest123.txt):
                                     failed to open stream: File exists in [...] on line 8
                                     [11-Aug-2004 02:42:38] PHP Warning:  fclose(): supplied
                                     argument is not a valid stream resource in [...] on line 19

            #####################################################################################

            PHP läuft als            Handler // 4.3.4
            Apache                   2.0.49
            Os                       suse Linux

            1. Durchlauf            "Datei opentest123.txt wurde angelegt"
            Fehlerpromt              -keine Anzeige-

            2. Durchlauf            "Fehler: failed to open stream: File exists"
            Fehlerpromt              Warning: fopen(opentest123.txt):
                                     failed to open stream: File exists in [...] on line 8
                                     Warning: fclose(): supplied
                                     argument is not a valid stream resource in [...] on line 19

            #####################################################################################

            PHP läuft als            CGI // 4.1.2
            Apache                   1.3.26
            Os                       SunOS

            1. Durchlauf            "Fehler: fopen("opentest123.txt", "x+") - Invalid argument"
            Fehlerpromt              Warning: fopen("opentest123.txt", "x+") - Invalid argument
                                     in [...] on line 8
                                     Warning: Supplied argument is not a valid
                                     File-Handle resource in [...] on line 19

            2. Durchlauf             -nicht notwendig-

            #####################################################################################

            windoof habe ich nicht mehr :\

            Gruß aus Berlin!
            eddi

            --
            Manchmal trifft es einen doch ganz unverhofft t86591:
            > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
            Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
            1. Hello,

              1. Durchlauf            "Fehler: fopen("opentest123.txt", "x+") - Invalid argument"
                Fehlerpromt              Warning: fopen("opentest123.txt", "x+") - Invalid argument
                                         in [...] on line 8
                                         Warning: Supplied argument is not a valid
                                         File-Handle resource in [...] on line 19

              Danke.
              Jetzt muss ich nur überlegen, wie ich diese Texte aus $php_errormsg parse, um sie auszuwerten. Eine eindeutige Fehlernummer wäre mir wirklich lieber. :-(

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. moin tom,

                ich schon wieder. hab das ganze nochmal getestet, leider geht es nicht ganz so komfortabel wie ich angepriesen habe, da man keine beliebigen errornumern vergeben kann. aber dafür hast du alles schön sortiert verfügbar und es geht sehr einfach zu konfigurieren.

                hab jetzt nur mal ganz fix aus dem manual was zusammenkopiert um es dir zu präesentieren. du kannst ja den handler wirklich nur bei der kritischen operation umdefinieren und danach wieder den alten handler setzen. so kannst musst du nicht alles umkonfigurieren.

                viele grüsse,
                andi

                //--------------------------------------------------------------------
                //script:

                <?PHP
                $dateiname = 'opentest123.txt';

                // die Stufe für dieses Skript einstellen
                error_reporting(E_ALL);

                // Fehlerbehandlungsfunktion
                function myErrorHandler($errno, $errstr, $errfile, $errline)
                {
                  echo '<pre>';print_r(debug_backtrace());echo '</pre>';
                  switch ($errno) {
                  case FATAL:
                    echo "<b>FATAL</b> [$errno] $errstr<br />\n";
                    echo "  Fatal error in line $errline of file $errfile";
                    echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
                    echo "Aborting...<br />\n";
                    exit(1);
                    break;
                  case ERROR:
                    echo "<b>ERROR</b> [$errno] $errstr<br />\n";
                    break;
                  case WARNING:
                    echo "<b>WARNING</b> [$errno] $errstr<br />\n";
                    break;
                  case NOTICE:
                    echo "<b>NOTICE</b> [$errno] $errstr<br />\n";
                    break;
                  default:
                    echo "Unkown error type: [$errno] $errstr<br />\n";
                    break;
                  }
                }

                // auf die benutzerdefinierte Fehlerbehandlung umstellen
                $old_error_handler = set_error_handler("myErrorHandler");

                if(!$handle = fopen($dateiname,'x+'))
                {
                  trigger_error('scheisse',999);
                }
                ?>

              2. //--------------------------------------------------------------------
                //ausgabe:

                Array
                (
                    [0] => Array
                        (
                            [function] => myerrorhandler
                            [args] => Array
                                (
                                    [0] => 2
                                    [1] => Invalid error type specified
                                    [2] => C:\eigene\_web\test\file.php
                                    [3] => 40
                [....]
                                            [dateiname] => opentest123.txt
                                            [old_error_handler] =>
                                            [handle] =>
                                        )

                )

                )

                [1] => Array
                        (
                            [file] => C:\eigene\_web\test\file.php
                            [line] => 40
                            [function] => trigger_error
                        )

                )

                Unkown error type: [2] fopen(opentest123.txt): failed to open stream: File exists

                1. Hello,

                  ich habe noch ganz andere Merkwürdigkeiten in Zusammenhang mit fopen(dateiname,xb) ermittelt.
                  Da verschwindet plötzlich die Variable $php_errormsg und man erhält die Meldung:

                  Notice: Undefined variable: php_errormsg in /home/thomas/public_html/test/artikel_locking/opentest.php on line 23

                  Einen Moment vorher war sie noch da und so oft abfragbar, wie man wollte.

                  Harzliche Grüße aus http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
      2. Hello,

        debug_backtrace() erzeugt bei mir in jeder beliebigen Konstellation nur ein leeres Array.

        Ich weiß nicht, woran es liegt. PHP Version 4.3.8.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau