webForumDet fria alternativet

Sortering i tabell

8 svar · 364 visningar · startad av learn

learnMedlem sedan jan. 20051 143 inlägg
#1

Jag har en tabell fylld med data hämtad från en mysql-databas. Nu vill jag att besökaren själv skall kunna välja i vilken ordning posterna skall sorteras efter genom att klicka på kolumnens rubrik.

Så här ser det ut nu:


<?
// Hämta personer
?>

<table>

<tr>
<td>Förnamn</td><td>Efternamn</td><td>Ålder</td>
</tr>

<?
$sql = mysql_query("
SELECT fNamn, eNamn, alder
FROM personer
ORDER BY fName
");

while ($r = mysql_fetch_array($sql)) {

?>

<tr>
<td><?=$r['fNamn']?></td><td><?=$r['eNamn']?></td><td><?=$r['alder']?></td>
</tr>

<?
}
?>

</table>

Rubrikerna är alltså i detta fall "Förnamn", "Efternamn" och "Ålder". Klickar besökaren på "Efternamn" så skall alltså posterna sorteras efter personens efternamn A-Ö, klickar han/hon sedan på samma rubrik igen så sorteras de enligt Ö-A.

"Aktuell" kolumn skall markeras med en bild framför rubriken. Vid A-Ö skall "bild.gif" visas och Ö-A "bild2.gif".

Jag kan inte komma på hur jag skall göra och skulle därför vara oerhört tacksam ifall ngn av er kan hjälpa mig! Tack! :)

learnMedlem sedan jan. 20051 143 inlägg
#2

Någon som ngt förslag på hur jag kan göra?

The_HulkMedlem sedan juni 20031 937 inlägg
#3

Här är en början.

<?
// Hämta personer
$order = isset($_GET['order']) ? $_GET['order'] : "fNamn";
$orderad  = isset($_GET['order']) ? $_GET['orderad'] : "asc";

