webForumDet fria alternativet

Order by

PHP

11 svar · 395 visningar · startad av silfver

Medlem sedan apr. 200312 679 inlägg
Frågan#1

Har pysslat ihop lite kod här till min filmlista. Men jag vill att man själv ska kunna välja hur man ska sortera filmerna. I den röda texten så ser ni hur jag vill att man ska göra. Så i stället för att skapa tre olika filer för att sortera listade jag ut att det måste gå att lösa på ett smidigare sätt. Genom att bara ändra lite i koden här. Eller hur?

<table cellspacing="0" cellpadding="0" style="border: none; width: 100%;">
<tr>
	<td><strong>[red]<a href="?sort_by=title">Filmtitel</a></strong>[/red]</td>
	<td><strong>[red]<a href="?sort_by=year">År</a></strong>[/red]</td>
	<td><strong>[red]<a href="?sort_by=vote">Betyg</a></strong>[/red]</td>
</tr><?php
require "connect.php";

$S_FILMER = mysql_query("SELECT * FROM filmer ORDER BY title ASC") or die(mysql_error());
while($row = mysql_fetch_array($S_FILMER)) {

print '
<tr>
	<td><a href="http://www.imdb.com/title/'.$row['imdb'].'/">'.$row['title'].'</a></td>
	<td>'.$row['year'].'</td>
	<td>'.$row['vote'].'/10</td>
</tr>';
}
?>

</table>

Hoppas någon vet vad jag dillar om och har lust att hjälpa mig. :)

Och just det. Var lite osäker på om den platsade bättre i SQL-forumet... Aja, det får en moderator avgöra. :)

Medlem sedan feb. 20001 861 inlägg
#2
$order_by = $_GET['sort_by'];

$S_FILMER = mysql_query("SELECT * FROM filmer ORDER BY $order_by ASC") or die(mysql_error());

Border väl funka?

Medlem sedan apr. 200312 679 inlägg
#3

OlleBoop skrev:

$order_by = $_GET['sort_by'];

$S_FILMER = mysql_query("SELECT * FROM filmer ORDER BY $order_by ASC") or die(mysql_error());

Border väl funka?

Det funkade bra. Men nu kom jag på en sak till. Som jag egentligen borde fattat tidigare.

När man sorterar efter till exempel årtal, då storterar man ju i stigande ordning (ORDER BY year ASC). Kan man inte göra så att om man klickar på samma länk en andra gång så sorterar man efter fallande? Förstår du hur jag tänker? :)

Medlem sedan feb. 20001 861 inlägg
#4

Jo, det är bara att haka på ett argument till på url:n.

<a href="?sort_by=title&amp;valfrittnamnpåvariabeln=DESC">
$order_by = $_GET['sort_by'] . " " . $_GET['valfrittnamnpåvariabeln'];
$S_FILMER = mysql_query("SELECT * FROM filmer ORDER BY $order_by") or die(mysql_error());

Sen får du skiva ut ASC el DESC i länken beroende på vad som redan står i url:n, ex är valfrittnamnpåvariabeln=DESC så sätter du ASC i länken.

Sen bör du kolla vad som skickas med i url:n, inte bara stoppa in den i SQL-satsen direkt.

Medlem sedan feb. 2000372 inlägg
#5

Så här kan du göra.
(Otestad kod och helt utan felhantering)

<?php

$orderByIndex = $_GET['sort_by'];

$orderBy = array(
			"title ASC",
			"title DESC",
			"year ASC",
			"year DESC",
			"vote ASC",
			"vote DESC"
		);

?>

<table cellspacing="0" cellpadding="0" style="border: none; width: 100%;">
<tr>

    <td><strong><a href="?sort_by=<?= ($sort_by == 1) ? 0 : 1 ?>">Filmtitel</a></strong></td>
    <td><strong><a href="?sort_by=<?= ($sort_by == 3) ? 2 : 3 ?>">År</a></strong></td>
    <td><strong><a href="?sort_by=<?= ($sort_by == 5) ? 4 : 5 ?>">Betyg</a></strong></td>
</tr>

<?php

require "connect.php";

$S_FILMER = mysql_query("SELECT * FROM filmer ORDER BY $orderBy[$orderByIndex]") or die(mysql_error());
while ($row = mysql_fetch_array($S_FILMER)) {

print '

<tr>

    <td><a href="http://www.imdb.com/title/'.$row['imdb'].'/">'.$row['title'].'</a></td>

    <td>'.$row['year'].'</td>

    <td>'.$row['vote'].'/10</td>

</tr>';

}

?>

</table>
Medlem sedan feb. 20001 861 inlägg
#6

Mycket snitsigt!

Medlem sedan apr. 200312 679 inlägg
#7

Rocket, jag får ett felmeddelande på din kod:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Medlem sedan feb. 2000372 inlägg
#8

Jag sa ju att koden var otestad ;)

Du får ändra den första delen av koden till det här:

$orderBy = array(
            "title ASC",
            "title DESC",
            "year ASC",
            "year DESC",
            "vote ASC",
            "vote DESC"
        );

$orderByIndex = isset($_GET['sort_by']) ? $_GET['sort_by'] : 0;

if ($orderByIndex<0 || $orderByIndex>(count($orderBy)-1)) {
	$orderByIndex = 0;
}
Medlem sedan apr. 200312 679 inlägg
#9

Läckert! Nu funkar det prima.

Medlem sedan apr. 200312 679 inlägg
#10

Kom på en sak till.

Om man till exempel skriver ?sort_by=hej så får man ett väldigt tråkigt felmeddelande. Kan man på något sätt skriva så att om någon pillar i taggarna där uppe så går den till default-värdet? Hoppas det inte innebär en massa krångel. :) :p

Medlem sedan feb. 2000372 inlägg
#11

Jo då, det går också att fixa utan en massa krångel. Ändra if-satsen till:

if (!is_numeric($orderByIndex) || $orderByIndex<0 || $orderByIndex>(count($orderBy)-1)) {

    $orderByIndex = 0;

}
Medlem sedan apr. 200312 679 inlägg
#12

Underbart! :birp

*fira med att köpa kebab* :P

261 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)