Archief - php/mysql: order by

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Maxus 3D

Legacy Member
Ellow,

Het probleem wat ik heb is hetvolgende:

Op mijn website hou ik een lijst bij met alle dvd's die ik heb, in een sql-table.
Ik gebruik nu het volgende commando
PHP:
$query="SELECT * FROM table ORDER BY title ASC";
om die lijst alfabetisch te rangschikken.
Het probleem is nu dat ik de gebruiker wil laten beslisssen of die lijst met dvd's per TITLE van A-Z of van Z-A gerangschikt wordt, en ook of de TIME van klein naar groot of omgekeerd wordt gerangschikt.

Ik los dit nu op met een enorm grote/slechte methode, ik geef namelijk met die url mee hoe hij gerangschikt is:
index.php?o=title geeft aan dat hij van Z-A gerangschikt is
index.php?o=title2 geeft aan dat hij van A-Z gerangschikt is
index.php?o=time geeft aan dat de tijd van klein -> groot gerangschikt is
index.php?o=time2 geeft aan dat de tijd van groot -> klein gerangschikt is

In mijn code komen dan grote blokken voor om de verschillende queries te maken:
PHP:
if ( $o=="title" )
    $query="SELECT * FROM table ORDER BY title ASC";
else if ( $o=="title2" )
    $query="SELECT * FROM table ORDER BY title DESC";
else if ( $o=="time" )
    $query="SELECT * FROM table ORDER BY time ASC";
else if ( $o=="time2" )
    $query="SELECT * FROM table ORDER BY time DESC";
else
    $query="SELECT * FROM table ORDER BY title ASC";
en deze code om die index.php?o= te veranderen:
PHP:
$titlelink="title2";
$timelink="time2";
if ($o == "title")
	$titlelink = "title2";
else if ($o == "title2")
	$titlelink = "title";
else if ($o == "time") {
	$timelink = "time2";
	$titlelink = "title";
}
else if ($o == "time2") {
	$timelink = "time";
	$titlelink = "title";
}

Kan dit niet om een elegantere manier worden opgelost?

Joriz

Legacy Member
ik zou je $o anders benoemen, gewoon asc of desc er in verwerken, die er uit requesten; is niet volledig veilig, maar daar kun je wel iets rond schrijven...

dan word het gewoon $query = "SELECT * FROM table ORDER BY time" . $order

Maxus 3D

Legacy Member
Zou ik kunnen doen, maar is zoals je zelf zegt niet helemaal veilig.
Er zijn toch genoeg websites waar je een lijst kan sorteren van A-Z of Z-A, hoe doen zij dat?
Er moet toch een (veilige) manier zijn die beter is dan de mijne?

Joriz

Legacy Member
vele doen het zo
je kan gewoon een beveiliging zetten op het wegschrijven naar een database, of je string checken op het aantal karakters..

Zero Grav

Legacy Member
ik denk gewoon een dropdown met als value
SORT BY
TITEL ASC (value="titel|asc")
TITEL DESC value="titel|desc")
...

en dan dmv een een implode die 2 uit mekaar zetten en echo'en in de mysql_query.
veilig normaal..

Joriz

Legacy Member
hoeft daarvoor geen dropdown te zijn, kan gewoon als link... ik zou zo min mogelijk met drop downs proberen werken, ik vind het niet zo mooi, als je het toch meegeeft met de url, dan kan je het even goed doen met twee variabelen...

Fr3aK

Legacy Member
PHP:
if ($_GET['titel'] && $_GET['order']) {
  switch ($_GET['titel']) {
    case titel1 :
      $titel = "titel1";
      break;
    case titel2 :
      $titel = "titel2";
      break;
    default :
      $titel = "titel1";
  }
  switch ($_GET['order']) {
    case asc :
      $order = "ASC";
      break;
    case desc :
      $order = "DESC";
      break;
    default :
      $order = "ASC";
  }
} else {
  $titel = "titel1";
  $order = "ASC";
}

// hier de query met $titel en $order in ge'echo'ed
Is redelijk failsafe denk ik :)

dJeez

Legacy Member
Maxus 3D zei:
Kan dit niet om een elegantere manier worden opgelost?

Uiteraard kan dat, bijvoorbeeld als volgt :
Code:
$ordertypes = array(1 => 'title ASC',
                    2 => 'title DESC',
                    3 => 'time ASC',
                    4 => 'time DESC');

$type = isset($_GET['o']) ? (int)$_GET['o'] : 1;
if ($type < 1 || $type > 4)
{
	$type=1;
}
$sql = "select * from table order by ";
$sql .= $ordertypes[$type];

De rest kan je zelf wel bedenken zeker?

Joriz

Legacy Member
alle, ik zal het hier ook maar doen:

$column = $_REQUEST["column"];
$ordertype = $_REQUEST["ordertype"];

if (($column == "title" || column != "time") && ($ordertype == "ASC" || $ordertype == "DESC")) {
$query = "SELECT * FROM table ORDER BY " . $column . " " . $ordertype;
}

BertG

Legacy Member
Fr3aK zei:
PHP:
if ($_GET['titel'] && $_GET['order']) {
  switch ($_GET['titel']) {
    case titel1 :
      $titel = "titel1";
      break;
    case titel2 :
      $titel = "titel2";
      break;
    default :
      $titel = "titel1";
  }
  switch ($_GET['order']) {
    case asc :
      $order = "ASC";
      break;
    case desc :
      $order = "DESC";
      break;
    default :
      $order = "ASC";
  }
} else {
  $titel = "titel1";
  $order = "ASC";
}

// hier de query met $titel en $order in ge'echo'ed
Is redelijk failsafe denk ik :)

en ietsje teveel code :)

PHP:
if ($_GET['titel'] && $_GET['order']) {
  switch ($_GET['titel']) {
    case titel2 :
      $titel = "titel2";
      break;
    default :
      $titel = "titel1";
  }
  switch ($_GET['order']) {
    case desc :
      $order = "DESC";
      break;
    default :
      $order = "ASC";
  }
} else {
  $titel = "titel1";
  $order = "ASC";
}

// hier de query met $titel en $order in ge'echo'ed

DarkBone

Legacy Member
QUOTES rond strings ! Nondedju :)
En waarom met een case werken als de GET-waarde toch telkens gelijk is aan de case-conditeie. Werk dan met een array die een opsomming geeft van alle mogelijke waarden, komt die waarde erin voor dan geeft ge die mee in de query, zoniet gebruik je een default waarde. Een case wordt zo onnodig lang vind ik.

*edit* ik zie net dat dJeez iets in die trend voorstelde, better read the thread next time :D Anyway, er zijn verschillende mogelijkheden, hangt ook wat van uw smaak af.

Maxus 3D

Legacy Member
killgore zei:
this website can be viewed in each resolution, starting from 800x600 is vele beter :)
Mja, maar als ge het in 1024x768 bekijkt, is het veel overzichtelijker ;)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan