[PHP/MySQL] Dynamische Tabelle sortieren

DerUnsympath

Aktives Mitglied
Hallo, liebes Forum.

Ich habe eine Tabelle mit SQL ausgelesen. Diese Tabelle soll nun nach einer bestimmten Spalte sortiert werden können durch zwei Links (auf- / absteigend). Ich muss dazu sagen, dass ich leider ein ziemlicher Learner auf diesem Gebiet bin, also seht mir die Frage bitte nach.
smile.gif

Mein bisheriger Code sieht folgendermaßen aus und ich komme irgendwie nicht weiter:
CODE $sql = "SELECT * FROM wishlist ORDER BY aktdatum DESC";
if(!$res_id = mysql_query($sql))
{
die('Fehler! SQL-Befehl ist falsch');
}

echo "<table border=\"0\" cellspacing=\"2\" cellpadding=\"3\" align=\"left\" width=\"100%\">";
echo "<tr>";
echo "<td style=\"border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#AF1020\" width=\"110\"><SPAN class=\"text\"><b>Name</b></SPAN></td>";
echo "<td style=\"border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#AF1020\"><SPAN class=\"text\"><b>Wunsch</b> <a href=\"wish.php?var=".$sql2."\">«</a> »<SPAN style=\"font-size:10px;\">(Neuere Zuerst)</SPAN></SPAN></td>";
echo "<td style=\"border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#AF1020\"><SPAN class=\"text\"><b>Status</b></SPAN></td>";
echo "</tr>";
while ($test = mysql_fetch_array($res_id))
{
echo '<tr>';
echo '<td width="120" valign="top"><SPAN class="text">» '.$test['name'].'</SPAN></td>';
echo '<td align="justify" valign="top"><SPAN class="text">'.$test['wunsch'].'</SPAN></td>';
echo '<td><SPAN class="text" valign="top"><I>'.$test['bemerkung'].'</I></SPAN></td>';
echo '</tr>';
}
echo "</table><BR><BR><BR>";
Das ist einfach der Code, der eine Tabelle ausgibt, in der die Werte dreier Variablen reingeschrieben werden per while-Schleife.
Nun will ich aber, dass diese Tabelle z.B. nach einer Spalte sortiert werden.

Wie bekomme ich das hin? Ich hab schon einen Ansatz probiert, aber der scheiterte kläglich.
biggrin.gif


Liebe Grüße
 
Hallo,

dies ist im Grunde ganz einfach, die Links müssten via PHP-Ausgabe etwa so aussehen (dies lässt sich natürlich auch noch übertragen auf andere Aufrufsformen außer Links, nur muss halt dort ggf. bei der Übergabe aufgepasst werden, bei Formulateren der Methode 'post' befinden sich Übergabe-Variablen bei PHP z.B. im Array $_POST):

CODE echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';

echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>';




Und der PHP-Code zur Erzeugung der SQL-Anweisung (oder auch SQL-Abfrage genannt) müsste dann in etwa wie folgt aussehen, je nachdem welche Reihenfolge Du beim ersten Aufruf der Seite haben möchtest und als Standard gelten soll.


CODE $sql = 'SELECT * FROM wishlist ORDER BY aktdatum';

if( $_GET['sort'] == 'desc' )
{
  $sql .= ' desc';
} else {
  $sql .= ' asc';
}


Das Ganze kann natürlich auch noch erweitert werden indem man auch noch angeben kann, nach welcher Spalte die Datensätze sortiert werden soll. ;-)



MfG Sascha Ahlers

Links
 
Danke Sascha erstmal bis hierhin!
smile.gif


Allerdings weiß ich nicht so genau, wohin ich den zweiten Codeblock schreiben soll. Ich habe es jetzt so eingefügt:
CODE if(!empty($deinwunsch))
   {
   $deinname = $_POST['deinname'];
   $deinwunsch = $_POST['deinwunsch'];
   $bemerkung = $_POST['bemerkung'];
   // mysql_query("INSERT INTO wishlist SET name='".$deinname."', wunsch='".$deinwunsch."'")
if(!mysql_query("INSERT INTO `wishlist` SET `name`='".$deinname."', `wunsch`='".$deinwunsch."', `bemerkung`='offen', `aktdatum`=NOW() "))
    die('Fehler! SQL-Befehl ist falsch');
   }
   
   $sql = "SELECT * FROM wishlist ORDER BY aktdatum";
   if($res_id = mysql_query($sql))
   {
    if($_POST['sort'] == 'desc')
    {
    $sql .= 'desc';
    } else {
   $sql .= 'asc';
    }
   }
       
   echo "<table border=\"0\" cellspacing=\"2\" cellpadding=\"3\" align=\"left\" width=\"100%\">";
   echo "<tr>";
   echo "<td style=\"border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#AF1020\" width=\"110\"><SPAN class=\"text\"><b>Name</b></SPAN></td>";
   echo "<td style=\"border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#AF1020\"><SPAN class=\"text\"><b>Wunsch</b> <a href='" . $_SERVER['PHP_SELF'] . "?sort=desc'>«</a> <a href='" . $_SERVER['PHP_SELF'] . "?sort=asc'>»</a>(Neuere Zuerst)</SPAN></td>";
   echo "<td style=\"border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:#AF1020\"><SPAN class=\"text\"><b>Status</b></SPAN></td>";
   echo "</tr>";
   while ($test = mysql_fetch_array($res_id))
   {
    echo '<tr>';
    echo '<td width="120" valign="top"><SPAN class="text">» '.$test['name'].'</SPAN></td>';
    echo '<td align="justify" valign="top"><SPAN class="text">'.$test['wunsch'].'</SPAN></td>';
    echo '<td><SPAN class="text" valign="top"><I>'.$test['bemerkung'].'</I></SPAN></td>';
    echo '</tr>';
   }
   echo "</table><BR><BR><BR>";
