Übergabe der Variablen funktioniert nicht
Olli
- php
0 Christian Seiler0 Olli0 Christian Seiler0 Olli0 Christian Seiler0 Olli0 Christian Seiler0 Olli
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
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
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
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
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
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
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
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
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