if($order != "fNamn" || $order != "eNamn" || "$order != "alder")
{
    $order = "fNamn";
}

if($orderad != "asc" || $orderad != "desc")
{
    $orderad = "asc";
}

?>

<table>

<tr>
<td><a href="?order=fNamn&orderad=<?=($orderad=="asc"?"desc":"asc"?>">Förnamn</a></td><td><a href"?order=eNamn&orderad=<?=($orderad=="asc"?"desc":"asc"?>">Efternamn</a></td><td><a href"?order=alder&orderad=<?=($orderad=="asc"?"desc":"asc"?>">Ålder</a></td>
</tr>

<?

$sql = mysql_query("
SELECT fNamn, eNamn, alder
FROM personer
ORDER BY $order $orderad
");

while ($r = mysql_fetch_array($sql)) {

?>

<tr>
<td><?=$r['fNamn']?></td><td><?=$r['eNamn']?></td><td><?=$r['alder']?></td>
</tr>

<?
}
?>

</table>
SjodahlMedlem sedan maj 20033 137 inlägg
#4

Vad gör denna raden igentligen?
tror aldrig jag har fått in det där med ett "?" och ":"

$sort = isset($_GET['sort']) ? $_GET['sort'] : "fNamn";
The_HulkMedlem sedan juni 20031 937 inlägg
#5

Vet faktiskt inte vad det kallas.
om det som står mellan = och ? är sant tilldelas varaiblen $sort det som står mellan ? och : är det falskt får variablen $sort värdet mellan : och ;
variablen $sort får värdet av $_GET['sort'] om isset($_GET['sort']) är sant och "fNamn" om det är falskt.

$variabel = (boolskt värde) ? (värder om det är sant) : (värde om det är falskt);

Lite kompaktare sätt att skriva if-satsen

if(isset($_GET['sort']))
{
    $sort = $_GET['sort'];
}
else
{
    $sort = "fNamn";
}

hoppas att någon av förklaringarna kan hjälpa.

SjodahlMedlem sedan maj 20033 137 inlägg
#6

aha då är jag med... tack!

SjodahlMedlem sedan maj 20033 137 inlägg
#7

aha då är jag med... tack!

learnMedlem sedan jan. 20051 143 inlägg
#8

Tack för ditt tips The_Hulk. Det var dock ett antal fel i din kod, slarvfel förmodar jag. Här kommer en korrigerad version av din kod:

<?

$order = isset($_GET['order']) ? $_GET['order'] : "fNamn";
$orderad  = isset($_GET['order']) ? $_GET['orderad'] : "asc";

if ($order != "fName" && $order != "lName" && $order != "born")
{
    $order = "fName";
}

if ($orderad != "asc" && $orderad != "desc")
{
    $orderad = "asc";
}

?>

<table>

<tr>
<td><a href="?order=fName&orderad=<?=$orderad=="asc"?"desc":"asc"?>">Förnamn</a></td>
<td><a href="?order=lName&orderad=<?=$orderad=="asc"?"desc":"asc"?>">Efternamn</a></td>
<td><a href="?order=born&orderad=<?=$orderad=="asc"?"desc":"asc"?>">Ålder</a></td>
</tr>

<?

$sql = mysql_query("
SELECT fName, lName, born
FROM person
ORDER BY $order $orderad
") or die(mysql_error());

while ($r = mysql_fetch_array($sql)) {

?>

<tr>
<td><?=$r['fName']?></td><td><?=$r['lName']?></td><td><?=$r['born']?></td>
</tr>

<?
}
?>

</table>

Passade även på att ändra till den faktiska databas-queryn. Detta fungerar ju bra, förutom att den ändrar desc/asc-ordningen när jag klickar på en ny kolumn-rubrik...det ska den ju inte göra, endast om jag klickar på samma rubrik två gånger.

Dessutom:

learn skrev:

"Aktuell" kolumn skall markeras med en bild framför rubriken. Vid A-Ö skall "bild.gif" visas och Ö-A "bild2.gif".

The_HulkMedlem sedan juni 20031 937 inlägg
#9

Tänkte att om du fick hjälp en bit kanske du kunde göra resten själv.
Felen berodde nog på slarv, testade inte koden utan skrev det bara rakt ner i WF.

har inte testat detta heller men hoppas att det ska fungera.

<?
sesstion_start();

$order = isset($_GET['order']) ? $_GET['order'] : "fNamn";
$orderad  = isset($_GET['order']) ? $_GET['orderad'] : "asc";

if ($order != "fName" && $order != "lName" && $order != "born")
{
    $order = "fName";
}

if ($orderad != "asc" && $orderad != "desc")
{
    $orderad = "asc";
}

$fNamnBild = "";
$eNamnBild = "";
$alderBild = "";

$fNamnOrderAD = "";
$eNamnOrderAD = "";
$alderOrderAD = "";

if($_SESSION['order'] == "fNamn" && $order == "fNamn")
{
    $fNamnOrderAD = ($orderad == "asc" ? "desc" : "asc") : "asc";
    $fNamnBild = $fNamnOrderAD == "asc" ? "bild.gif" : "bild2.gif";
}

if($_SESSION['order'] == "fNamn" && $order == "eNamn")
{
    $eNamnOrderAD = ($orderad == "asc" ? "desc" : "asc") : "asc";
    $eNamnBild = $eNamnOrderAD == "asc" ? "bild.gif" : "bild2.gif";
}

if($_SESSION['order'] == "fNamn" && $order == "alder")
{
    $alderOrderAD = ($orderad == "asc" ? "desc" : "asc") : "asc";
    $alderBild = $alderOrderAD == "asc" ? "bild.gif" : "bild2.gif";
}

?>

<table>

<tr>
<td><a href="?order=fName&orderad=<?=$fNamnOrderAD?>"><?=$fNamnBild!=""?"<img src='" . $fNamnBild . "' />":""?>Förnamn</a></td>
<td><a href="?order=lName&orderad=<?=$eNamnOrderAD?>"><?=$eNamnBild!=""?"<img src='" . $eNamnNild . "' />":""?>Efternamn</a></td>
<td><a href="?order=born&orderad=<?=$alderOrderAD?>"><?=$alderBild!=""?"<img src='" . $alderBild . "' />":""?>Ålder</a></td>
</tr>
<?

$_SESSION['order'] = $order;

$sql = mysql_query("
SELECT fName, lName, born
FROM person
ORDER BY $order $orderad
") or die(mysql_error());

while ($r = mysql_fetch_array($sql)) {

?>

<tr>
<td><?=$r['fName']?></td><td><?=$r['lName']?></td><td><?=$r['born']?></td>
</tr>

<?
}
?>

</table>
Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb