Peter Plan: Debugging-Hilfe gesucht

Hallo Forum,

ich komme grad nicht weiter. Ich rufe eine Seite auf, innerhalb derer und deren includeten Dateien oder Funktionen viele db-Aufrufe abgearbeitet werden.

Funktioniert auch allerbestens. Nun habe ich eine Art styleswitcher eingebaut, der eine andere Datei aufruft, ein paar Änderungen in Sessionvariablen vornimmt und wieder auf die Ursprungsseite zurückleitet.

Funktioniert auch (meistens) allerbestens.

Aber ab und an verliere ich anscheinend die db-Verbindung, denn ich erhalte folgenden Fehler:

Warning: mysql_error(): supplied argument is not a valid MySQL-Link resource in

Wie gehe ich nun vor, um diesen Fehler zu eliminieren?

ich habe wirklich keinen Plan, wo ich und wie ich den Fehler suchen muss.

Grüße, Peter

  1. Aber ab und an verliere ich anscheinend die db-Verbindung,

    Nicht wirklich.

    Warning: mysql_error(): supplied argument is not a valid MySQL-Link resource in

    Deuted eher eher auf einen Syntaxfehler hin.

    Wie gehe ich nun vor, um diesen Fehler zu eliminieren?

    Schreib' im Fehlerfall die SQL-Abfrage in eine Logdatei und analysiere diese Abfrage hinsichtlich Gültigkeit.

    1. Deuted eher eher auf einen Syntaxfehler hin.

      Das glaube ich nicht.

      Schreib' im Fehlerfall die SQL-Abfrage in eine Logdatei und analysiere diese Abfrage hinsichtlich Gültigkeit.

      Habe ich natürlich längst gemacht. Die Abfrage, die übrigens bei allen Abfragn des Gesamtprojekts immer wieder völig klaglos mitläuft, ist absolut ok.

      Ich glaube, ich verliere die Verbndung. Bin aber auch niht ganz sicher, was die Fehlermeldung assagen will.

      Gruß, Peter

      1. Hi!

        Ich glaube, ich verliere die Verbndung. Bin aber auch niht ganz sicher, was die Fehlermeldung assagen will.

        Die Meldung ist ein Folgefehler und deutet darauf hin, dass wie so oft die Rückgabewerte der mysql-Funktionen missachtet werden. Du hast, so wie es aussieht, mysql_error($linkvariable) notiert und die Linkvariable enthält keine Ressourcenkennung sondern ein false, das die vorhergehende Funktion in diese Variable schrub. Teste zuerst die Rückgabewerte, dass sie nicht false enthalten, bevor du sie weiterverwendest. mysql_error() kann man auch prima ohne Verbindungskennung aufrufen (solange man nicht mit mehreren Verbindungen hantiert), beziehungsweise man muss das sogar wenn keine Verbindung zustande kam, man aber trotzdem gern die eigentliche MySQL-Fehlermeldung im Klartext haben möchte.

        Lo!

        1. Hi dedlfix,

          Die Meldung ist ein Folgefehler...

          Bis hierhin habe ichs verstanden.

          Ab dann verstehe ich leider kein Wort mehr :-(

          Also versuche ich, mit dem ersten Halbsatz zu arbeiten und habe solange die Folgefehler durch temporäres rauslöschen der "Verursacher" abgefangen, bis plötzlich diese Fehlermeldung kam:

          No database selected

          Ich weiß aber immer noch nicht, woher...

          Grüße, Peter

          1. Hi!

            Die Meldung ist ein Folgefehler...
            Bis hierhin habe ichs verstanden.
            Ab dann verstehe ich leider kein Wort mehr :-(

            Der Folgefehler entsteht vielleicht durch solch ein Konstrukt:

            $link = mysql_connect(...);
              echo mysql_error($link);

            Wenn nun das mysql_connect() nicht erfolgreich durchgeführt werden konnte, ist der Rückgabewert false statt einer Ressourcenkennung. mysql_error() will aber als Parameter entweder nichts oder eine Ressourcenkennung. Da bei einem misslungenen Connect keine Ressourcenkennung entstanden ist, kann man auch keine an ein nachfolgend aufgerufenes mysql_error() übergeben, weswegen nach einem Connect das mysql_error() ohne Parameter aufgerufen werden muss. Das false jedenfalls führt zur Folgefehlermeldung, dass der übergebenen Parameter nicht das ist, was erwartet wird. Dieses Fehlerbild ist übrigens alt wie der Wald.

            Wenn bei dir die Situation eine andere ist, beispielsweise nach einem mysql_select_db() oder mysql_query(), dann wirst du vielleicht dessen Rückgabewert an mysql_error() verfüttert haben, was ganz falsch wäre. Entweder eine Link-Kennung, wie sie von mysql_connect() im Gutfall erzeugt wurde, oder schlichtweg auch wieder parameterlos aufrufen. Das geht immer, solange du nicht mit mehreren Verbindungen arbeitest, denn dann nimmt die Funktion einfach die eine vorhandene Verbindung.

            Lo!

            1. Hi,

              jetzt verstehe ich es schon besser.

              Wenn bei dir die Situation eine andere ist, beispielsweise nach einem mysql_select_db() oder mysql_query(), dann wirst du vielleicht dessen Rückgabewert an mysql_error() verfüttert haben, was ganz falsch wäre.

              Nein, ich connecte und wähle die db so:

              $db=mysql_connect($dbserver,$dbuser,$dbpasswd);
              mysql_select_db($dbname,$db);

              und ich habe tatsächlich einie Male

              mysql_error($db)

              verbaut.

              Trotzdem weiß ich nicht, wie und wo ich nun den für den Folgefehler zuständigen Nicht-connect finden soll.?.

              Grüße, Peter

              1. Hallo,

                Trotzdem weiß ich nicht, wie und wo ich nun den für den Folgefehler zuständigen Nicht-connect finden soll.?.

                Ändere doch mal
                mysql_error($db)

                in
                mysql_error()

                und schau dir an, was MySQL zu melden hat.

                Gruß
                Alex

              2. Hi!

                Nein, ich connecte und wähle die db so:

                $db=mysql_connect($dbserver,$dbuser,$dbpasswd);
                mysql_select_db($dbname,$db);

                Das heißt also, du versuchst zu verbinden, interessierst dich aber nicht dafür, ob es geklappt hat oder nicht.

                und ich habe tatsächlich einie Male
                mysql_error($db)
                verbaut.

                Und nun steht in $db keine Ressourcenkennung sondern ein false drin. Kein Wunder, dass mysql_error() das nicht mag. Als erste Maßnahme wäre das $db aus dem mysql_error() zu entfernen, dann kann zumindest mysql_error() statt sich über falsche Parameter aufzuregen was zur eigentlichen Ursache sagen.

                Und dann wäre ein Umbau des gesamten Script notwendig, so dass Fehlerzustände erkannt werden können und nicht einfach weitergemacht wäre, als ob immer die Sonne schiene.

                if ($db = mysql_connect(...)) {
                  Mach_das_was_mit_der_Verbindung_gemacht_werden_soll();
                } else {
                  Alternativprogramm_im_Fehlerfall();
                }

                Auch mysql_select_db() und mysql_query können auf diese Weise Fehler melden. Auch hier muss also wieder vor Folgeaktionen entschieden werden, ob der Gut-Fall oder der Fehler-Fall vorliegt.

                Lo!

  2. ich habe wirklich keinen Plan, wo ich und wie ich den Fehler suchen muss.

    mysql_error() sagt was?

    1. Hi!

      ich habe wirklich keinen Plan, wo ich und wie ich den Fehler suchen muss.
      mysql_error() sagt was?

      Nichts, weil es anscheinend falsch aufgerufen wurde (mit ungültiger Ressourcenkennung). Stattdessen wird ja die PHP-Warnung ausgegeben.

      Lo!

  3. Warning: mysql_error(): supplied argument is not a valid MySQL-Link resource in

    Code-Ausschnitt?
    Wie lautet die Zeile, bei der die Fehlermeldung kommt?
    Was willst Du an der Stelle liefern und was lieferst Du tatsächlich?

    Vielleicht steht irgendwo ein ein if mit einem einzigen "=" mit dem Du das Argument, welches ein2 "valid MySQL-Link resource" ist mit etwas überschreibst, statt vergleichst?!

    1. Wie lautet die Zeile, bei der die Fehlermeldung kommt?

      select nachname from user where User = "Peter"

      Was willst Du an der Stelle liefern und was lieferst Du tatsächlich?

      Nachname/Nachname

      Vielleicht steht irgendwo ein ein if mit einem einzigen "=" mit dem Du das Argument, welches ein2 "valid MySQL-Link resource" ist mit etwas überschreibst, statt vergleichst?!

      Die Funktion wird dutzende male aufgerufen und läuft klaglos. Nur in einigen seltenen Fällen halt nicht :-(

      1. Wie lautet die Zeile, bei der die Fehlermeldung kommt?

        select nachname from user where User = "Peter"

        Das ist 1. keine Zeile und 2. steht das nicht in der Zeile, die die Fehlermeldung hervorbringt.

        Was willst Du an der Stelle liefern und was lieferst Du tatsächlich?

        Nachname/Nachname

        Wenn Du etwas was eine "valid MySQL-Link resource" erwartet mit einem Nachnamen fütterst, dann kann das nichts werden. Ist jetzt klar, was ich von Dir wissen will?

        Vielleicht steht irgendwo ein ein if mit einem einzigen "=" mit dem Du das Argument, welches ein2 "valid MySQL-Link resource" ist mit etwas überschreibst, statt vergleichst?!

        Die Funktion wird dutzende male aufgerufen und läuft klaglos. Nur in einigen seltenen Fällen halt nicht :-(

        Na und? Möglicherweise wird die Stelle nur selten wirksamm. Das bleibt natürlich Spekulation, solange wir den Code nicht kennen.

  4. Moin!

    Aber ab und an verliere ich anscheinend die db-Verbindung, denn ich erhalte folgenden Fehler:

    Kann es sein, dass dies immer innerhalb von Funktionen stattfindet? Dann ist Deine Verbindungskennung eventuell nicht global verfügbar(1) - oder Du hast diese infolge eines Typos überschrieben.(2). Es gibt weitere Fehlermöglichkeiten.

    $DB sei Deine Verbindungskennung:

    (1) Du kannst das Prüfen und ggf. die Verbindung aufbauen:

      
    if ( false  
        || false===isset($DB)  
        || false===$DB  
    ) {  
       $GLOBALS['DB']=myDbConnect();  
    }  
    
    

    ... Irgendwo ...

      
    function myDbConnect () {  
       $ar=$parse_ini($_SERVER['DOCUMENT_ROOT'].'/data/.ht_zugangsdaten'); // oder wo auch immer.  
       $DB=mysql_pconnect($ar['server'], $ar['user', $ar['pass'])  
          or die ("Fatal: Verbindung zum Datenbankserver konnte nicht aufgebaut werden. Exit.");  
       $sql='use `'.($ar['database'].'`';  
       $result=mysql_query($sql) or die ("Fatal: Die Datenbank konnte nicht gewählt werden. Exit");  
      
    }  
    
    

    (2)
    Wenn Du

    <?php
    $DB='angenommene Datenbankkennung';
    $test="DB";
    $$test='Datenbankkennung überschrieben';
    echo $DB;
    ?>

    ausführst, dann weist Du, was ich meine.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Moin!

        
      
      > function myDbConnect () {  
      >    $ar=$parse_ini($_SERVER['DOCUMENT_ROOT'].'/data/.ht_zugangsdaten'); // oder wo auch immer.  
      >    $GLOBALs['DB']=mysql_pconnect($ar['server'], $ar['user', $ar['pass'])  
      >       or die ("Fatal: Verbindung zum Datenbankserver konnte nicht aufgebaut werden. Exit.");  
      >    $sql='use `'.($ar['database'].'`';  
      >    $result=mysql_query($sql) or die ("Fatal: Die Datenbank konnte nicht gewählt werden. Exit");  
      
           return $GLOBALs['DB']; // So wie ich notierte wird ja ein Rückgabewert erwartet....  
      
      > }  
      
      

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

    2. Hi!

      Kann es sein, dass dies immer innerhalb von Funktionen stattfindet? Dann ist Deine Verbindungskennung eventuell nicht global verfügbar(1) - oder Du hast diese infolge eines Typos überschrieben.(2). Es gibt weitere Fehlermöglichkeiten.

      Obwohl er kaum Code gezeigt hat, halte ich das für nicht besonders wahrscheinlich, denn dann müsste er zuerst ein mysql_error($db) aufrufen und anschließend erst eine der arbeitenden Funktionen (mysql_query() etc.). Ansonsten wär die Fehlermeldung ja schon bei mysql_query() etc. gekommen. Oder aber er hat da keine Verbindungskennung übergeben, bei einem anschließenden mysql_error() aber doch, was doch recht eigenartig wäre.

      Lo!