 |
10.01.2007, 20:32
| Nach oben
#1 | | Benutzer
Registriert seit: 10.01.2007 Ort: Chemnitz
Beiträge: 47
| Order BY im Tabellenheader
hi ich grüsse euch ganz herzlichst,
meine frage lautet:
habe eine Tabelle (siehe code-bsp) und möchte, das ich im tabellenheader draufklicke und danach sortieren kann, also ich klicke auf Name oder Artikel Gruppe oder .. und kann nach DESC oder ASC sortieren.
wo kann man nachschauen oder hat bitte einer eine lösung wie man dies programmiert? PHP-Code: $artikeln = @mysql_query("
SELECT
*
FROM
wsp_adressen AS ad, wsp_artikel AS a
WHERE
ad.ID=a.AID
ORDER BY
a.ArtikelID");
if (!$artikeln) {
exit('<p>Fehler beim Abruf der Daten aus der Datenbank!<br>' .
'Error: ' . mysql_error() . '</p>');
}
:
:
while ($artikel = mysql_...... (code ist bekannt)
echo <<<Formular
<table border="1">
<tr>
<th>Name</th>
<th>ArtikelGruppe</th>
<th>ArtikelName</th>
<th>Nächste Rechnung</th>
</tr>
<tr>
<td>1</td>
<td>1 </td>
<td>1 </td>
<td>1 </td>
</tr>
<tr>
<td>.</td>
<td>. </td>
<td>. </td>
<td>. </td>
</tr>
<tr>
<td>100</td>
<td>100</td>
<td>100</td>
<td>100</td>
</tr>
</table>
Formular;
ich sage ganz herzlichen dank
es grüsst ganz herzlichst
jennifer
Geändert von jennifer (10.01.2007 um 20:36 Uhr).
|
| |
10.01.2007, 20:40
| Nach oben
#2 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Hallo,
das ist ja eigentlich recht simpel. Du verlinkst die Tabellenüberschrift und sendest beim Klick einen GET-Request an das Skript.
Das Skript wertet dann aus, ob da ein sort=desc oder ein sort=asc drin steht und verwendet die Information dann in der SQL-Anweisung.
Pseudocode mit Standardsortierung DESC: Code: WENN sort im GET-Request existiert
WENN sort == asc
ORDER BY ASC
SONST
ORDER BY DESC
SONST
ORDER BY DESC
Die Verlinkung musst du dann natürlich je nach ORDER BY auch ändern, damit man wieder zurück"switchen" kann.
Grüße, Ben.
|
| |
10.01.2007, 21:06
| Nach oben
#3 | | Benutzer
Registriert seit: 10.01.2007 Ort: Chemnitz
Beiträge: 47
| Order BY
hi ben,
erst einmal herzlichen dank für die schnelle antwort.
also ich habe dies mal so geschrieben, da ich mit solchen abfragen noch so meine kleinen proplemchen habe. PHP-Code: if (isset($_GET['Request'])) { if ($_GET['Request'] == ASC) { $sort = "ORDER BY ASC"; } elseif ($_GET['Request'] == DESC) { $sort = "ORDER BY DESC"; } }
oder wie hast du es gemeint?
es grüsst ganz herzlichst jennifer |
| |
10.01.2007, 21:10
| Nach oben
#4 | | Jonas
Registriert seit: 03.06.2006
Beiträge: 240
|
Nein.
So in etwa: HTML-Code: <th>Name <a href="seite.php?orderby=name&order=asc">^</a><a href="seite.php?orderby=name&order=desc">v</a> PHP-Code: if (isset($_GET['orderby'])) {
if (isset($_GET['order']) && ($_GET['order'] == 'desc')) {
$order = 'ORDER BY '.$_GET['orderby'].' DESC';
} else {
$order = 'ORDER BY '.$_GET['orderby'].' ASC';
}
}
__________________ Applikations-Programmierung:
BlitzMax, BlitzPlus Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL |
| |
10.01.2007, 21:12
| Nach oben
#5 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Kann man ja auch noch abkürzen PHP-Code: $orderBy = 'DESC';
if(array_key_exists('sort', $_GET) and $_GET['sort'] == 'asc') { $orderBy = 'ASC'; }
$sql = 'SELECT data FROM prefix_table ORDER BY columnName ' . $orderBy;
|
| |
10.01.2007, 21:55
| Nach oben
#6 | | Benutzer
Registriert seit: 10.01.2007 Ort: Chemnitz
Beiträge: 47
|
hi ihr lieben,
habe es jetzt geschafft, also es funktioniert
und sage ganz herzlichen dank für die unterstützung.
und hier der fertige codeschnipsel PHP-Code: if (isset($_GET['orderby'])) {
if (isset($_GET['order']) && ($_GET['order'] == 'desc')) {
$order = 'ORDER BY '.$_GET['orderby'].' DESC';
} else {
$order = 'ORDER BY '.$_GET['orderby'].' ASC';
}
}
$artikeln = @mysql_query("
SELECT
*
FROM
wsp_adressen AS ad, wsp_artikel AS a
WHERE
ad.ID=a.AID
$order");
if (!$artikeln) {
exit('<p>Fehler beim Abruf der Daten aus der Datenbank!<br>' .
'Error: ' . mysql_error() . '</p>');
}
$summen = @mysql_query("SELECT COUNT(*), SUM(ArtikelPreis) as preis FROM wsp_artikel");
while ($summe = mysql_fetch_assoc($summen)) {
$gesamtpreis = $summe['preis'];
}
echo <<<AusgabeKunden
<table width="100%" border="0" class="tabkunden">
<tr>
<th width="*">
ART-ID<a href="artikel_list.php?orderby=ArtikelID&order=asc">^</a>
<a href="artikel_list.php?orderby=ArtikelID&order=desc">v</a>
</th>
<th width="*">
Vorname, Name<a href="artikel_list.php?orderby=Vorname&order=asc">^</a>
<a href="artikel_list.php?orderby=Vorname&order=desc">v</a>
</th>
<th width="20" align="center" </th>
<th width="*">
Artikel Gruppe<a href="artikel_list.php?orderby=ArtikelGruppe&order=asc">^</a>
<a href="artikel_list.php?orderby=ArtikelGruppe&order=desc">v</a>
</th>
:
:
:
also nochmals herzlichen grossen dank
ganz herzliche grüsse an euch
jennifer
Geändert von jennifer (10.01.2007 um 22:14 Uhr).
|
| |
10.01.2007, 21:57
| Nach oben
#7 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.212
|
Ich würde die links so gestalten, dass immer nur ein ASC oder ein DESC vorhanden ist.
Das jeweils andere reicht ja.
In Abhängigkeit von dem, was via GET übergeben wurde nimmst du das im link einfach das andere...
Der Einfachheit wegen den post von Ben nicht übersehen!
|
| |
10.01.2007, 22:23
| Nach oben
#8 | | Benjamin Steininger
Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
|
Du musst unbedingt deine Parameter absichern, sonst kann es zu SQL-Injections kommen!
z.b. so: PHP-Code: if (isset($_GET['orderby'])) { $orderby = mysql_escape_string($_GET['orderby']); if (isset($_GET['order']) && ($_GET['order'] == 'desc')) { $order = 'ORDER BY '.$orderby.' DESC'; } else { $order = 'ORDER BY '.$orderby.' ASC'; } }
|
| |
10.01.2007, 22:39
| Nach oben
#9 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Mit meinem Code besteht diese Gefahr nicht .... |
| |
10.01.2007, 22:41
| Nach oben
#10 | | Benjamin Steininger
Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
|
Deiner unterstützt aber auch keinen dynamischen Feldnamen nach dem sortiert wird.
|
| |
10.01.2007, 22:50
| Nach oben
#11 | | Benutzer
Registriert seit: 10.01.2007 Ort: Chemnitz
Beiträge: 47
|
hi ihr lieben,
so habe das wegen der SQL-Injections mit eingebaut. PHP-Code: $orderby = mysql_escape_string($_GET['orderby']);
bastel nur noch an den link das nur noch einer sichtbar ist ansonsten funktioniert es prima, was es nicht alles gibt
also nochmals an alle ein rießen DANK
ganz herzliche grüsse
jennifer |
| |
11.01.2007, 00:42
| Nach oben
#12 | | Benutzer
Registriert seit: 10.01.2007 Ort: Chemnitz
Beiträge: 47
| Zitat:
Zitat von robo47 Deiner unterstützt aber auch keinen dynamischen Feldnamen nach dem sortiert wird. |
meinst du damit, die ausgabe der feldnamen in der select anweisung?
ganz herzliche grüsse
jennifer |
| |
11.01.2007, 02:20
| Nach oben
#13 | | Benjamin Steininger
Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
| Zitat:
Zitat von jennifer Zitat:
Zitat von robo47 Deiner unterstützt aber auch keinen dynamischen Feldnamen nach dem sortiert wird. |
meinst du damit, die ausgabe der feldnamen in der select anweisung?
ganz herzliche grüsse
jennifer  | das war im Bezug auf Bens Post, seine Lösung war ja nur auf ein Feld zur sortierung vorgesehen.
|
| |
11.01.2007, 07:43
| Nach oben
#14 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Wenn man ganz sichergehen will, ob die Spalte, nach der sortiert werden soll, überhaupt existiert (das ist ja auch noch eine Fehlerquelle), dann kann man im Voraus auch noch eine Abfrage à la Code: SHOW COLUMNS FROM prefix_table
an die Datenbank schicken und das Resultat dann mit dem übergebenen Parameter abgleichen.
Ist zwar eine Abfrage mehr, sichert aber ab, dass der übergebene Wert auch korrekt in die SQL-Abfrage passt.
|
| |
11.01.2007, 12:25
| Nach oben
#15 | | Benutzer
Registriert seit: 10.01.2007 Ort: Chemnitz
Beiträge: 47
|
hi ihr lieben,
so möchte mal meine seite kurz vorstellen, wie ich es gelöst und nach mein besten wissen geschrieben habe.
vieleicht kann ja jemand etwas gebrauchen.
die links sind momentan noch etwas zu viel aber was bessseres viel mir gerage nicht ein oder habe momentan keine andere lösung.
so php/mysql fortgeschritten bin ich noch nicht. PHP-Code:
<?php include "login.inc/sessionheader.inc.php"; if (isset($_SESSION['login']) && $_SESSION['login'] == true) { include"header.php"; ?> <div class="tabelleaussen" align="right"> » <a href='artikel_new.php' class="tabellenlink">Neuen Kunden Artikel hinzufügen</a> » <a href='artikel_list_2.php' class="tabellenlink">Kunden ohne Artikel</a> </div> <table class="tabinhaltaussen" align="center" border="0" width="100%" cellpadding="5" cellspacing="5"> <tr> <td class="tabinhaltinnen" align="center"> <?php include("../zugriff.inc.php"); echo "<h3 align='left'>Kunden Artikel Übersicht</h3>"; if (isset($_GET['orderby'])) { $orderby = mysql_escape_string($_GET['orderby']); if (isset($_GET['order']) && ($_GET['order'] == 'desc')) { $order = 'ORDER BY '.$orderby.' DESC'; } else { $order = 'ORDER BY '.$orderby.' ASC'; } } $artikeln = @mysql_query(" SELECT Vorname, Name, ArtikelID, ArtikelGruppe, ArtikelName, ArtikelPreis, DATE_FORMAT(DatumVon,'%d.%m.%Y') AS Datum, DatumBis FROM wsp_adressen AS ad, wsp_artikel AS a WHERE ad.ID=a.AID $order"); if (!$artikeln) { exit('<p>Fehler beim Abruf der Daten aus der Datenbank!<br>' . 'Error: ' . mysql_error() . '</p>'); } echo $order; $summen = @mysql_query("SELECT COUNT(*), SUM(ArtikelPreis) as preis FROM wsp_artikel"); while ($summe = mysql_fetch_assoc($summen)) { $gesamtpreis = $summe['preis']; } echo <<<AusgabeKunden <table width="100%" border="0" class="tabkunden"> <tr> <th width="*"> AusgabeKunden; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=ArtikelID&order=asc' class='sortlink'>ART-ID</a>"; } else { echo "<a href='artikel_list.php?orderby=ArtikelID&order=desc' class='sortlink'>ART-ID</a>"; } echo "</th><th width='*'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=Vorname&order=asc' class='sortlink'>Vorname Name</a>"; } else { echo "<a href='artikel_list.php?orderby=Vorname&order=desc' class='sortlink'>Vorname Name</a>"; } echo "</th><th width='20'> </th><th width='*'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=ArtikelGruppe&order=asc' class='sortlink'>Artikel Gruppe</a>"; } else { echo "<a href='artikel_list.php?orderby=ArtikelGruppe&order=desc' class='sortlink'>Artikel Gruppe</a>"; } echo "</th><th width='*'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=ArtikelName&order=asc' class='sortlink'>Artikel Name</a>"; } else { echo "<a href='artikel_list.php?orderby=ArtikelName&order=desc' class='sortlink'>Artikel Name</a>"; } echo "</th><th width='*'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=ArtikelPreis&order=asc' class='sortlink'>Preis</a>"; } else { echo "<a href='artikel_list.php?orderby=ArtikelPreis&order=desc' class='sortlink'>Preis</a>"; } echo "</th><th width='*' colspan='2'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=DatumVon&order=asc' class='sortlink'>Abrechnungszeitraum</a>"; } else { echo "<a href='artikel_list.php?orderby=DatumVon&order=desc' class='sortlink'>Abrechnungszeitraum</a>"; } echo "</th><th width='*'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=DatumBis&order=asc' class='sortlink'>Nächste RE</a>"; } else { echo "<a href='artikel_list.php?orderby=DatumBis&order=desc' class='sortlink'>Nächste RE</a>"; } echo "</th><th width='*'>"; if ($_GET['order'] == 'desc') { echo "<a href='artikel_list.php?orderby=Datum&order=asc' class='sortlink'>RE</a>"; } else { echo "<a href='artikel_list.php?orderby=Datum&order=desc' class='sortlink'>RE</a>"; } echo " </th> <th width='20'> </th> </tr> "; while ($artikel = mysql_fetch_array($artikeln)) { $artikelid = $artikel['ArtikelID']; $vname = $artikel['Vorname']; $vname = htmlspecialchars($artikel['Vorname']); $name = $artikel['Name']; $name = htmlspecialchars($artikel['Name']); $jahr = $artikel['AnmeldeJahr']; $artikelgruppe = $artikel['ArtikelGruppe']; $artikelgruppe = htmlspecialchars($artikel['ArtikelGruppe']); $artikelname = $artikel['ArtikelName']; $artikelname = htmlspecialchars($artikel['ArtikelName']); $artikelpreis = $artikel['ArtikelPreis']; $artikelpreis = htmlspecialchars($artikel['ArtikelPreis']); $datumvon = $artikel['Datum']; $datumbis = $artikel['DatumBis']; $tagaktuell = date('d'); // Aktueller Tag $monataktuell = date('m'); // Aktueller Monat $jahraktuell = date('Y'); // Aktuelles Jahr $dmY = explode(".", $datumvon); //Datum aufteilen $tagvor = $tagaktuell+12; echo <<<AusgabeKunden2 <tr> <td width="*" class="tabkunden" align="center"> <b>{$artikelid}</b></td> <td width="*" class="tabkunden" align="left"> {$vname}, {$name}</td> <td width="20" align="center" class="tabkunden"> <a href="artikel_edit.php?id=$artikelid"> <img src='../css/b_edit.png' width='14' height='14' border='0' alt='Bearbeiten'></a> </td> <td width="*" class="tabkunden" align="left"> {$artikelgruppe}</td> <td width="*" class="tabkunden" align="left"> {$artikelname}</td> <td width="*" class="tabkunden" align="left"> {$artikelpreis}</td> <td width="*" class="tabkunden" align="left" colspan="2"> {$datumvon} - {$datumbis}</td> <td width="*" class="tabkunden" align="left"> {$datumvon}</td> <td width="*" class="tabkunden" align="center"> AusgabeKunden2; if ($tagvor >= $dmY[0] && $monataktuell == $dmY[1] ) { echo "<a href='pdf/wdsl_rechnung.php?id=$artikelid' target='_blank' style='color:#00FFFF'> » JA « </a>"; } else { echo "Nein"; } echo "</td>"; echo "<td width='20' align='center' class='tabkunden'>"; echo " <a href='artikel_del.php?edit=artikel_del&page=edit&id=$artikelid'> <img src='../css/delete.gif' width='13' height='14' border='0' alt='Löschen'></a> "; echo "</td>"; } echo "</tr>"; echo "<tr>"; echo "<td colspan='5'> </td>"; echo "<td>$gesamtpreis</td>"; echo "<td> </td>"; echo "</tr>"; echo "</table>"; mysql_close(); ?> </td> </tr> </table> <?php include"footer.php"; } else { include"erstlogin.php"; } ?> also nochmals vielen dank für die schnelle antwort und habe wieder viel dazu gelernt, danke
ganz herzliche grüsse an alle
jennifer |
| |
11.01.2007, 12:41
| Nach oben
#16 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
| Zitat:
Zitat von jennifer habe wieder viel dazu gelernt | Hoffen wir, dass du weiterhin hier mitliest und das mit dem Lernen so weitergeht. Der Code ist zwar lauffähig, aber das war es dann ja auch.
Als weiterführende Tipps und als Abschluss in diesem Thread (bei Fragen zu den Links einfach einen entsprechenden neuen Thread aufmachen! Danke.) hier noch was zum Lesen: - Ein eigenes Templatesystem schreiben - Templates dienen dazu HTML und PHP-Code voneinander zu trennen. Das erhöht eigentlich immer die Lesbarkeit des Codes, weil du für Änderungen am HTML-Code nicht in PHP-Dateien rumwühlen musst und andersherum.
Wenn man auf Templates verzichten möchte, so kann man auch eine Struktur wie hier beschrieben verwenden. - Sichere PHP-Web-Applikationen schreiben - Sollte man mal durchgearbeitet haben.

In diesem Sinne fröhliches Schaffen.
Grüße, Ben.
|
| | |