Heinz: not a valid MySQL result resource ?

Hallo!

Habe bei meiner MySQL-Abfrage ein wenig herumprobiert und eine Lösung für mein Sortierpröblem von heute Nachmittag (Sortieren) gefunden. Hier der Code:

<?
$sql="SELECT Pos,Fname,Lname,Team,PPG,RPG,APG,SPG,BPG FROM $tabelle ORDER BY $sort";
$result=mysql_query($sql,$db);

echo "<table BORDER="0" CELLPADDING="2" CELLSPACING="0" WIDTH="100%">
           <tr class="tab1">
        <td><A HREF="index.html?sort=pos%20ASC">Pos</A></td>
        <td><A HREF="index.html?sort=lname,fname%20ASC">Name</A></td>
        <td><A HREF="index.html?sort=team%20ASC">Team</A></td>
        <td ALIGN="right"><A HREF="index.html?sort=ppg%20DESC">PPG</A></td>
        <td ALIGN="right"><A HREF="index.html?sort=rpg%20DESC">RPG</A></td>
        <td ALIGN="right"><A HREF="index.html?sort=apg%20DESC">APG</A></td>
        <td ALIGN="right"><A HREF="index.html?sort=spg%20DESC">SPG</A></td>
        <td ALIGN="right"><A HREF="index.html?sort=bpg%20DESC">BPG</A></td>
       </tr>";

$alternate = "2";
while ($row = mysql_fetch_array($result)) {
$pos = $row["Pos"];
$fname = $row["Fname"];
$lname = $row["Lname"];
$team = $row["Team"];
$ppg = $row["PPG"];
$rpg = $row["RPG"];
$apg = $row["APG"];
$spg = $row["SPG"];
$bpg = $row["BPG"];

if ($alternate == "1") {
$color = "#494949";
$alternate = "2";
}
else {
$color = "#000000";
$alternate = "1";
}

echo "<tr bgcolor="$color" class="tab2">
        <td>$pos</td>
        <td>$fname $lname</td>
        <td>$team</td>
        <td ALIGN="right">$ppg</td>
        <td ALIGN="right">$rpg</td>
        <td ALIGN="right">$apg</td>
        <td ALIGN="right">$spg</td>
        <td ALIGN="right">$bpg</td>
      </tr>";
}

echo "</table>";

?>

Funktioniert sehr gut. Ich kann jetzt per Mausklick nach bestimmten Spalten sortieren. Folgender Link kommt zur Anwendung: <a href="index.html?sort=pos%20ASC">Pos</a>

So weit so gut. Nun mein Problem:
Rufe ich nur index.html auf (es könnte ja sein, dass die Seite so augerufen wird), bekomme ich folgende Fehlermeldung:
Warning: Supplied Argument is not a valid MySQL result resource in index.html on line 62 (das ist der Teil mit while ...).

Wo liegt der Fehler?

