Matze: kein mysql_error() in Fehler-mails

Hallo Forum!

Ich habe ein Script zum Herstellen einer Datenbankverbindung das mir in dem Fall, dass die Verbindung nicht hergestellt werden konnte, eine e-mail mit dem Fehler schicken soll.

Folgendes kleine Stück sollte dafür sorgen:

// Zugangsdaten  
$dbuser = "xxxxx";  
$dbpwd = "xxxxx";  
$dbname = "xxxxx";  
// Verbindung herstellen  
$connect = @mysql_connect("localhost", $dbuser, $dbpwd);  
$error = '0';  
if(!$connect){  
    $error = '1';  
    $mailtxt = "Verbindung zur Datenbank nicht möglich: ".mysql_error()."\n\r";  
    $mailtxt .= "Uhrzeit und andere Angaben..."  
}else{  
    // Datenbank auswählen  
    $dbselect = @mysql_select_db($dbname);  
    if(!$dbselect){  
        $error = '2';  
        $mailtxt = "Konnte Datenbank nicht auswählen: ".mysql_error()."\n\r";  
        $mailtxt .= "Uhrzeit und andere Angaben..."  
    }  
}  
// bei Fehler  
if($error != '0'){  
    // e-mail schicken  
}

Das Problem ist, dass mein Postfach überquillt vor Fehlermails mit dem Text:
"Verbindung zur Datenbank nicht möglich: " und dann die Uhrzeit und die anderen Angaben. Es fehlt aber der mysql_error().

Es scheint auch so, dass ich bei jedem Zugriff eine Fehlermail bekomme, zumindest der Menge nach zu urteilen* und nicht bei einem tatsächlichen Fehler.

Kann mir jemand sagen wo mein Fehler liegt?
Die Zugangsdaten stimmen alle und weiter im Script kann ich mit der MySQL-Verbindung auch arbeiten. Wieso werden also massig mails an mich verschickt?

