Olli: Übergabe der Variablen funktioniert nicht

Hallo Forumsmitglieder

Ich arbeite gerade an einer Seite, mit der man eine Tabelle (meiner Fussballmannschaft) beliebig sortieren können soll. Durch ein Auswahlfeld sollen die Möglichkeiten ausgewählt werden und dann an eine PHP-Datei gesendet werden, die die MySQL-Abfrage regelt.
In einer Artikel habe ich gelesen, wie man beide Teile (Formular und PHP-Teil) in eine Datei schriebt und dann auswerten kann (Beim ersten Aufruf muss schliesslich der PHP-Teil übersprungen werden). Jedenfalls bekomme ich immer einen Fehler, wenn ich es nach diesem Vorbild versuche zu machen. Es heisst immer, die Variable (der Auswahl) sei nicht definiert. Und ich weiss nun absolut nicht mehr weiter, was ich denn falsch gemacht habe...

Hier mal der vollst. Quelltext:

<html>
<head>
<title>Archiv - Spezialtabellen</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<?php

if ($gesendet) {

$db = mysql_connect();

mysql_select_db("tsv_warthausen",$db);

$query = "select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by '$wahl' desc";

$res = mysql_query($query,$db);
$num = mysql_num_rows($res);

echo "<table border=1>\n";
echo "<tr><td><td>Mannschaft<td>Spiele<td>gew<td>rem<td>ver<td>t_ge<td>t_be<td>diff<td>pkt</tr>\n";

for ($i=0; $i<$num; $i++) {
  $name = mysql_result($res,$i,"name");
  $spiele = mysql_result($res,$i,"spiele");
  $gew = mysql_result($res,$i,"gew");
  $rem = mysql_result($res,$i,"rem");
  $ver = mysql_result($res,$i,"ver");
  $t_ge = mysql_result($res,$i,"t_ge");
  $t_be = mysql_result($res,$i,"t_be");
  $diff = mysql_result($res,$i,"diff");
  $pkt = mysql_result($res,$i,"pkt");

$j = $i + 1;
 echo "<tr><td>$j<td>$name<td>$spiele<td>$gew<td>$rem<td>$ver<td>$t_ge<td>$t_be<td>$diff<td>$pkt</tr>\n";

}

echo "</table>\n";

}
?>

</head>
<body>

<p>Spezialtabellen</p>
<p>Wählen Sie die Sortierreihenfolge:</p>

<form action="spez_tab.php" method="post">
  <p>Art der Reihenfolge:
  <select name="wahl" class="Auswahl" size="1">
    <option value="name">Name</option>
    <option value="gew">Gewonnene Spiele</option>
    <option value="rem">Unentschiedene Spiele</option>
 <option value="ver">Verlorene Spiele</option>
 <option value="t_ge">Geschossene Tore</option>
 <option value="t_be">Bekommene Tore</option>
 <option value="diff">Tordifferenz</option>
 <option value="pkt">Punkte</option>
   </select></p>
  <input type="submit" name="gesendet"><input type="reset">
</form>

</body>
</html>

PS: Die Definition der Tabelle ist nicht richtig, ich weiss. Aber ich habe mir zu Testzwecken nur so eine kleine Tabelle zusammengeschustert, dass ich das Ergebnis sehen kann, ohne soviel Schreibarbeit haben zu müssen. Die Ausarbeitung erfolgt noch, nachdem der PHP-Teil funktioniert.

Gruss OLLI

