4.3 Serverseitiges Sortier-Script

Der Code des PHP-Scripts user_sort.php, das die eigentliche Tabellensortierung durchführt, lautet wie folgt:

<?php
function     end_with_error($text) {
       $begin =    "<span class=\"errortext\">";
       $end = "</span>";
       echo $begin     . $text . $end;
       exit();
}
 
$dbh = mysql_connect("localhost", "dbuser", "dbpassword");
if(!$dbh) 
   end_with_error("Keine Verbindung zum Datenbank-System!"); 
$sql = "USE cms";
$sql_result = @mysql_query($sql, $dbh);
if(!$sql_result) 
   end_with_error("Keine Verbindung zur Datenbank!"); 
if(! isset($_GET['field']) or 
  ($_GET['field'] != "index_name" and $_GET['field'] != 
  "group_name" and $_GET['field'] != "last_login"))
      $sort_field = "index_name";
else 
   $sort_field = $_GET['field'];
if(! isset($_GET['order']) or ($_GET['order'] != "asc" 
   and $_GET['order'] != "desc"))
      $sort_order = "asc";
else 
   $sort_order = $_GET['order'];
$data = array();
$sql = "SELECT * FROM users ORDER BY " . $sort_field . 
       " " . $sort_order;
$sql_result = @mysql_query($sql, $dbh);
if(!$sql_result) 
   end_with_error("Kein Datenbankergebnis!"); 
else 
   while($record = mysql_fetch_array($sql_result, MYSQL_ASSOC))
      $data[] = $record;
if(empty($data)) 
   end_with_error("Die Tabelle enthält keine Daten!"); 
 
$table_HTML = "<table border=\"1\">\n";
$table_HTML .= "<tr>\n";
$table_HTML .= "<th class=\"tlist\">Name ";
$table_HTML .= "<a href=\"javascript:ajax_user_sort('index_name', 
                'asc', 'user_list')\">&#x25B2;</a> ";
$table_HTML .= "<a href=\"javascript:ajax_user_sort('index_name', 
                'desc', 'user_list')\">&#x25BC;</a>";
$table_HTML .= "</th>\n";
$table_HTML .= "<th class=\"tlist\">Benutzergruppe ";
$table_HTML .= "<a href=\"javascript:ajax_user_sort('group_name', 
                'asc', 'user_list')\">&#x25B2;</a> ";
$table_HTML .= "<a href=\"javascript:ajax_user_sort('group_name', 
                'desc', 'user_list')\">&#x25BC;</a>";
$table_HTML .= "</th>\n";
$table_HTML .= "<th class=\"tlist\">Letztes Login ";
$table_HTML .= "<a href=\"javascript:ajax_user_sort('last_login', 
                'asc', 'user_list')\">&#x25B2;</a> ";
$table_HTML .= "<a href=\"javascript:ajax_user_sort('last_login', 
                'desc', 'user_list')\">&#x25BC;</a>";
$table_HTML .= "</th>\n";
$table_HTML .= "</tr>\n";
$table_HTML .= "[%table_all_rows%]\n";
$table_HTML .= "</table>\n";
 
$table_row_HTML  = "<tr>\n";
$table_row_HTML .= "<td><a href=\"?show_user.php?id=[%id%]\">
                    [%index_name%]</a></td>\n";
$table_row_HTML .= "<td><a href=\"?show_group.php?name=
                    [%group_name%]\">[%group_name%]</a></td>\n";
$table_row_HTML .= "<td>[%last_login%]</td>\n";
$table_row_HTML .= "</tr>\n";
 
$table_all_rows_HTML = "";
foreach($data as $record) {
   $record_HTML = $table_row_HTML;
   $record_HTML = str_replace("[%index_name%]", 
                     $record['index_name'], $record_HTML);
   $record_HTML = str_replace("[%group_name%]", 
                     $record['group_name'], $record_HTML);
   $record_HTML = str_replace("[%last_login%]", 
                     $record['last_login'], $record_HTML);
   $record_HTML = str_replace("[%id%]", 
                     $record['id'], $record_HTML);
   $table_all_rows_HTML .= $record_HTML;
}
$table_HTML = str_replace("[%table_all_rows%]", 
   $table_all_rows_HTML, $table_HTML);
 
