Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Tabellen sortieren mit PHP

Anleitung Entwicklung PHP

Mitglied: Guenni

Guenni (Level 2) - Jetzt verbinden

12.01.2006, aktualisiert 16.03.2012, 48993 Aufrufe, 4 Kommentare, 1 Danke

Sortierung von Tabellen mit PHP

Teil I - Sortierung von Spalten innerhalb einer Tabelle

1. Ausgabe von Datensätzen in Tabellenform
2. Die sortierte Ausgabe von Spalten innerhalb der Tabelle
3. Die Richtung der Sortierung der einzelnen Spalte(aufwärts, abwärts)
4. Übergabe von Sortierkriterien per Link

Im Anhang I nochmal die PHP-Seite im Zusammenhang

Teil II - Sortierung von Spalten innerhalb einer Tabelle, verteilt auf
mehrere Seiten

Hier gibt's keine Unterpunkte, es werden lediglich die Erweiterungen zur ersten Seite
erläutert.

Im Anhang II auch diese PHP-Seite im Zusammenhang

Der Zugriff auf die Datenbank erfolgt mit HTML/PHP. Als Datenbank-Server läuft
MySQL. Verzichtet wird auf Fehlerabfragen.

Software:
Linux Debian Sarge
Apache
MySQL 4
PHP4

Teil I - Sortierung von Spalten innerhalb einer Tabelle

1. Ausgabe von Datensätzen in Tabellenform

Die einfachste Form, Daten aus einer Datenbank auszugeben:

