warning abfangen

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

  • warning abfangen

    ich habe hier ein bescheuertes problem.

    ich arbeite mit einer eigenen db-klasse. bislang reibungslos. fehler wurden in ein array weggeschrieben und gut ist. so nun passiert folgendes:
    <b>Warning</b>: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in <b>/home/www/***/html/inc/***class.database.php</b> on line <b>146</b><br />
    schlägt auf die seite durch.

    aufgrund der komplexen struktur, ist es nicht ganz einfach, den verursacher auszumachen. vor allem, weil der fehler nicht einfach zu reproduzieren ist. wenn ich länger auf der site untätig war, knallt es, bei einem reload nach dem warning bleibt die meldung aus.

    in der klasse habe ich dann die fetch-methode etwas aufgebohrt:
    PHP-Code:
        function db_fetch($assoc=TRUE)
        {
            
    // keine datenbankverbindung
            // $this->sql ist die letzte sql-anweisung
            
    if($this->dbstatus == false)
                die(
    's ::: '.$this->sql); //return false;

            // keine resource-id
            
    if(!$this->queryres)
                die(
    'q ::: '.$this->sql);

            
    // anzahl datensätze ist NULL, FALSE, 0 oder wieder erwarten ein string
            
    if(is_null($this->querynum) || !$this->querynum || !is_numeric($this->querynum))
                die(
    'n ::: '.$this->sql);

            if(
    $assoc)
                
    $this->queryrecord mysql_fetch_array($this->queryres,MYSQL_ASSOC);
            else
                
    $this->queryrecord mysql_fetch_array($this->queryres,MYSQL_NUM);

            return 
    $this->queryrecord;
        } 
    trotzdem selber effekt. die warning knallt auf die seite.

    bevor die seite ausgegeben wird hab ich dann mal das fehler-array abgefragt, wenn was drin steht, wird es ausgegeben. nur steht nix drin. ich bin etwas ratlos.

    wie finde ich jetzt möglichst elegant raus, welche query/abfrage den fehler auslöst?
    Kissolino.com

  • #2
    if($assoc) {
    echo 'DB-Abfrage';
    $this->queryrecord = mysql_fetch_array($this->queryres,MYSQL_ASSOC);
    }

    so könntest zählen, wie oft "DB-Abfrage" erscheint. Die x. Abfrage ist dann der bösewicht.

    Füg auch einfach mal ein echo mysql_error() ein. Eigentlich müsste ja an irgend einer stelle ein fehler ausgegeben werden.

    HTH
    Zuletzt geändert von TobiaZ; 19.10.2006, 16:08.

    Kommentar


    • #3
      ne, das haut leider nicht hin, da die seite komplett ausgeliefert wird, d.h. das script stoppt ja nicht, wenn das warning kommt.

      schmeisst php die eigentlich warnings sofort aus, wenn sie entstehen, so dass man mit obstart() was reissen kann?

      Füg auch einfach mal ein echo mysql_error() ein. Eigentlich müsste ja an irgend einer stelle ein fehler ausgegeben werden.
      ich haue alle errors in ein array, das am ende ausgegeben wird, wenn es nicht leer ist ... da kommt nix.
      Kissolino.com

      Kommentar


      • #4
        Schau dir mal debug_backtrace an - und per <pre> und print_r ausgeben....


        P.S.: Bist du sicher dass du die Resource in der Klasse ablegen willst...? Was passiert, wenn du 2 Abfragen brauchst, die du in einer Schleife o.Ä. gemeinsam als Resource durchlaufen musst? Erzeugst du dann 2 Objekte..?
        Zuletzt geändert von Shurakai; 19.10.2006, 16:42.
        Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
        var_dump(), print_r(), debug_backtrace und echo.
        Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
        Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
        Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

        Kommentar


        • #5
          Original geschrieben von Shurakai
          Schau dir mal debug_backtrace an - und per <pre> und print_r ausgeben....
          würd ich gerne, wenn ich den &%$§$&%$-fehler endlich wieder bekäme

          P.S.: Bist du sicher dass du die Resource in der Klasse ablegen willst...? Was passiert, wenn du 2 Abfragen brauchst, die du in einer Schleife o.Ä. gemeinsam als Resource durchlaufen musst? Erzeugst du dann 2 Objekte..?
          ich kann mir jetzt grad nicht vorstellen, wann das nötig ist. beispiel?
          Kissolino.com

          Kommentar


          • #6
            Ich fang hier solche Sachen mit try() und catch() ein.

            Das ist zwar nicht die Lösung deines Problems, bietet sich aber zur Protokolierung an und somit anschließenden Lösung an.

            Kommentar


            • #7
              Original geschrieben von Wurzel
              ich kann mir jetzt grad nicht vorstellen, wann das nötig ist. beispiel?
              frag mich grad nich in welchem projekt das war... es war auf jedenfall so dass es zuviele daten waren und ein join nicht sinnvoll war... da hab ich 2 abfragen gemacht und gemeinsam verwendet... lief schneller
              Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
              var_dump(), print_r(), debug_backtrace und echo.
              Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
              Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
              Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

              Kommentar


              • #8
                ich kann mir jetzt grad nicht vorstellen, wann das nötig ist. beispiel?
                manchmal ist sowas wirklich sinnvoll ... aber nicht die regel.

                Was passiert, wenn du 2 Abfragen brauchst,
                was hindert dich daran, in der class ein queryresult array zu haben, wo du deine resourcen ablegst. anzusprechen mit einem indexname als optionaler parameter in der query(), fetch() etc methode ...

                Ich fang hier solche Sachen mit try() und catch() ein.
                und du meinst, dass wurzel auf einem produktivserver schon php5 am laufen hat?
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  ich gehe davon aus, dass entweder connect, oder verbindung zum result aus irgend einem Grund unmitelbar nach mysqlquery abbricht.
                  was dabei komisch ist, dass die Abbrch- Bedingung
                  PHP-Code:
                  if(is_null($this->querynum) || !$this->querynum || !is_numeric($this->querynum))
                              die(
                  'n ::: '.$this->sql);
                  als auch 
                  if(!$this->queryres)
                              die(
                  'q ::: '.$this->sql); 
                  wenn die $this->querynum und $this->querynum geschafft hat sich zu initialisieren, immer noch nicht erfült wird.
                  beispiel
                  PHP-Code:
                  error_reporting(E_ALL);
                  $dbcon=mysql_connect("localhost","","") or die(mysql_error());
                  mysql_select_db("test2")or die(mysql_error());
                  $sql="select * from table2";
                  $hand=mysql_query($sql) or die(mysql_error());
                  echo 
                  $hand;//wird resource ausgegeben.

                  @mysql_free_result($hand); //jetzt simuliere ich abbruch
                  @mysql_close($dbcon);

                  if(!
                  $hand)echo "resource ungültig";
                  else echo 
                  $hand;//das ist immer noch die Resource? und ist nicht false
                  //obwohl $hand mit free_result behandelt wurde , 
                  //als auch connect kaput ist
                  @$erg=mysql_fetch_array($hand);//und hier kommt die gleiche fehlermeldung
                  // wie bei Wurzel wenn man @ weg nimmt.
                  @print_r($erg); 
                  Also sieht es einfach so aus, dass irgendwo nach der mysql_query ein Abbruch von verbindung kommt, und die Aussage, dass es nicht immer sondern nach und zu kommt, könnte vermutlich nicht an der code, sondern an verbindung liegen.
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    danke für die anteilnahme. leider kam der fehler bisher nicht wieder. entweder durch den einbau diverser debug-routinen oder weil ich das richtige "knöpfchen" nicht wieder gefunden habe. es ist zum *****.

                    @slava
                    ich denke, wenn die verbindung abreisst (hab ich auch vermutet), dann sollte das häufiger und unregelmäßiger vorkommen.

                    andererseits könnte das free_result ein interessanter hinweis sein. muss ich mal die scripte durchforsten, ob da irgendwas an falscher stelle abgewürgt wird.

                    @prego
                    wie haxe schon schrieb ... ich habe kein php5 auf einem livesystem.
                    Kissolino.com

                    Kommentar


                    • #11
                      @prego
                      wie haxe schon schrieb ... ich habe kein php5 auf einem livesystem. [/B]
                      Ouh, ok - aber hab ich irgendwas verpasst? Wir haben hier seit über nem Jahr PHP5 im Live betrieb und viele von den "netten" neuen Features möchte ich gar nicht mehr missen...

                      Kommentar

                      Lädt...
                      X