luckger: DESTRUKTOR

Hallo zusammen,

ich bin gerade dabei mir eine kleine mysql-Klasse zu erstellen. Dabei möchte ich jeweils die Abfrage in der Klasse ausführen. Tritt ein Fehler auf, wird das Ganze in eine Variable geschrieben.

Am Ende der Seite soll im Destruktor eine Mail an mich geschrieben werden, die sämtliche Fehler enthält.

Nun habe ich nur das Problem, dass durch einen evtl. auftretenden SQL Error ein PHP Error ausgelöst wird (evtl leere Variable, falscher Arrayzugriff o.ä.) und damit der Destruktor nicht mehr ausgelöst wird.

Hat jemand eine Ahnung wie man den Destruktor unter allen Umständen auslösen kann?

Vielen Dank schon im voraus,

luckger

  1. Hi,

    Gegenfrage: Warum ausgerechnet in einem Klassen-Destruktor?

    <zitat>
    PHP 5 introduces a destructor concept similar to that of other object-oriented languages, such as C++. The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.
    </zitat>

    Vielleicht solltest du dich allgemein mal mit dem Thema Exceptions vertraut machen.

    Ciao, Frank

  2. echo $begrüßung;

    ich bin gerade dabei mir eine kleine mysql-Klasse zu erstellen.

    Gefällt dir die mysqli-Klasse nicht?

    Dabei möchte ich jeweils die Abfrage in der Klasse ausführen.

    Du kannst sie auch erweitern, wenn sie noch nicht die Funktionalität bietet, die du benötigst.

    Tritt ein Fehler auf, wird das Ganze in eine Variable geschrieben.

    Mehr nicht? Machst du dann einfach weiter, und ignorierst ansonsten dass ein Fehler auftrat?

    Am Ende der Seite soll im Destruktor eine Mail an mich geschrieben werden, die sämtliche Fehler enthält.

    Nun habe ich nur das Problem, dass durch einen evtl. auftretenden SQL Error ein PHP Error ausgelöst wird (evtl leere Variable, falscher Arrayzugriff o.ä.) und damit der Destruktor nicht mehr ausgelöst wird.

    Wenn ein PHP-Fehler ausgelöst wird, dann hast du die Information ignoriert, dass ein SQL-Fehler auftrat. Die mysql- und mysqli-Funktionen geben beim Abarbeiten auf dem MySQL-Server aufgetretene Fehler bekannt, ohne einen PHP-Fehler auszulösen.

    Hat jemand eine Ahnung wie man den Destruktor unter allen Umständen auslösen kann?

    Wenn gravierende Fehler auftreten, wie Speicherlimit erreicht, dann ist auch kein Speicher mehr für die Ausführung des Konstruktors oder anderer selbst geschriebener Funktionen vorhanden. Ein Aufruf "unter allen Umständen" ist illusorisch.

    Kennst du das Kapitel Error Handling und Logging? Dass mehrere Fehler auftreten, ist meist eine Folgeerscheinung eines unerwarteten Zustands. Warum sendest du nicht gleich die Email ab? Und was ist mit "normalen" PHP-Fehlern? Willst du darüber nicht vielleicht auch zwecks Behebung eine Information bekommen?

    echo "$verabschiedung $name";

    1. Sers,

      danke euch beiden für die schnelle Antwort. Die mysqli Klasse kann man, was ich jetzt so gelesen habe, nur einbinden wenn man Zugriff auf die php.ini hat --> Der Nachteil an einem shared hosting ist, dass genau das nicht gegeben ist ...

      Die Sache mit dem Error Handling / Exceptions ist super interessant.

      Vielen Dank für die Hinweise,

      luckger

      1. echo $begrüßung;

        Die mysqli Klasse kann man, was ich jetzt so gelesen habe, nur einbinden wenn man Zugriff auf die php.ini hat --> Der Nachteil an einem shared hosting ist, dass genau das nicht gegeben ist ...

        Wenn dein Hoster die mysqli-Extension nicht eingebunden hat (siehe phpinfo()-Ausgabe), und dies auch auf Anforderung nicht macht, solltest du darüber nachdenken, ihn zu verlassen. Reden wir überhaupt von PHP 5 oder hat er das auch nicht (oder du es nur noch nicht aktiviert)?

        echo "$verabschiedung $name";

        1. Die Klasse ist tatsächlich nicht eingebunden ....

          luckger

          1. echo $begrüßung;

            Die Klasse ist tatsächlich nicht eingebunden ....

            Es handelt sich dabei nicht nur um eine Klasse sondern um eine Extension (ähnlich mysql, gd, iconv, curl, ctype, ...), die unter anderem die Klasse enthält.

            echo "$verabschiedung $name";

            1. Moin!

              Die Klasse ist tatsächlich nicht eingebunden ....

              Es handelt sich dabei nicht nur um eine Klasse sondern um eine Extension (ähnlich mysql, gd, iconv, curl, ctype, ...), die unter anderem die Klasse enthält.

              Ergänzend dazu: Diese Extension ist zwingend notwendig, um alle Features aktueller MySQL-Versionen (geschätzt so ab 4.1) nutzen zu können - und sie ist praktisch automatisch Bestandteil von PHP 5 (und auch für PHP 4 schon lange verfügbar). Sie explizit abzuschalten wäre unsinnig.

              Wenn der jetzige Hoster weder PHP 5 noch eine aktuelle MySQL-Version anbietet, sollte man mal freundlich auf Aktualisierung drängen (insbesondere bei PHP, die Version 4 ist tot und wird vom Hersteller-Team nicht weiter gepflegt), andernfalls sich nach einem anderen Hoster umsehen, der eine aktuelle Softwareumgebung anzubieten in der Lage ist.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."