echo $table_HTML;
?>

Da das Script an verschiedenen Stellen mögliche Fehlermeldungen ausgibt, enthält es die Funktion end_with_error($text), die für solche Ausgaben gedacht ist.

Das Script versucht zunächst eine Verbindung zu MySQL herzustellen. Im Fehlerfall gibt es eine entsprechende Meldung aus und wird beendet. Anschließend setzt es das SQL-Statement USE cms ab, um die CMS-Datenbank unseres Beispiels auszuwählen. Auch hier wird im Fehlerfall eine Meldung ausgegeben und das Script beendet.

Als nächstes wird geprüft, ob das Script mit GET-Parametern aufgerufen wurde. Denn über die GET-Parameter field und order erfährt das Script, nach welcher Tabellenspalte ($_GET['field']) und in welcher Sortierrichtung ($_GET['order']: aufsteigend = asc oder absteigend = desc) sortiert werden soll. Fehlen die GET-Parameter, werden Defaultwerte (Feld index_name und Sortierrichtung asc) festgesetzt. Genau das, also der Aufruf ohne GET-Parameter, geschieht beim ersten Aufruf des Scripts mit der include-Anweisung im Basis-Dokument, das wir weiter oben beschrieben haben.

Nachdem die Parameterfrage geklärt ist, wird ein Array namens $data initialisiert. In diesem Array werden die Daten gespeichert, die MySQL liefern soll. Der Grund, weshalb wir für dieses Beispiel Ajax einsetzen, ist ja, dass wir MySQL die Sortierung der Daten überlassen. Deshalb bauen wir das SQL-Statement zur Abfrage der Tabelle users so zusammen, dass sich die gewünschte Sortierung ergibt:
$sql = "SELECT * FROM users ORDER BY " . $sort_field . " " . $sort_order;

Die Variablen $sort_field und $sort_order wurden zuvor mit den Werten der GET-Parameter field und order oder mit Default-Werten versorgt. Je nach übergebenen GET-Parametern können also SQL-Statements entstehen wie beispielsweise:
$sql = "SELECT * FROM users ORDER BY last_login desc";

MySQL liefert die Daten in der gewünschten Sortierreihenfolge aus. Falls ein Fehler auftritt, wird wieder eine Meldung ausgegeben, und das Script wird beendet. In einer while-Schleife werden die von MySQL gelieferten Datensätze in den Array $data eingelesen.

In der zweiten Hälfte des Scripts user_sort.php wird der HTML-Code der auszugebenden Tabelle zusammengesetzt. In der Variablen $table_HTML wird zunächst das Grundgerüst der Ausgabetabelle gespeichert. An der Stelle, wo die Zeilen der Tabelle mit den auszugebenden Datensätzen stehen sollen, haben wir einen Platzhalter namens [%table_all_rows%] notiert, der später ersetzt wird. In der Variablen $table_row_HTML wird der HTML-Code einer einzelnen Tabellenzeile gespeichert. Auch dort arbeiten wir mit Platzhaltern, nämlich [%id%], [%index_name%], [%group_name%] und [%last_login%]. Dann wird die Variable $table_all_rows_HTML initialisiert. In einer foreach-Schleife wird nun der Array $data abgearbeitet. Bei jedem Schleifendurchlauf wächst der Inhalt der Variablen $table_all_rows_HTML um den Wert von $record_HTML. In $record_HTML wird jeweils eine frische Version von $table_row_HTML gespeichert. Dann werden die darin enthaltenen Platzhalter durch die tatsächlichen Daten des jeweils abgearbeiteten Datensatzes ersetzt. Am Ende muss dann nur noch in $table_HTML der Platzhalter [%table_all_rows%] durch $table_all_rows_HTML ersetzt werden. Die fertige HTML-Tabelle mit den sortierten Daten wird in einem Stück mit echo $table_HTML ausgegeben.

Seiten Revision: 3, zuletzt bearbeitet: 04 Jun 2009 15:59