Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Errors als eMail versenden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL Errors als eMail versenden

    Hallo zusammen,

    ich lasse per Cronjob um Mitternacht ein Wartungs-Skript laufen, welches viele SQL-Abfragen enthält.

    Nun würde ich mir gerne eine eMail zuschicken lassen, welche alle mysql_errors ausgibt. Ich nehme an, am einfachsten wäre es wahrscheinlich, eine Funktion für die DB-Abfrage zu erstellen. Diese könnte nach der Abfrage überprüfen ob mysql_error gesetzt ist, und wenn dies der Fall ist, diese an einen String hängen.

    Aber zeigt mysql_error den Fehler der letzten Abfrage oder einfach nur den letzten Fehler? Denn wenn er einfach nur den letzten Fehler zeigt und ich habe 5 SQL-Abfragen und in der ersten war ein Fehler, alle anderen liefen jedoch einwandfrei, so wäre mysql_error ja noch immer gesetzt, oder nicht? Oder wird es mit jeder neuen Abfrage überschrieben und wieder zurückgesetzt?

    Ich hatte mir folgendes überlegt:
    PHP-Code:
    function mysql_abfrage($abfrage){
       
    $abfrage mysql_real_escape_string($abfrage);
       
    $resultat mysql_query($abfrage);
       if (isset(
    mysql_error())) {
          
    $fehler .= 'MySQL Fehler '.mysql_errno().': '.mysql_error().' bei Abfrage: '.$abfrage;
     }


    //Skript:

    $fehler '';

    //Abfragen 1, 2, 3:

    $abfrage 'SELECT....';
    mysql_abfrage($abfrage);

    $abfrage 'SELECT....';
    mysql_abfrage($abfrage);

    $abfrage 'SELECT....';
    mysql_abfrage($abfrage);

    mail('abc@de.fg''Fehlermeldungen'$fehler); 
    Was sagen die Profis dazu?

    Vielen Dank!
    a.

  • #2
    Also so wie der Code jetzt aussieht wird er nicht wie gewünscht funktionieren.

    Meines Wissens nach, enthält mysql_error nur die eventuelle Fehlermeldung des letzten Querys.

    Im grunde genommen funktioniert deine Funktion, jedoch musst du $fehler als global in der Funktion definieren, sonst hast du keinen zugriff ausserhalb der Funktion.

    Edit #1:
    Obwohl ich die global Lösung nicht unbedingt bevorzuge...

    Kommentar


    • #3
      Das könnte man probieren:

      PHP-Code:
      $resultat mysql_query($abfrage) or sende_mailmysql_error() ); 

      Kommentar


      • #4
        Okay, ich hab die Funktion nun so, und damit funktionierts:

        PHP-Code:
        function mysql_abfrage($abfrage){
           global 
        $fehler;
        //   $abfrage = mysql_real_escape_string($abfrage);
           
        $resultat mysql_query($abfrage);
           if ((
        mysql_errno() > 0)) {
              
        $fehler .= 'MySQL Fehler '.mysql_errno().": \r\n".mysql_error().' bei Abfrage: '.$abfrage." \r\n \r\n";
         }



        Natürlich kann ich die Abfrage dort nicht mehr escapen, weil ja schon ' und () und sowas alles in der Abfrage enthalten sind.

        Gibt es eine Möglichkeit, trotzdem eine Sperre gegen SQL-Injections in diese Funktion einzubauen, oder muß ich das dann einer anderen Funktion überlassen? Wahrscheinlich muß es außerhalb dieser Funktion geschehen, denn ich muß es ja machen, bevor die Variable in den String der Abfrage aufgenommen wird.

        Grüße,
        a.

        Kommentar


        • #5
          Zitat von Wolla Beitrag anzeigen
          Das könnte man probieren:

          PHP-Code:
          $resultat mysql_query($abfrage) or sende_mailmysql_error() ); 
          Der Nachteil wäre aber, dass für jeden Fehler eine Mail verschickt wird. Je nach Code-Sauberkeit könnte das den Server überlasten

          Kommentar


          • #6
            ja sowas ist möglich. Du erweiterst deine funktion um einen Parameter.

            Den ersten Parameter übergibst du einen [MAN]vsprintf[/MAN]-String, dem 2ten ein Array.

            Das ganze könnte dann wie folgt aussehen:
            PHP-Code:

            mysql_abfrage
            (
              
            'SELECT foo FROM bar WHERE foo = \'%s\'',
              array(
                
            'foobar'
              
            )
            ); 

            Kommentar


            • #7
              Wahrscheinlich muß es außerhalb dieser Funktion geschehen, denn ich muß es ja machen, bevor die Variable in den String der Abfrage aufgenommen wird.
              Absolut richtig. Es sei denn, Du baust die Query erst in der Funktion zusammen.
              Gibt es eine Möglichkeit, trotzdem eine Sperre gegen SQL-Injections in diese Funktion einzubauen, oder muß ich das dann einer anderen Funktion überlassen?
              Ja, Du könntest mit sprintf und variablen Parameter bzw. vsprintf und einem Array-Parameter mit Queryangaben arbeiten. Ich würde letzteres empfehlen, weil:

              Zum obigen Problem: Du könntest einen Parameter als Referenz übergeben, der den Fehler aufnimmt und/oder sammelt.
              Btw.: Wieso verwendest Du nicht den return Wert für den Fehler?

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Ja, Du könntest mit sprintf und variablen Parameter bzw. vsprintf und einem Array-Parameter mit Queryangaben arbeiten.
                Da hab ich jetzt nicht viel von verstande, werde mich aber mal kundig machen.

                Btw.: Wieso verwendest Du nicht den return Wert für den Fehler?
                Wie kann ich denn per return einen String an einen anderen anhängen (also das, was sonst per .= geht)?

                a.

                Kommentar


                • #9
                  PHP-Code:
                  return "einstring"."einandererstring"

                  Kommentar


                  • #10
                    Okay, klingt logisch )

                    Werde ich mal ausprobieren, sobald ich dazu komme!

                    Kommentar


                    • #11
                      Eine Funktion kann immer nur eine einzige Variable zurückgeben. Diese kann aber auch ein array sein, mit dem du dann mehrere Werte zurückliefern kannst.

                      Kommentar

                      Lädt...
                      X