--
Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
[Albert Einstein]
  1. Hallo,

    Du greifst hier auf die Variable $wahl zu...

    $query = "select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by '$wahl' desc";

    ...von der Du denkst, diese würde von PHP automatisch definiert, wenn ein Formular mit folgendem Element abgeschickt wird...

    <select name="wahl" class="Auswahl" size="1">

    ...was aber bei Dir anscheinend nicht der Fall ist.

    Suche im Archiv nach dem Stichwort register_globals und Du wirst zu Deinem Problem fündig.

    Viele Grüße,
    Christian

    1. Hallo Christian

      Also diese Sache mit den Variablen habe ich dank deiner Hilfe hinbekommen.

      Aber ich habe noch ein kleines Problem:

      $reihe = "desc";
        if ($auswahl == 'name') {$reihe = "asc";}

      $query = "select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by '$auswahl' '$reihe'";

      Bei diesem Aufruf soll nur dann Aufsteigend (asc) sortiert werden, wenn die Auswahl "Name" getroffen wurde. In der Variablen steht immer der richtige Wert, aber es wird grundsätzlich nur Aufsteigend sortiert...

      Ist da ein Fehler irgendwo, weil ich finde das ist richtig...

      Gruss OLLI

      --
      Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.
      Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
      [Albert Einstein]
      1. Hallo Olli,

        Also diese Sache mit den Variablen habe ich dank deiner Hilfe hinbekommen.

        Wie es scheint, hast Du jedoch die suboptimale Lösung gewählt.

        $query = "select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by '$auswahl' '$reihe'";

        Mach hier mal ein

        echo $query;

        Dann siehst Du ja, was er jeweils ausgibt, dann kannst Du das Problem eher isolieren.

        Viele Grüße,
        Christian

        1. Hallo Olli,

          Also diese Sache mit den Variablen habe ich dank deiner Hilfe hinbekommen.

          Wie es scheint, hast Du jedoch die suboptimale Lösung gewählt.

          Soll heissen??? Ich habe die Variablen über $_POST geholt. Das wurde  in einem der Threads als die Beste Möglichkeit genannt.

          $query = "select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by '$auswahl' '$reihe'";

          Mach hier mal ein

          echo $query;

          Ergebnis: select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by 'name' 'asc' / bzw. 'desc' (so wie es gewollt war). Die einfachen Anführungszeichen könnten vielleicht stören, aber er sortiert ja schliesslich nach der jeweils richtigen Spalte ('name', 'pkt', usw.)

          Dann siehst Du ja, was er jeweils ausgibt, dann kannst Du das Problem eher isolieren.

          Viele Grüße,
          Christian

          Gruss OLLI

          --
          Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.
          Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
          [Albert Einstein]
          1. Hallo Olli,

            Soll heissen??? Ich habe die Variablen über $_POST geholt. Das wurde  in einem der Threads als die Beste Möglichkeit genannt.

            Achso. Nachdem die Variablen so direkt drin standen, dachte ich, Du hättest register_globals angeschaltet. Nachdem dem doch nicht so ist, habe ich nichts gesagt. :-)

            Ergebnis: select name, spiele, gew, rem, ver, t_ge, t_be, diff, pkt from tabelle0203 order by 'name' 'asc' / bzw. 'desc' (so wie es gewollt war). Die einfachen Anführungszeichen könnten vielleicht stören, aber er sortiert ja schliesslich nach der jeweils richtigen Spalte ('name', 'pkt', usw.)

            Die Anführungsstriche stören - aber nur bei asc/desc. Bei Spaltennamen akzeptiert mysql das ganze anscheinend, wobei ich da auch nicht unbedingt darauf verlassen würde.

            Viele Grüße,
            Christian

            1. Hallo Olli,

              Die Anführungsstriche stören - aber nur bei asc/desc. Bei Spaltennamen akzeptiert mysql das ganze anscheinend, wobei ich da auch nicht unbedingt darauf verlassen würde.

              Ich habe die Anführungszeichen beim Aufruf weggelassen. Nun funktioniert alles. Du hattest also Recht. Vielen Dank für deine Hilfe.

              Viele Grüße,
              Christian

              Gruss OLLI

              --
              Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.
              Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
              [Albert Einstein]
              1. Hallo Olli,

                Ich habe die Anführungszeichen beim Aufruf weggelassen. Nun funktioniert alles. Du hattest also Recht. Vielen Dank für deine Hilfe.

                Wobei Du jetzt nur noch aufpassen solltest, dass Du den Spaltennamen auch validierst - sonst könnten die Leute direkt SQL-Statements modifizieren. Also am besten einen Array mit gültigen Spaltennamen

                $spalten = array ('a', 'b', ...);

                und dann prüfen, ob die Spalte drinnen ist:

                if (!in_array ($auswahl, $spalten)) {
                  // huch - ungültiger Spaltenname
                  $auswal = 'standardspalte';
                }

                Sonst fängst Du Dir eine Sicherheitslücke ein.

                Viele Grüße,
                Christian

                1. Hallo Olli,

                  Wobei Du jetzt nur noch aufpassen solltest, dass Du den Spaltennamen auch validierst - sonst könnten die Leute direkt SQL-Statements modifizieren. Also am besten einen Array mit gültigen Spaltennamen

                  $spalten = array ('a', 'b', ...);

                  und dann prüfen, ob die Spalte drinnen ist:

                  if (!in_array ($auswahl, $spalten)) {
                    // huch - ungültiger Spaltenname
                    $auswal = 'standardspalte';
                  }

                  Sonst fängst Du Dir eine Sicherheitslücke ein.

                  Alles klar. Werde ich machen. Danke nochmals.

                  Gruss OLLI

                  --
                  Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.
                  Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
                  [Albert Einstein]