allerdings tut sich gar nichts beim Klick auf die Links.
sad.gif
Ich denke mal, in der verschachtelten if-Anwesiung liegt der Fehler, da dein Code denk ich mal richtig ist soweit.
wink.gif


Vielleicht noch erwähnenswert, dass ich ein post-Form habe, also method=post , daher if($_POST['sort'] == 'desc') , weiß nicht, ob ich das so einfach umstellen darf.

Liebe Grüße
 
QUOTE [...]
$sql = "SELECT * FROM wishlist ORDER BY aktdatum";
if($res_id = mysql_query($sql))
{
  if($_POST['sort'] == 'desc')
  {
      $sql .= 'desc';
  } else {
      $sql .= 'asc';
  }
}
[...]

Versuch es bitte nochmal mit meinen vorherigen Text, ich habe einige missverständliche Stellen überarbeitet und lese ggf. auch mal die Links, damit es verständlicher ist, was überhaupt passiert. Ach ja und bitte schreibe nicht einfach den Codeblock um, auch wenn es nicht funktioniert haben mag, denn so kann es gar nicht funktionieren, selbst wenn die Variablenen über POST übertragen wurden (was hier nicht der Fall wäre).
MfG Sascha Ahlers
 
Hey,

danke Sascha, hat wunderbar geklappt!
smile.gif

Dein Code war natürlich von Anfang an richtig, nur wusste ich nicht, wie ich ihn einbauen sollte. Also hab ich neben dem geposteten Beispiel noch etwas anderes probiert, allerdings konnte ich daraufhin die Fehlermeldugn nicht interpretieren. Jetzt jedoch schon: Ich hatte ganz einfach meinen anderen Code (der das query übergibt) VOR die Deklaration der var ($sql = 'SELECT * FROM wishlist ORDER BY aktdatum';) geschrieben. Er wollte die var $sql lesen, diese war aber noch nicht deklariert.
rolleyes.gif
unsure.gif


Aber wie gesagt, jetzt funktioniert es wunderbar! Ich weiß zwar noch nicht 100%ig, was alles passiert durch den Code, aber deswegen werd ich mir jetzt mal die Links durchlesen. Man will ja was mitnehmen, was man gelernt hat, hehe.

Also nochmal, vielen Dank!!

:: PROBLEM GELÖST ::

Liebe Grüße
 
Liebes Forum,

ich stehe vor einem ähnlichen Problem, aber wollte deswegen keinen neuen Thread aufmachen, da dieser mein eigentlich Problem beschreibt: Bei mir sortiert er die Ergebnisse nicht, woran liegt es?

