Knud Schröder: (MySQL)

Hallo,

ich hab das Problem, dass diese Abfrage nicht zu funktionieren scheint.
Ich hab keinen blassen Schimmer warum:

$abfrage = "select * from inv_pc AND kategorie = 'S'";
$erg = mysql_db_query($dbname,$abfrage,$verbindung);
$anz = mysql_num_rows($erg);
while($row = mysql_fetch_array($erg)) {
 extract($row);
}

Ich kann sicherstellen, dass Sätze gefunden werden, da $anz den Wert 37 erhält (= 37 Sätze gefunden) und die Eingabe der Abfrage in der SQL-Box vom phpmyadmin zeigt mir auch die 37 Sätze an.

Trotzdem erhalte ich beim obigen Script-Teil die Fehlermeldung,
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...
Also in der While-Zeile.

Ich hab schon hunderte dieser Abfragen formuliert aber hier sehe ich das Problem echt nicht.

Wie kann ich das Problem denn noch eingrezen?

  1. Hi,

    ich hab das Problem, dass diese Abfrage nicht zu funktionieren scheint.
    Ich hab keinen blassen Schimmer warum:

    weil die Syntax nicht stimmt.

    $abfrage = "select * from inv_pc AND kategorie = 'S'";

    AND-Verknüpfungen gibt es nur innerhalb einer WHERE-Clause, und sie verknüpfen zwei Bedingungen, während Du hier nur eine hast, jedoch keine WHERE-Clause.

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

    Lies diese Meldung als "Error: Die zuvor gestartete SQL-Anfrage konnte vom DBMS nicht ausgewertet werden."

    Ich hab schon hunderte dieser Abfragen formuliert aber hier sehe ich das Problem echt nicht.
    Wie kann ich das Problem denn noch eingrezen?

    Fälle ein paar Bäume Deines Waldes ;-)

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hi Knud

    ich hab das Problem, dass diese Abfrage nicht zu funktionieren scheint.
    Ich hab keinen blassen Schimmer warum:

    $abfrage = "select * from inv_pc AND kategorie = 'S'";

    Lies dir den Basisaufbau von Queries durch:
    http://www.mysql.com/doc/en/Retrieving_data.html. Ein AND gehört da garantiert nicht hin sondern ein WHERE.

    $erg = mysql_db_query($dbname,$abfrage,$verbindung);
    $anz = mysql_num_rows($erg);
    while($row = mysql_fetch_array($erg)) {
     extract($row);
    }
    Trotzdem erhalte ich beim obigen Script-Teil die Fehlermeldung,
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

    Basismassnahmen: Prüfe ob mysql_db_query überhaupt erfolgreich war oder nicht und schau dir die Fehlermeldungen an. Hier hast du garantiert mindestens eine.

    Gruss Daniela

    P.S. Ein passender Titel wäre kein Luxus

    1. $abfrage = "select * from inv_pc AND kategorie = 'S'";

      Sorry, natürlich gehört hier ein Where rein. Also:
      $abfrage = "select * from inv_pc where kategorie = 'S'";

      Bei den ganzen Versuchen, die ich schon unternommen hatte, hat sich sogar ein echter dummer Fehler eingeschlichen, den ich natürlich prompt auch nocht hier gepostet habe. *schäm*

      P.S. Ein passender Titel wäre kein Luxus

      Stimme Dir zu, war ein wenig schnell *doppeltschäm*

      Inzwischen hab ich die gleiche Abfrage in ein anderes Script reinkopiert und dort funktioniert es.
      Es muss also irgendwas an der Datei selber sein, was dir Abfrage auf einen Fehler laufen lässt.
      Aber warum kann ich mir die Anzahl der gefundenen Sätze anzeigen lassen, aber die Sätze nicht mit dem fetch_array ziehen?

      Hier mal das ganze Script (ist nicht wirklich lang):
      (über config.php hole ich mir Standard-Variablen wie login und passwort, pfadhtml, ... Das sind Standard-Geschichten, die bei _allen_ Scripten von mir zuerst geladen werden.)

      <? require('/grab_globals.lib.php'); ?>
      <html>
      <head>
      <?
      include "/config.php";

      echo "<link rel=stylesheet type="text/css" href="$pfadhtml/styles/styles.css">";
      ?>
      </head>
      <body>
      <br><br>

      <?

      $count = 1;

      $verbindung = @mysql_connect($server,$login,$pass);
      if (!$verbindung) {
       echo "Keine Verbindung möglich!\n";
       exit;
      }

      echo "<table border=0 align=center>";
      $fehler = 0;

      $abfrage = "select * from inv_pc where kategorie = 'S'";
      $erg = mysql_db_query($dbname,$abfrage,$verbindung);
      while($row = mysql_fetch_array($erg)) {
       extract($row);
       $online = ping -n $count $ipadresse;  // schicke PING an IP-Adresse
       if (eregi("berschreitung", $online)) {  // Server antwortet nicht auf Ping-Kommando
        $fehler++;
        $datum = ("d.m.Y H:i:s");
        // Fehler im Protokoll speichern und Server anzeigen
        $abfrage1 = "insert into serverstat (jkserver, ipadresse, ausfall) values ('$mitarbeiter','$ipadresse','$datum')";
        $erg1 = mysql_db_query($dbname,$abfrage1,$verbindung);
        echo "<tr>";
        echo "<td><h3>$ipadresse</h3></td>";
        echo "<td><h3>$mitarbeiter</h3></td>";
        echo "<td><h3>$typ</h3></td>";
        echo "</tr>";
       } else {
        $abfrage = "update serverstat set verfuegbar = '$datum' where ipadresse = '$ipadresse' AND verfuegbar = ''";
        $erg = mysql_db_query($dbname,$abfrage,$verbindung);
       }
      }
      if ($fehler == 0) {
       $datum = ("d.m.Y H:i:s");
       $abfrage = "update serverstat set verfuegbar = '$datum' where verfuegbar = ''";
       $erg = mysql_db_query($dbname,$abfrage,$verbindung);

      $abfrage = "show table status from jk like 'telefon';";
       $erg = mysql_db_query($dbname,$abfrage,$verbindung);
       $row = mysql_fetch_array($erg);
       extract($row);
       $jahr = substr($Update_time,0,4);
       $monat = substr($Update_time,5,2);
       $tag = substr($Update_time,8,2);
       $letzterausfall = "$tag.$monat.$jahr";

      echo "<tr><td>Zur Zeit alle Server verfügbar</td></tr>";
       echo "<tr><td>letzter Ausfall am ... $letzterausfall</td></tr>";
      }

      $abfrage = "select count(*) as serveranz from inv_pc where kategorie = 'S'";
      $erg = mysql_db_query($dbname,$abfrage,$verbindung);
      $row = mysql_fetch_array($erg);
      extract($row);

      $abfrage = "select count(*) as ausfaelle from serverstat";
      $erg = mysql_db_query($dbname,$abfrage,$verbindung);
      $row = mysql_fetch_array($erg);
      extract($row);

      echo "<tr><td><br><br><hr>Bisher werden $serveranz Server überwacht und es wurden $ausfaelle Ausfälle protokolliert.</td></tr>";

      echo "</table>";

      ?>
      </body>
      </html>

  3. Hi!

    Also erstens würde ich empfehlen einen Database Abstraction Layer wie z.B. PEAR::DB zu benutzen und nicht direkt MySQL anzusprechen.

    Um den Fehler einzugrenzen kannst du mal ein paar Debug-Ausgaben machen. Die Verbindung zur DB scheint ja zu klappen also liegt der Fehler wahrscheinlich bei der Abfrage. Dazu würde ich die Ergebnisvariable mal genauer untersuchen, z.B. mit:

    var_dump( $erg );

    Mit freundlichen Grüßen,
    Michael Nagler

    1. Hi,

      Also erstens würde ich empfehlen einen Database Abstraction Layer wie z.B. PEAR::DB zu benutzen und nicht direkt MySQL anzusprechen.

      sagt mir jetzt erstmal nichts :(

      Um den Fehler einzugrenzen kannst du mal ein paar Debug-Ausgaben machen. Die Verbindung zur DB scheint ja zu klappen also liegt der Fehler wahrscheinlich bei der Abfrage. Dazu würde ich die Ergebnisvariable mal genauer untersuchen, z.B. mit:

      var_dump( $erg );

      klingt gut, hab ich direkt mal eingefügt und erhalte:
      resource(4) of type (mysql result)

      Wie gesagt, ich bin mir sicher, dass die Abfrage soweit funktioniert, denn ich bekomme ja bei $anz den Wert 37 zurück.
      Ich hab auch schon probiert, nur ganz bestimmte Felder zu ziehen also nicht mit * alle.

      Dummerweise funktioniert die Abfrage in einem anderen Script tadellos.

      1. Hi,

        Also erstens würde ich empfehlen einen Database Abstraction Layer wie z.B. PEAR::DB zu benutzen und nicht direkt MySQL anzusprechen.

        sagt mir jetzt erstmal nichts :(

        Ok. Egal. ;)

        Um den Fehler einzugrenzen kannst du mal ein paar Debug-Ausgaben machen. Die Verbindung zur DB scheint ja zu klappen also liegt der Fehler wahrscheinlich bei der Abfrage. Dazu würde ich die Ergebnisvariable mal genauer untersuchen, z.B. mit:

        var_dump( $erg );

        klingt gut, hab ich direkt mal eingefügt und erhalte:
        resource(4) of type (mysql result)

        Damit wär schonmal klar, daß es ein mysql result ist, den das Query liefert.

        Da ich nicht weiss, was extract() macht, probier mal folgendes:

        $abfrage = "select * from inv_pc WHERE kategorie = 'S'";
        $erg = mysql_db_query($dbname,$abfrage,$verbindung);
        $anz = mysql_num_rows($erg);
        while($row = mysql_fetch_array($erg,MYSQL_ASSOC)) {
          var_dump( $row );
        }

        Gruß, Michael

        1. Da ich nicht weiss, was extract() macht, probier mal folgendes:

          Extract() ist ne witzige Funktion, die aus allen Ergebnissen Variablen macht.  Nachher stehen also die Werte in Variablen, die dem Namen des Tabellenfeldes entsprechen.

          Ich hab noch was witziges gemacht:
          $abfrage = "select * from inv_pc WHERE kategorie = 'S'";
          $erg = mysql_db_query($dbname,$abfrage,$verbindung);
          $row = mysql_fetch_array($erg);
          extract($row);
          echo "$ipadresse, $mitarbeiter, $typ";

          Und da gibt es sogar ein Ergebnis! Das funktioniert also.

          Dann hab ich Deins mal ausprobiert:

          while($row = mysql_fetch_array($erg,MYSQL_ASSOC)) {
            var_dump( $row );
          }

          und da gabs auch wieder ein Ergebnis (alle 37 Ergbisse wurden angezeigt in Feldname, Typ, Größe und Inhalt)

          Ich weiß zwar nicht, was das MYSQL_ASSOC wieder bedeutet, aber auch ohne bekomme ich ein solches Ergebnis. (Nur das Array sieht etwas anders aus)

          1. Da ich nicht weiss, was extract() macht, probier mal folgendes:

            Extract() ist ne witzige Funktion, die aus allen Ergebnissen Variablen macht.  Nachher stehen also die Werte in Variablen, die dem Namen des Tabellenfeldes entsprechen.

            Wenn das heisst, die macht aus dem array("ip"=>"127.0.0.1", "mitarbeiter"=>"meier") soviel wie $ip = "127.0.0.1" und $mitarbeiter = "meier"), dann brauchst du MYSQL_ASSOC in deiner Routine:

            $abfrage = "select * from inv_pc WHERE kategorie = 'S'";
            $erg = mysql_db_query($dbname,$abfrage,$verbindung);
            while( $row = mysql_fetch_array($erg,MYSQL_ASSOC))
            {
              extract($row);
              echo "$ipadresse, $mitarbeiter, $typ";
            }

            Ich weiß zwar nicht, was das MYSQL_ASSOC wieder bedeutet, aber auch ohne bekomme ich ein solches Ergebnis. (Nur das Array sieht etwas anders aus)

            MYSQL_ASSOC legt fest, dass die Ergebniszeile in ein assoziatives Array gespeichert wird. Wenn du das weglässt, erhälst du ein nummeriertes Array mit den Werten, also: array("1"=>"127.0.0.1","2"=>"mitarbeiter"); in dem Fall könntest du nach extract($row) mit $1 die ipadresse und $2 den mitarbeiter bekommen...

            Mit freundlichen Grüßen,
            Michael Nagler

            1. MYSQL_ASSOC legt fest, dass die Ergebniszeile in ein assoziatives Array gespeichert wird. Wenn du das weglässt, erhälst du ein nummeriertes Array mit den Werten, also: array("1"=>"127.0.0.1","2"=>"mitarbeiter"); in dem Fall könntest du nach extract($row) mit $1 die ipadresse und $2 den mitarbeiter bekommen...

              Da ich bisher alle meine Abfragen immer ohne ausgelesen habe und das extract wunderbar funktioniert (ich erhalte tatsächlich $ipadresse='127.0.0.1', ...), ... http://de.php.net/function.extract

              Ich hab jetzt endlich den Fehler gefunden.
              Das Problem war, das ich innerhalb der Schleife wieder ein $erg erzeugt habe (anstatt ein $erg1 oder sowas zu benutzen).
              Der hat mir dann das ursprüngliche Ergebnis zerhauen.

              Der Fehler hat mich dann furchtbar an der falschen Stelle suchen lassen.

              Danke für Deine Geduld und Deine Hilfe!
              (Gilt für die anderen auch ;-))

  4. Moin!

    ich hab das Problem, dass diese Abfrage nicht zu funktionieren scheint.
    Ich hab keinen blassen Schimmer warum:

    Regel Nummer Eins bei Datenbankabfragen: Die Datenbank abfragen, ob sie nicht vielleicht einen Fehler produziert hat, weil deine Abfrage falsch war.

    mysql_db_query() bzw. auch mysql_query() liefern entweder eine MySQL-Ressource zurück, wenn alles geklappt hat, oder false, wenn die DB einen Fehler meldet.

    Folglich mußt du das Ergebnis von mysql_query() auf false prüfen und den Fehler abfangen, zumindest aber ausgeben.

    In Schnellschreibweise zum Fehlerausgeben:

    $abfrage = "select * from inv_pc AND kategorie = 'S'";

    $erg = mysql_db_query($dbname,$abfrage,$verbindung) or die("Fehler bei der Abfrage: $abfrage. <br>MySQL meldet: ".mysql_error();

    $anz = mysql_num_rows($erg);
    while($row = mysql_fetch_array($erg)) {
     extract($row);
    }

    Ich kann sicherstellen, dass Sätze gefunden werden, da $anz den Wert 37 erhält (= 37 Sätze gefunden) und die Eingabe der Abfrage in der SQL-Box vom phpmyadmin zeigt mir auch die 37 Sätze an.

    Dass du hier einen Fehler eingebaut hast, wurde geklärt (WHERE fehlte). Die Tatsache, dass du trotzdem Daten kriegst, dürfte sich daraus erklären, dass die Variablen unter Umständen noch alte Werte enthielten. Deshalb: Immer den DB-Erfolg prüfen! Ansonsten kann man sich auf nachfolgende Ergebnisse nicht mehr verlassen.

    Trotzdem erhalte ich beim obigen Script-Teil die Fehlermeldung,
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

    Das ist in 99,9% der Fälle ein Zeichen, dass die SQL-Abfrage einen Fehler liefert, weil das query-Ergebnis dann keine Ressource, sondern der booleansche Typ "false" ist.

    - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)