01.
<?> 
02.
$query="select vorname, nachname, telefon from tabelle"
03.
$result=mysql_query($query, $conn); 
04.
echo "<table>"
05.
while($row=mysql_fetch_array($result, MYSQL_ASSOC)){ 
06.
 echo "<tr><td>"
07.
 echo implode("<td>", $row); 
08.
echo "</tr>"
09.
10.
echo "</table>"
11.
</?>
In der Variablen $query wird die Select-Anweisung gespeichert, diese Variable
wird der Funktion mysql_query übergeben.

Einfache Abfragen können auch folgenderweise realisiert werden:

01.
<?> 
02.
$result=mysql_query("select .....", $conn); 
03.
</?>
Hier wird die Select-Anweisung der Funktion direkt als "String" übergeben, im Laufe des
Tutorials wird die Select-Anweisung jedoch um einige Parameter erweitert.

Da die Parameter von Variablen abhängig sind, ist es einfacher, die Select-Anweisung
außerhalb der Funktion zu definieren, und sie dann der Funktion als Variable zu übergeben.

In der while-Schleife werden der Variablen $row die einzelnen Datenfelder der
Datensätze als Array übergeben.

Die Funktion implode fügt ein <td> als Trennzeichen der Datenfelder ein.
Ein </td> ist nicht erforderlich.

2. Die sortierte Ausgabe von Spalten innerhalb der Tabelle

Wenn die oben beschriebene Anweisung 10 oder 20 Datensätze zutage fördert,
so bleibt es einigermaßen übersichtlich. Bei hundert oder mehr Datensätzen kann
das Finden eines Eintrags schon zu einem lästigen Rauf- und Runterscrollen der
Ergebnisseite führen.

Lassen wir uns deshalb mal die einzelnen Spalten sortieren. Dazu wird der Spaltenname
der Tabelle separat ermittelt und als Link dargestellt.
Dieser Link bekommt als Parameter den Spaltennamen "mit auf den Weg" um die
Select-Anweisung zu steuern.

Die Spaltennamen der Tabelle werden mit folg. Anweisung ermittelt und dargestellt:

01.
<?> 
02.
$row=mysql_fetch_array($result, MYSQL_ASSOC)); 
03.
while($field=key($row)){ 
04.
  echo "<th>$field</th>"
05.
  next($row); 
06.
07.
</?>
Der Variablen $field werden in der while-Schleife die einzelnen Spaltennamen durch
die Funktion key übergeben. Als Trennzeichen verwenden wir diesmal #th>,
th bedeutet table header.

Der Unterschied zwischen th und td ist lediglich der, dass bei th der Eintrag mittig
und fett dargestellt wird, td zu verwenden wäre also kein Fehler.

Um nun einzelne Spalten sortiert dazustellen, muß die Seite erneut aufgerufen werden.
Dazu wird der Spaltenname als Link auf die Seite selber definiert, das Sortierkriterium wird
dem Link als Parameter angehangen:

01.
<?> 
02.
while($field=key($row)){ 
03.
  echo "<th><a href=\" sort.php?sort=$field\">$field</a></th>"
04.
  next($row); 
05.
06.
</?>
Beim Klick auf einen Spaltenkopf wird die Seite sort.php erneut aufgerufen, Inhalt des Parameters sort ist der Name des Spaltenkopfs, über dem sich der Mauszeiger jeweils beim Klick befindet.
Unsere Eingangsabfrage, s.o., gestaltet sich nun folgendermaßen:

01.
<?> 
02.
if($sort){ 
03.
 $query="select vorname, nachname, telefon from tabelle order by $sort"
04.
}else
05.
          $query="select vorname, nachname, telefon from tabelle"
06.
07.
</?>
if($sort) überprüft, ob die Variable $sort mit einem Wert gefüllt ist.
Wenn ja, wird der ja-Zweig der if-Abfrage ausgeführt. Die Tabelle wird so ausgegeben, dass die
Spalte, deren Tabellenkopf angeklickt wurde, sortiert ausgegeben wird.

Wenn die Seite das erste Mal aufgerufen wird, so kann $sort auch nicht gefüllt sein. Folglich wird
dann der Alternativ-Zweig der if-Abfrage ausgeführt.

Vor dem Hintergrund kann man die Ausgabe der Tabelle natürlich auch standardmäßig nach einem bestimmten Kriterium sortieren. Dann sähe die Anweisung so aus:

01.
<?> 
02.
if($sort){ 
03.
 $query="select vorname, nachname, telefon from tabelle order by $sort"
04.
}else
05.
          $query="select vorname, nachname, telefon from tabelle order by nachname"
06.
07.
</?>
3. Die Richtung der Sortierung der einzelnen Spalte(aufwärts, abwärts)

Auch die Richtung der Sortierung der einzelnen Spalte(aufwärts, abwärts) läßt sich steuern, nämlich mit den Konstanten asc und desc.

$query="select vorname, nachname, telefon from tabelle order by nachname asc";
sortiert die Tabelle innerhalb der Spalte nachname aufwärts. Da asc die Standardeinstellung ist,
kann diese optionale Konstante auch entfallen.

$query="select vorname, nachname, telefon from tabelle order by nachname desc";
dagegen sortiert die Tabelle innerhalb der Spalte nachname abwärts.

Um dieses Verhalten zu steuern, definieren wir eine Funktion:

01.
<?> 
02.
function direction($dir){ 
03.
 if($dir= ="asc"){ 
04.
  return "desc"
05.
 }else
06.
           return "asc"
07.
08.
09.
</?>
Somit können wir die Abfrage um einen weiteren Parameter erweitern:

01.
<?> 
02.
if($sort){ 
03.
 $dir=direction($dir); 
04.
 $query="select vorname, nachname, telefon from tabelle order by $sort $dir"
05.
}else
06.
          $query="select vorname, nachname, telefon from tabelle"
07.
08.
</?>
Der Code zur Ermittlung der Spaltennamen wird ebenfalls um einen Parameter erweitert:

01.
<?> 
02.
while($field=key($row)){ 
03.
  echo "<th><a href=\" sort.php?sort=$field&dir=$dir\">$field</a></th>"
04.
  next($row); 
05.
06.
</?>
Analysieren wir den Ablauf:

Die Seite wird zum ersten Mal aufgerufen, die Variable $sort ist leer, folglich wird der Alternativ-Zweig,
oder auch Nein-Zweig, der if-Abfrage ausgeführt.

Ausgabe der Tabelle: Reihenfolge der Datensätze, wie sie eingegeben wurden.

Klicken wir nun einen der Spaltenköpfe an, wird die Seite erneut aufgerufen, diesmal ist die Variable $sort nicht leer, sondern in ihr ist der Name des Spaltenkopfs enthalten, somit wird der ja-Zweig der if-Abfrage ausgeführt.

Innerhalb des ja-Zweigs bekommt die Variable $dir den Rückgabewert der Funktion direction
zugewiesen.

Die Variable $dir wird der Funktion als Parameter übergeben. Da die Variable $dir zu dem Zeitpunkt ebenfalls "leer" ist, wird ihr gemäß der Funktionsbeschreibung erstmal der Wert "asc" übergeben.

Beispiel:

Der Spaltenkopf vorname wird angeklickt.
Die Seite wird erneut aufgerufen.
In der Variablen $sort steckt nun vorname, in der Variablen $dir asc.

Ausgabe der Tabelle: Reihenfolge der Datensätze sind innerhalb der Spalte vorname aufsteigend sortiert.

Teil II - Sortierung von Spalten innerhalb einer Tabelle, verteilt auf
mehrere Seiten

Damit die Ausgabe großer Tabellen noch etwas komfortabler wird, werden wir
nun die Ausgabe auf mehrere Seiten verteilen, natürlich auch sortiert.

Zugrunde liegt die erste PHP-Seite, die um einige Anweisungen erweitert wird:

Anzahl der Datensätze pro Seite:

01.
<?> 
02.
$sets=4; 
03.
</?>
Wieviele Seiten brauchen wir? Dazu müssen wir wissen, wieviele Datensätze überhaupt
da sind, das erledigt die Funktion count:

01.
<?> 
02.
$query="select count(id) as Count from tabelle"
03.
</?>
Das Ergebnis wird in der Variablen $pages gespeichert:

01.
<?> 
02.
$result=mysql_query($query,$conn); 
03.
$pages=mysql_fetch_array($result,MYSQL_ASSOC); 
04.
</?>
Wenn wir 10 Datensätze haben, ergibt 10(Sätze) geteilt durch 4(die wir anzeigen wollen) 2,5
Seiten, halbe Seite gibt's nicht, die Funktion ceil rundet auf die nächst höhere Ganzzahl auf,
also 3 Seiten:

01.
<?> 
02.
$pages=ceil($pages[Count]/$sets); 
03.
</?>
Bei einer seitenweisen Ausgabe sucht man sich ein Hauptkriterium heraus, nach welchem
die Seiten vorab sortiert werden, in diesem Beispiel, ein Minitelefonbuch, ist es der Nachname.
Die folgende Anweisung
- erstellt eine temporäre Tabelle, diese wird bei Sitzungsende automatisch gelöscht
- sortiert die Daten der Quelltabelle nach Nachname
- fügt den Teil, den wir sehen wollen, in die temporäre Tabelle ein, angefangen bei
$start, dazu mehr weiter unten, begrenzt auf $sets(s.o. $sets=4)

Den Ausschnitt, den wir sehen wollen, liefert uns der Parameter limit Startwert, Anzahl:

01.
<?> 
02.
if($start){ 
03.
 $query="create temporary table tmp select * from tabelle order by nachname limit start,$sets"
04.
}else
05.
          $query="create temporary table tmp select * from tabelle order by nachname limit 0,$sets"
06.
07.
</?>
Die Daten der einzelnen Seite holen wir nun aus der temporären Tabelle:

01.
<?> 
02.
if($sort){ 
03.
 $dir=direction($dir); 
04.
 $query="select vorname, nachname, telefon from tmp order by $sort $dir"
05.
}else
06.
       $query="select vorname, nachname, telefon from tmp"
07.
08.
</?>
Eine Standardsortierung im Nein-Zweig der if-Abfrage kann entfallen, da die Daten
bereits sortiert in der Tabelle tmp vorliegen.

Der Code zur Darstellung des Spaltenkopfs wird um den Parameter start=$start erweitert:

01.
<?> 
02.
while($field=key($row)){ 
03.
  echo "<th><a href=\"sort2.php?start=$start&sort=$field&dir=$dir\">$field</a></th>"
04.
  next($row); 
05.
06.
</?>
Am Ende der Seite
- werden die Links auf die Seiten generiert
- werden die Startwerte errechnet, ab welchem Datensatz die Daten pro Seite
- angezeigt werden

Die Variable $page ist einfach die Seitenzahl, da die Zählung bei Null beginnt, wird eine 1
aufaddiert:

01.
<?> 
02.
$start=0; 
03.
for($i=0;$i<$pages;$i++){ 
04.
 $page=$i+1; 
05.
 echo "<a href=\"sort2.php?start=$start\">Seite $page</a> "
06.
 $start+=$sets
07.
08.
</?>
Anhang I - Anzeige der Tabelle auf einer Seite

01.
<? 
02.
function direction($dir){ 
03.
 if($dir= ="asc"){ 
04.
  return "desc"
05.
 }else
06.
           return "asc"
07.
08.
09.
 
10.
$conn=mysql_connect("localhost","user","passwort"); 
11.
$db=mysql_select_db("Datenbankname"); 
12.
if($sort){ 
13.
 $dir=direction($dir); 
14.
 $query="select vorname, nachname, telefon order by $sort $dir"
15.
}else
16.
          $query="select vorname, nachname, telefon from tabelle"
17.
          //oder  $query="select vorname, nachname, telefon from tabelle order by nachname"
18.
          //z.B. als Standardsortierung 
19.
20.
$result=mysql_query($query, $conn); 
21.
?> 
22.
<html> 
23.
<head> 
24.
<title>Untitled</title> 
25.
</head> 
26.
<body> 
27.
<? 
28.
$row=mysql_fetch_array($result, MYSQL_ASSOC)); 
29.
echo "<table border=\"1\">"
30.
//Begin des Tabellenkopfes 
31.
echo "<tr>"
32.
while($field=key($row)){ 
33.
  echo "<th><a href=\" sort.php?sort=$field&dir=$dir\">$field</a></th>"
34.
  next($row); 
35.
36.
echo "</tr>"
37.
//Ende Tabellenkopf 
38.
//Da durch die Anweisung $row=mysql_fetch_array($result, MYSQL_ASSOC)); bereits der 
39.
//erste Datensatz "geholt" wurde, muß er separat ausgegeben werden 
40.
echo "<tr>"
41.
echo implode("<td>", $row); 
42.
echo "</tr>"
43.
//Dann erfolgen die restlichen Datensätze mit der while-Schleife 
44.
while($row=mysql_fetch_array($result, MYSQL_ASSOC)){ 
45.
 echo "<tr><td>"
46.
 echo implode("<td>", $row); 
47.
echo "</tr>"
48.
49.
echo "</table>"
50.
?> 
51.
</body> 
52.
</html>
Anhang II - Anzeige der Tabelle auf mehreren Seiten

01.
<? 
02.
function direction($dir){ 
03.
 if($dir=="asc"){ 
04.
  return "desc"
05.
 }else
06.
           return "asc"
07.
08.
09.
$sets=4; 
10.
$conn=mysql_connect("localhost","user","passwort"); 
11.
$db=mysql_select_db("Datenbankname"); 
12.
$query="select count(id)as Count from tabelle"
13.
$result=mysql_query($query,$conn); 
14.
$pages=mysql_fetch_array($result,MYSQL_ASSOC); 
15.
$pages=ceil($pages[Count]/$sets); 
16.
if($start){ 
17.
 $query="create temporary table tmp select * from tabelle order by nachname limit $start,$sets"
18.
}else
19.
       $query="create temporary table tmp select * from tabelle order by nachname limit 0,$sets"
20.
21.
mysql_query($query,$conn); 
22.
if($sort){ 
23.
 $dir=direction($dir); 
24.
 $query="select vorname, nachname, telefon from tmp order by $sort $dir"
25.
}else
26.
       $query="select vorname, nachname, telefon from tmp"
27.
28.
$result=mysql_query($query, $conn); 
29.
?> 
30.
<html> 
31.
<head> 
32.
<title>Untitled</title> 
33.
</head> 
34.
<body> 
35.
<? 
36.
$row=mysql_fetch_array($result, MYSQL_ASSOC); 
37.
echo "<table border=\"1\">"
38.
//Begin des Tabellenkopfes 
39.
echo "<tr>"
40.
while($field=key($row)){ 
41.
  echo "<th>#a href=\"sort2.php?start=$start&sort=$field&dir=$dir\">$field#/a>#/th>"
42.
  next($row); 
43.
44.
echo "</tr>"
45.
//Ende Tabellenkopf 
46.
//Da durch die Anweisung $row=mysql_fetch_array($result, MYSQL_ASSOC)); bereits der 
47.
//erste Datensatz "geholt" wurde, muß er separat ausgegeben werden  
48.
echo "<tr><td>"
49.
echo implode("<td>", $row); 
50.
echo "</tr>"
51.
//Dann erfolgen die restlichen Datensätze mit der while-Schleife 
52.
while($row=mysql_fetch_array($result, MYSQL_ASSOC)){ 
53.
 echo "<tr><td>"
54.
 echo implode("<td>", $row); 
55.
echo "</tr>"
56.
57.
echo "</table>#br>"
58.
$start=0; 
59.
for($i=0;$i<$pages;$i++){ 
60.
 $page=$i+1; 
61.
 echo "<a href=\"sort2.php?start=$start\">Seite $page</a> "
62.
 $start+=$sets
63.
64.
?> 
65.
</body> 
66.
</html>
Die Sortierung ist noch nicht ganz perfekt, da die Konstanten asc und desc abwechslend
von der Funktion zurückgegeben werden. Heißt, wenn z.B. eine Spalte bereits aufwärts sortiert
ist, und die Funktion jetzt zufällig den Wert asc zurückgibt, passiert natürlich nichts, obwohl
man(vielleicht) erwarten würde, dass die Spalte nun abwärts sortiert wird.

Dazu müßte man noch Variablen einführen, die sich den sortierten Zustand jeder Spalte
"merken", eine Abfrage definieren, die den Zustand abruft und die erwartete Sortierung
steuert.

Tja, ich glaube, das war's soweit.

Grüße
Günni

Auf Anfrage eines Mitglieds ein Nachtrag:

In der Datei php.ini kann eine Variable namens register_globals gesetzt werden. Diese Variable kann die Einstellung On|Off enthalten.

Wirkung bei register_globals=On:

Variablen, die via GET (zielscript?name=ich&freund=du) oder POST (über Formular: z.B. Textfeldname) gesendet werden, können im Zielscript

einfach verwendet werden, indem man dem Variablennamen einfach das Dollarzeichen ($) voranstellt.

Bei einem Link, "zielscript?name=ich&freund=du", z.B. reicht es, im Zielscript zu fragen: if($name=="ich" . . . ect..

Das Gleiche gilt auch für z.B. Textfelder im Formular "<input . . . . name="ich" . . .": if($_POST['ich']=="Günni" . . . ect..

Und da register_globals standardmäßig in meiner damaligen PHP-Version 4.x mit On belegt war, lief das Script natürlich erwartungsgemäß.


Seit PHP-Version 5.x wird diese Variable standardmäßig mit Off belegt, was zur Folge hat, dass die Variablen je nach Übermittlungsart (POST oder GET)

auch so abgefragt werden müssen, also bei einem Link z.B.:

if($_GET['name'] == "ich" . . . etc..

Oder via Formular:

if($_POST['ich'] == "Günni" . . . ect..

Die Variable wurde seit PHP-Version 5.x aus Sicherheitsgründen auf Off gestellt und soll auch, lt. Info einiger Websites, demnächst in neueren Versionen

ganz aus der Konfig-Datei verschwinden.
Mitglied: Enclave
18.03.2006 um 19:10 Uhr
PS: Das Tutorial ist super!

Mit freundlichen Grüßen Enclave
Bitte warten ..
Mitglied: 36213
03.10.2006 um 23:58 Uhr
Du bekommst eine glatte "6" im Umgang mit Datenbanken.
Leider erlaubt mir das Script nur eine einmalige Bewertung (hoffe ich für Dich!), sonst würde ich hier minütlich auflaufen, bis die 4 Sterne verschwunden sind.

Wieso?

Frag nach!
Bitte warten ..
Mitglied: Guenni
04.10.2006 um 20:27 Uhr
Bin gespannt.
Bitte warten ..
Mitglied: Ash-rak
01.08.2007 um 13:24 Uhr
Und wo hat sich das Tutorial nun versteckt ?

Ich hatte das schonmal gelesen hier aber nun ist es verschwunden.

Ash-rak
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
PHP
gelöst Php regex und Array (5)

Frage von Thomas91 zum Thema PHP ...

CMS
PHP - WordPress auf Apache schneller als auf IIS? (13)

Frage von Rene1976 zum Thema CMS ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...