CODE <? $db->query("SELECT titel, interpret, alter FROM user ORDER BY alter LIMIT 0,10");
  if($_POST['sort'] == 'desc')
  {
     $sql .= 'desc';
  } else {
     $sql .= 'asc';   ?>
<table border="1" align="center">
 <tr>
 <td align="center">titel
 <? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
 <td align="center">interpret
 <? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
<td align="center">alter
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
   </tr>
<? for ($i;$i<$db->num_rows();$i++) {
$result=$db->get_row();
 echo "<tr class=main>";
 echo "<td align=center>";
   $i += 0;
   echo $i;
 echo "</td>";
 echo "<td>";
echo $result["titel"]."</td>";
 echo "<td align=center>".$result["interpret"]."</td>";
 echo "<td align=center>".$result["alter"]."</td>";
 echo "</tr>";
} ?>
</table>


Liebe Grüße
 
QUOTE (major_tommy @ So 15.08.2010, 22:01)Bei mir sortiert er die Ergebnisse nicht, woran liegt es?

Was heißt 'nicht sortieren'?

Vermutlich ist das Ergebnis schon sortiert - aber die Spalte alter wird eine Textspalte sein, also kommt 100 vor 20 raus.


Also die Spalte alter zu einer Integer-Spalte machen.
 
Mit nicht sortieren meine ich, dass bei einem Klick auf die Schaltfläche Absteigend oder Aufsteigend nichts passiert. Aber ich möchte, dass er jede Spalte, auf die ich klicke entweder über desc oder asc sortiert.

Die Spalte alter ist schon eine Integer-Spalte.

und beim hinzufügen von ORDER BY alter DESC, sortiert er brav, aber durch die Klicks per Maus passiert nichts...
 
QUOTE (major_tommy @ So 15.08.2010, 22:01) Liebes Forum,

ich stehe vor einem ähnlichen Problem, aber wollte deswegen keinen neuen Thread aufmachen, da dieser mein eigentlich Problem beschreibt: Bei mir sortiert er die Ergebnisse nicht, woran liegt es?


CODE <? $db->query("SELECT titel, interpret, alter FROM user ORDER BY alter LIMIT 0,10");
  if($_POST['sort'] == 'desc')
  {
     $sql .= 'desc';
  } else {
     $sql .= 'asc';   ?>
<table border="1" align="center">
 <tr>
 <td align="center">titel
 <? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
 <td align="center">interpret
 <? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
<td align="center">alter
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
   </tr>
<? for ($i;$i<$db->num_rows();$i++) {
$result=$db->get_row();
 echo "<tr class=main>";
 echo "<td align=center>";
   $i += 0;
   echo $i;
 echo "</td>";
 echo "<td>";
echo $result["titel"]."</td>";
 echo "<td align=center>".$result["interpret"]."</td>";
 echo "<td align=center>".$result["alter"]."</td>";
 echo "</tr>";
} ?>
</table>


Liebe Grüße

Du hast die query ja weder in einer variable zur anpassung gespeichert, noch führst du die anpassung nach der queryabsendung durch...

Dieser Teil,

QUOTE <? $db->query("SELECT titel, interpret, alter FROM user ORDER BY alter LIMIT 0,10");
if($_POST['sort'] == 'desc')
{
$sql .= 'desc';
} else {
$sql .= 'asc'; ?>

muß in etwa so umgeschrieben werden:

CODE <?
$sql="SELECT titel, interpret, alter FROM user ORDER BY alter ";
if($_POST['sort'] == 'desc')
{
$sql .= 'desc';
} else {
$sql .= 'asc';
}
$db->query($sql." LIMIT 0,10");
?>
 
Abgesehen von den Hinweisen über diesem Beitrag:

Steckt das alles in einem <form method='post'> - Element drin (bei fehlendem method wird GET genutzt)?

Sonst sind die $_POST-Variablen nicht belegt.
 
CODE <?
$sql="SELECT titel, interpret, alter FROM user ORDER BY alter ";
if($_POST['sort'] == 'desc')
{
$sql .= 'desc';
} else {
$sql .= 'asc';
}
$db->query($sql." LIMIT 0,10");
?>
<table border="1" align="center">
<tr>
<td align="center">titel
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
<td align="center">interpret
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
<td align="center">alter
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
</tr>
<? for ($i;$i<$db->num_rows();$i++) {
$result=$db->get_row();
echo "<tr class=main>";
echo "<td align=center>";
$i += 0;
echo $i;
echo "</td>";
echo "<td>";
echo $result["titel"]."</td>";
echo "<td align=center>".$result["interpret"]."</td>";
echo "<td align=center>".$result["alter"]."</td>";
echo "</tr>";
} ?>
</table>


Habe mich damit jetzt länger herum gespielt, aber leider sortiert er nach dem Mausklick immer noch nicht...

Es steckt in keinem <form method='post'> - Element drin. Wäre dies empfehlenswert?
 
Du übergibst die Variable "sort" im Link.
Das ist dann kein $_POST, sondern ein $_GET.

Also:
CODE
if($_POST['sort'] == 'desc')

muss

if($_GETT['sort'] == 'desc')



Ersetze einfach alle eventuell vorkommenden $_POST durch $_GET
 
Vielen Dank! Hätte gar nicht gedacht, dass es an so einem kleinen Fehler liegen würde...

Hätte noch eine abschließende Frage:

Was muss ich bei CODE ORDER BY alter ";
umändern, dass er alle 3 Spalten per Mausklick entsprechend sortiert?

Oder muss ich hier was ändern?


CODE <tr>
<td align="center">titel
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
<td align="center">interpret
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
<td align="center">alter
<? echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=desc">Absteigend</a>';
echo '<a href="' . $_SERVER['PHP_SELF'] . '?sort=asc">Aufsteigend</a>'; ?> </td>
 </tr>
 
Weiß wirklich keiner Rat, wie ich die 3 Spalten durch Mausklicks sortieren kann?
huh.gif
 
Zurück
Oben