Danke und Grüße, Matze

  1. Moin!

    Ich habe ein Script zum Herstellen einer Datenbankverbindung das mir in dem Fall, dass die Verbindung nicht hergestellt werden konnte, eine e-mail mit dem Fehler schicken soll.

    Folgendes kleine Stück sollte dafür sorgen:

    Das ist ja nicht der exakte Originalcode, sondern von dir zusammengestellt. Wenn du da dummerweise den einzigen logischen Fehler, den du vielleicht gemacht hast, rauseditiert hast, kann man lange suchen.

    Mach vernünftiges Debugging. Lass dir Logmeldungen in eine Datei schreiben (error_log() bietet sich an dafür), um Klarheit zu gewinnen, wohin der Code verzweigt. Lass dir den Inhalt von Variablen ausgeben, um Klarheit über deren tatsächlichen Inhalt zu gewinnen.

    Ich tippe mal auf einen von zwei möglichen Fehlern:
    1. Ein "Nicht" zuviel oder zuwenig bei boolscher Operation.
    2. Variableninhalt "0" wird von dir als "wahr" erwartet, aber von PHP als "falsch" interpretiert.

    - Sven Rautenberg

    1. Hallo Sven!

      Das ist ja nicht der exakte Originalcode, sondern von dir zusammengestellt.

      Das ist _ganz genau_ das was läuft. Bis auf die entfernten Zugangsdaten und mysql.xxxxxxxxxx.com anstatt localhost.
      Da ich aber ohne Probleme auf die Datenbank zugreifen kann müssen diese Daten wohl stimmen.

      Lass dir den Inhalt von Variablen ausgeben, um Klarheit über deren tatsächlichen Inhalt zu gewinnen.

      Ich kann, indem ich einfach ein falsches Passwort angebe, einen mysql_error erzwingen.
      Allerdings steht in dem Fehler dann nicht mysql.xxxxxxx.com sondern "...using password for xxx@yyyyyy.zzzzzzzz.com ...". Komisch.
      Die e-mails dazu haben auch den richtigen Inhalt, also inklusive dem mysql_error.
      Ich kann mir $mailtxt auch vor oder nach mail() ausgeben lassen und erhalte den gewünschten Inhalt.
      Ich hab einfach keine Ahnung warum ich hunderte mails ohne Fehler erhalte :(

      Ich tippe mal auf einen von zwei möglichen Fehlern:

      1. Ein "Nicht" zuviel oder zuwenig bei boolscher Operation.
      2. Variableninhalt "0" wird von dir als "wahr" erwartet, aber von PHP als "falsch" interpretiert.

      Leider weiß ich nicht wo eines der Probleme im Code auftauchen sollte.

      Danke und Grüße, Matze

      1. Hi!

        Lass dir den Inhalt von Variablen ausgeben, um Klarheit über deren tatsächlichen Inhalt zu gewinnen.

        Hast du diesen Hinweis von Sven befolgt? Es geht nicht nur um den Inhalt von $mailtxt, wenn du den Fehler finden willst. Auch die anderen Variablen können Unerwartetes enthalten.

        Es sieht so aus, als ob dein Code im Hauptscript steht und nicht in einer Funktion gekapselt ist. In dem Fall kannst du nur $GLOBALS ausgeben lassen, wenn du alle Variableninhalte haben willst. Das sollte obendrein noch mir var_dump() erfolgen, denn das ist genauer in seiner Anzeige. Wenn die fehlerhaften Mails auch auf dem Probesystem erzeugt werden, kannst du einfach ein var_dump($GLOBALS); einfügen (vorher ein <pre> erhöht die Übersichtlichkeit der Ausgabe). Sind die Mails nur auf dem Produktivsystem, solltest du die var_dump_Ausgabe in der Mail mitschicken. Dummerweise gibt es keinen Parameter, der die var_dump-Ausgabe in eine Variable umleitet, so dass hier mit Output Buffering gearbeitet werden muss.

        ob_start();
        var_dump($GLOBALS);
        $dump = ob_get_clean();

        Schau dir nun all deine verwendeten Variablen an, sie sollten am Ende der Ausgabe zu finden sein.

        Lo!

        1. Hallo,

          Hast du diesen Hinweis von Sven befolgt?

          Ich dachte zumindest ich hab verstanden um was es geht.

          Der Inhalt der Variablen sieht so aus:
            ["dbname"]=>
            string(7) "xxxxxxxxxxxxx"
            ["dbuser"]=>
            string(10) "xxxxxxxxxxxx"
            ["dbpwd"]=>
            string(13) "xxxxxxxxxxxx"
            ["email_admin"]=>
            string(16) "xxxx@example.org"
            ["scripturl"]=>
            string(36) "http://localhost/"
            ["db"]=>
            resource(2) of type (mysql link)
            ["error"]=>
            string(1) "0"
            ["dbselect"]=>
            bool(true)

          Die Ausgabe stammt vom Live-System.
          Ich weiß nicht wie ich das Script mit richtigen Angaben zur Datenbank dazu bewegen kann eine Mail ohne Fehler zu verschicken.

          Danke und Grüße, Matze

          1. Hi,

            ["db"]=>
              resource(2) of type (mysql link)

            Die Ausgabe stammt vom Live-System.

            In dem Code, den du uns gezeigt hast, und der angeblich absolut 100% identisch sein soll, heisst die Variable, in der du die Verbindungskennung ablegst, aber komischerweise $connect.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Ach herrje...

              Danke Chris, das war tatsächlich ein Copy&Paste-Fehler. Daran lag es aber nicht.

              Ich mach mich jetzt mal ganz klein und erklär woran es gelegen hat, hab den Fehler also gefunden....

              Als ich die Datenbankverbindung ausgelagert habe, hab ich in einem anderen Teil des Scripts, der später per include eingelesen wird, ebend jenen Codeschnipsel vergessen.
              Lokal reicht dann als Server localhost, das stand dort auch noch schön so da und hat brav die mail geschickt. Auf dem live-server hätte dort allerdings ein anderer Server hingehört.

              Ich bin manchmal so dämlich...

              Danke und Grüße, Matze

  2. Hello,

    if(!$connect){
        $error = '1';
        $mailtxt = "Verbindung zur Datenbank nicht möglich: ".mysql_error()."\n\r";
        $mailtxt .= "Uhrzeit und andere Angaben..."

    Hier sollte mysql_error() auch nichts liefern, weil der Status immer zur Connection gehört und die ist ja nun gerade nicht zustande gekommen.

    Frage stattdessen $php_errormsg ab.
    Dazu musst Du aber die Konfiguration entsprechend einstellen:

    ini_set('track_errors', 19,

    http://de.php.net/manual/en/reserved.variables.phperrormsg.php

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi!

      Hier sollte mysql_error() auch nichts liefern, weil der Status immer zur Connection gehört und die ist ja nun gerade nicht zustande gekommen.

      Das ist nicht richtig. Auch für Fehler bei mysql_connect() gibt mysql_error() eine Meldung aus.

      Frage stattdessen $php_errormsg ab.

      Irrelevant, MySQL-Fehler sind keine PHP-Fehler.

      Vielleicht verwechselst du das gerade mit der mysqli-Extension. Da wäre ein Connect-Fehler mit mysqli_connect_error() abzufragen und mysqli_error() liefert nur Fehler für aufgebaute Verbindungen.

      Lo!

      1. Hello,

        Hier sollte mysql_error() auch nichts liefern, weil der Status immer zur Connection gehört und die ist ja nun gerade nicht zustande gekommen.

        Das ist nicht richtig. Auch für Fehler bei mysql_connect() gibt mysql_error() eine Meldung aus.

        Auf welche Verbindung bezieht sich das dann?
        Es ist ja keine vorhanden, die ggf. automatisch ausgewählt werden könnte.
        Und wenn es eine weitere geben sollte, müsste eigentlich diese ausgewählt werden.

        http://de.php.net/manual/en/function.mysql-error.php

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          Hier sollte mysql_error() auch nichts liefern, weil der Status immer zur Connection gehört ...
          Auf welche Verbindung bezieht sich das dann?

          wie kommst du darauf, dass mysql_error() sich auf eine konkrete Verbindung bezieht? Die Beschreibung
           "Returns the text of the error message from previous MySQL operation"
          ist doch eigentlich eindeutig genug, und auch ein paar Zeilen tiefer im Text heißt es nochmal
           "Note that this function only returns the error text from the most recently executed MySQL function"
          womit klar gesagt ist, dass damit die Fehlermeldung zur letzten davor ausgeführten mysql-Funktion abgerufen wird.

          So long,
           Martin

          --
          "Gestern habe ich die Rede des Parteivorsitzenden gehört. Zwei Stunden lang!" - "Worüber?" - "Hat er nicht gesagt."