ordenen op tijd in twee rijen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

SeaCrime

SeaCrime

11/04/2009 17:35:00
Quote Anchor link
Beste PHPers,

Ik ben wat aan het worstelen met het veiling systeem op mijn website. Een speler heeft de kans om een object op de veiling te zetten, waar hij zelf kan bepalen hoeveel uur hij deze erop zet.

Er is dus een rij in de database voor de datum, die middels NOW() wordt ingevoerd en een rij voor het aantal seconden dat het object op de veiling komt te staan. (dus het geposte aantal uren * 3600)

Nu wil ik alle objecten die op de veiling staan ordenen op tijd dat ze aflopen, maar dit lukt me nog niet helemaal. Zie hieronder wat ik al heb:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$rowObjects
= mysql_query("SELECT id FROM veiling");
while($show = mysql_fetch_assoc($rowObjects)) {
$selectObjects = mysql_query("SELECT *,UNIX_TIMESTAMP(datum) AS datum,0 FROM veiling WHERE id='".$show['id']."'");
$objectResult = mysql_fetch_assoc($selectObjects);

// verschil tussen huidige tijd en plaatsingstijd + seconden checken
if($objectResult['tijd'] + $objectResult['seconden'] > time()) { // veiling nog niet afgelopen
// hier wordt de tijd bepaald hoe lang de veiling nog duurt, om deze later te printen

$verschil1 = $objectResult['tijd'] + $objectResult['seconden'] - time() - 3600;
$verschil = date("H:i:s", $verschil1);
}
else{
// veiling afgelopen, script verder niet van belang
}

}

?>


Ik wil dus dat er in de $rowObjects query wordt geordend van korte tijdsduur dat de veiling nog duurt, naar lange tijdsduur, en dat lukt me dus niet...

Ik hoop dat er iemand is die mij in dit zonnige paasweekend kan helpen!

Bij voorbaat dank!
Jonas
 
PHP hulp

PHP hulp

23/11/2024 20:04:56
 
The Force

The Force

11/04/2009 20:07:00
Quote Anchor link
Hey Jonas,

Als je het query resultaat ordent met onderstaande code moet er volgens mij het goede uitkomen.

ORDER BY (TIME_TO_SEC(date)+seconden))

Oftewel: convert datum naar seconden en voeg daarbij de seconden van die de veiling duurt. Het totaal is het eindtijdstip.

Greetz,

Theforce117
 
Frank -

Frank -

11/04/2009 20:12:00
Quote Anchor link
Waarom toch weer rekenen in seconden? Dat doet geen mens.

ORDER BY (datum + INTERVAL 1 HOUR);

En wanneer je er 2 uur van wilt maken, maak je er 2 uur van.

Ik snap echt niet waar die voorliefde voor seconden vandaan komt, het is vaak een bron van bugs omdat je niet eenvoudig kunt zien of de uitkomsten wel goed zijn. Gewoon met uren, dagen, maanden, jaren, etc. rekenen, is veel eenvoudiger. Unix is leuk als besturingssysteem, niet om mee te rekenen.
 
The Force

The Force

11/04/2009 20:19:00
Quote Anchor link
Misschien omdat zijn systeem later ook een veiling van 10 minuten aan moet kunnen en dan is het logischer om seconden te gebruiken. Met uren zou je dan geen int meer kunnen gebruiken. Het is zowieso goed om in de database rekening te houden met mogelijke wijzigingen in de domeinlogica van de website.

Oke, in minuten lijkt mij wel voldoende aangezien niemand ooit een veiling wil van 10 seconden, maar de keuze voor seconden vind ik zo gek nog niet.
Gewijzigd op 01/01/1970 01:00:00 door The Force
 
Frank -

Frank -

11/04/2009 20:21:00
Quote Anchor link
10 MINUTE? Lijkt mij toch niet zo lastig.
 
The Force

The Force

11/04/2009 20:29:00
Quote Anchor link
Volgens mij snap je niet wat hij wilt. Jij gaat er volgens mij van uit dat de tijd die een veiling duurt voor elke veiling even lang is. Dan heeft het overigens ook geen zin om bij elke datum een uur op te tellen en dan te ordenen, maar dat is wat anders.

Hij heeft een kolom waar de tijd die de veiling duurt in staat. Dat doet hij in seconden omdat als je het in uren opgeeft je voor halve uren 0.5 moet invullen. Wat niet kan als het een int datatype is.

Wat overigens wel inderdaad mooier zou zijn is om de volgende code te gebruiken:

ORDER BY (datum + INTERVAL seconden SECOND)
 
Frank -

Frank -

11/04/2009 20:34:00
Quote Anchor link
Theforce117 schreef op 11.04.2009 20:29:
Hij heeft een kolom waar de tijd die de veiling duurt in staat. Dat doet hij in seconden omdat als je het in uren opgeeft je voor halve uren 0.5 moet invullen. Wat niet kan als het een int datatype is.
Daar heb je het datatype INTERVAL voor, precies wat hier nodig is. Wanneer je dan een interval van 10 minuten wilt hebben, vul je 10 minuten in. Wil je een interval van 3 maanden en 8 dagen hebben, vul je '3 MONTHS 8 DAYS' in. Allemaal niet zo moeilijk. Heeft ook als voordeel dat je geen problemen krijgt met schrikkeljaren en schrikkelsecondes, houdt de database allemaal rekening mee.

ORDER BY (datum + kolom_met_interval) ASC
 
The Force

The Force

11/04/2009 20:47:00
Quote Anchor link
Oke dat is inderdaad ideaal. Weer wat geleerd :). Omdat in de eerste query van jou "INTERVAL 1 HOUR" hardcoded stond was ik er van uit gegaan dat je dit niet op die manier uit de database zou kunnen halen.

Thanks.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.