Besten Dank
Heinz

  1. Huhu Heinz

    <?
    $sql="SELECT Pos,Fname,Lname,Team,PPG,RPG,APG,SPG,BPG FROM $tabelle ORDER BY $sort";
    $result=mysql_query($sql,$db);

    Wo liegt der Fehler?

    Wenn Du die Seite ohne Parameter "sort" aufrufst ist Dein sql-Statement unvollständig und die Query liefert daher false zurück.

    Viele Grüße

    lulu

    1. Hallo lulu!

      Wenn Du die Seite ohne Parameter "sort" aufrufst ist Dein sql-Statement unvollständig und die Query liefert daher false zurück.

      Kann man das irgendwie umgehen? Möchte nicht, dass wenn jemand die Seite nur mit index.html aufruft die Fehlermeldung kommt.

      LG
      Heinz

      1. Holla Heinz

        Kann man das irgendwie umgehen?

        bien sür, natürlemeng (isch übe gerade für die frohzösiche Forüm)

        z.B.:

        $sql="SELECT Pos,Fname,Lname,Team,PPG,RPG,APG,SPG,BPG FROM $tabelle";
        if($sort){
         $sql.=" ORDER BY $sort";
        }
        $result=mysql_query($sql,$db);

        es ist aber in jedem Fall eine gute Idee zu prüfen ob der Query erfolgreich war.

        Also z.B.

        if(!$result){
         echo "Fehler und tschüss";
         exit;
        }

        oder so

        $result=mysql_query($sql,$db) or die('Hat leider nicht geklappt');

        Viele Grüße

        lulu

        1. ___$$$$_$$$$____$$$$____________///____
          ____$$___$$______$$___________( @@ )___
          ____$$$$$$$______$$_________ooO-(_)-Ooo_
          ____$$___$$______$$_____________________
          ___$$$$_$$$$____$$$$___tom@bitworks.de__

          Holla Heinz,

          Ich denke, ich habe nun auch eine Lösung gefunden. Dann können wir die beiden ja zusammenführen und es wird ganz komfortabel...

          Was machst Du denn in Deiner Lösung, wenn es sehr viele Datensätze werden?

          Außerdem ist es Benutzerfreundlicher, wenn der erste Datensatz der Liste stehenbelibt, wenn man umsortiert. Das heißt, wenn Namensfeld oben "Rosenzweig" steht, die Liste aber nach Nummer sortiert ist, dann sollte nach dem Klicken auf die Namensspalte dort alle Namen ab Rosenzwei stehen. Wenn Du mal Datentypisten bei der Arbeit beobachtet hast, weißt Du, wie die über billige Access-Programme fluchen.

          Die Alternative wäre ja, nur das resultset umzusortieren. Dazu müßte man es aber erst wieder neu beschaffen, oder am Client sortieren.

          Na jedenfalls erst einmal herzlichen Glückwunsch zum Etappensieg.

          Liebe Grüße

          Tom

          1. Hola Tom,

            Was machst Du denn in Deiner Lösung, wenn es sehr viele Datensätze werden?

            Genau dieses Problem habe ich bis jetzt noch nicht gelöst. Ich habe mich heute aber ein wenig im Internet umgesehen und eine guten Beitrag zum Thema Sortieren in einem anderen Forum gefunden:
            http://forum.sachen-fuer-webmaster.de/thread.php?threadid=230&boardid=7
            Bin nur mal schnell so drübergeflogen, sieht aber nicht schlecht aus.

            LG
            Heinz

  2. Hallo,

    Funktioniert sehr gut. Ich kann jetzt per Mausklick nach bestimmten Spalten sortieren. Folgender Link kommt zur Anwendung: <a href="index.html?sort=pos%20ASC">Pos</a>

    So weit so gut. Nun mein Problem:
    Rufe ich nur index.html auf (es könnte ja sein, dass die Seite so augerufen wird), bekomme ich folgende Fehlermeldung:
    Warning: Supplied Argument is not a valid MySQL result resource in index.html on line 62 (das ist der Teil mit while ...).

    Wo liegt der Fehler?

    Validierung der Eingaben. Dein Code ist zusätzlich noch die reinste Sicherheitslücke (nicht böse gemeint, ist halt so)

    $sql="SELECT Pos,Fname,Lname,Team,PPG,RPG,APG,SPG,BPG FROM $tabelle ORDER BY $sort";

    Wenn $sort einfach leer ist (da nicht gesetzt), dann steht da am Ende der Select-Anweisung ".. ORDER BY " und da ist sie dann schon vorbei. Das gibt einen Mysql-Syntaxfehler (direkt nach der mysql_query-Zeile ein echo mysql_error(); einfügen und dann siehst Du das)

    Du hast 2 Möglichkeiten:

    1. QUICK&DIRTY-Lösung:

    am Anfang des Scripts:

    if (!isset($sort)) $sort = "standard_spalte";

    2. Wirkliche Lösung:

    1. register_globals in der php.ini auf Off stellen.

    2. Alle übergebenen Parameter (da sie jetzt nicht mehr global registriert werden) über $_GET und $_POST (bzw. $HTTP_GET_VARS und $HTTP_POST_VARS bei PHP < 4.1) - siehe http://www.php.net/manual/en/reserved.variables.php

    3. Alle Eingaben validieren. (also sehen, ob sie plausibel sind) Dazu sind regexps ganz geeignet: http://www.php.net/manual/en/ref.regex.php, http://www.php.net/manual/en/ref.pcre.php

    4. Falls eine Eingabe leer ist, dann soll ein Default-Wert zugewiesen werden:

    if (!isset($_GET["variable"])) {
      $wert_zu_verwenden = _default_wert_;
    } else {
      if (ist_valide($_GET["variable"])) {
        $wert_zu_verwenden = $_GET["variable"];
      } else {
        spucke_fehler_aus;
        $wert_zu_verwenden = _default_wert_;
      }
    }

    5. Auf jeden Fall das SQL-Statement noch mal mit addslashes absichern, man weiß ja nie:

    $sql = "SELECT .... FROM " . addslashes ($tabelle) . " ORDER BY " . addslashes ($sort);

    Zu Sicherheit und PHP siehe auch noch http://www.php.net/manual/en/security.php

    Grüße,

    Christian

    1. Hallo,

      Danke schon mal für die Infos.

      Wenn $sort einfach leer ist (da nicht gesetzt), dann steht da am Ende der Select-Anweisung ".. ORDER BY " und da ist sie dann schon vorbei. Das gibt einen Mysql-Syntaxfehler (direkt nach der mysql_query-Zeile ein echo mysql_error(); einfügen und dann siehst Du das)

      Ok, das funkt.

      Du hast 2 Möglichkeiten:

      1. QUICK&DIRTY-Lösung:

      am Anfang des Scripts:

      if (!isset($sort)) $sort = "standard_spalte";

      Das hat auch funktioniert.

      1. Wirkliche Lösung:
      1. register_globals in der php.ini auf Off stellen.

      Tja, das kann ich leider nicht, da ich keinen Zugriff auf die php.ini bei meinem Provider habe.

      1. Alle übergebenen Parameter (da sie jetzt nicht mehr global registriert werden) über $_GET und $_POST (bzw. $HTTP_GET_VARS und $HTTP_POST_VARS bei PHP < 4.1) - siehe http://www.php.net/manual/en/reserved.variables.php
      1. Alle Eingaben validieren. (also sehen, ob sie plausibel sind) Dazu sind regexps ganz geeignet: http://www.php.net/manual/en/ref.regex.php, http://www.php.net/manual/en/ref.pcre.php
      1. Falls eine Eingabe leer ist, dann soll ein Default-Wert zugewiesen werden:

      if (!isset($_GET["variable"])) {
        $wert_zu_verwenden = _default_wert_;
      } else {
        if (ist_valide($_GET["variable"])) {
          $wert_zu_verwenden = $_GET["variable"];
        } else {
          spucke_fehler_aus;
          $wert_zu_verwenden = _default_wert_;
        }
      }

      1. Auf jeden Fall das SQL-Statement noch mal mit addslashes absichern, man weiß ja nie:

      $sql = "SELECT .... FROM " . addslashes ($tabelle) . " ORDER BY " . addslashes ($sort);

      Hier kommt nun eine schöne Fehlermeldung: You have an error in your SQL syntax near 'FROM ....' at line 1

      Zu Sicherheit und PHP siehe auch noch http://www.php.net/manual/en/security.php

      Grüße,

      Christian

      Danke jedenfalls für deine Mühe.

      LG
      Heinz

      1. Hallo,

        1. register_globals in der php.ini auf Off stellen.

        Tja, das kann ich leider nicht, da ich keinen Zugriff auf die php.ini bei meinem Provider habe.

        Mit .htaccess kannst Du das auch setzen:

        <IfModule mod_php4.c>
          php_flag register_globals off
        </IfModule>

        (Sofern dein Provider .htaccess unterstützt)

        Siehe: http://www.php.net/manual/en/configuration.php

        $sql = "SELECT .... FROM " . addslashes ($tabelle) . " ORDER BY " . addslashes ($sort);

        Hier kommt nun eine schöne Fehlermeldung: You have an error in your SQL syntax near 'FROM ....' at line 1

        Du musst ja natürlich die ..... vor dem FROM ersetzen.

        Danke jedenfalls für deine Mühe.

        Bitte.

        Grüße,

        Christian

        1. Moin auch!

          $sql = "SELECT .... FROM " . addslashes ($tabelle) . " ORDER BY " . addslashes ($sort);

          Hier kommt nun eine schöne Fehlermeldung: You have an error in your SQL syntax near 'FROM ....' at line 1

          Du musst ja natürlich die ..... vor dem FROM ersetzen.

          Nicht wirklich. Addslashes() ist unnötig, wenn magic_quotes benutzt wird. Meist ist das der Fall. Es ist daher eine gute Idee, den Status dieser Option zu prüfen, bevor man irgendwelche zusätzlichen Slashes einfügt - weil man sonst die Probleme hinterher kriegt.

          Wie man das macht, steht irgendwo auf php.net in der Befehlsdoku - ich bin gerade zu faul zum Suchen.

          - Sven Rautenberg

  3. Hallo,

    $sql="SELECT Pos,Fname,Lname,Team,PPG,RPG,APG,SPG,BPG FROM $tabelle ORDER BY $sort";
    $result=mysql_query($sql,$db);

    Rufe ich nur index.html auf (es könnte ja sein, dass die Seite so augerufen wird), bekomme ich folgende Fehlermeldung:
    Warning: Supplied Argument is not a valid MySQL result resource in index.html on line 62 (das ist der Teil mit while ...).

    Wo liegt der Fehler?

    In der nicht vorhandenen Fehlerbehandlung.
    Wenn $sort nicht oder falsch gesetzt wurde, dann wird ein fehlerhaftes SQL-Statement ausgeführt, was wiederum dazu führt, daß $result nicht den erwartete Inhalt hat (wahrscheinlich so etwas wie undef, ich kenn PHP nicht). Dadurch fliegst Du beim Abfragen der Datensätze auf die Nase.

    Mein Vorschlag: überprüfe den Inhalt des Parameters 'sort' peinlich genau, bevor du das Statement erzeugst. Eventuell befüllst Du $sort mit einem Vorgabewert, falls der Parameter nicht übergeben wurde.

    Außerdem solltest Du nur von Dir definierte Werte erleauben, da die ungeprüfte Übernahme solcher Parameter durchaus zu einem Sicherheitsloch werden können.

    Unbedingt solltest Du jedoich überprüfen, ob mysql_query erfolgreich war.

    Grüße
      Klaus