PHP Datum sortering

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een php script, wat het volgende doet:

het kijkt in de table users naar het veld bday(jjjj-mm-dd),
vervolgens wordt de datum nu met de datum over 3 maanden berekend en al wie daar tussen valt, wordt in een blok verjaardagen weergegeven. Tot nog toe MOOI.

Alleen ik wil de weergave wijzigen, deze is nu:

. nicknaam
apr 25th
. nicknaam
may 29th
.nicknaam
may 21th
.nicknaam
may 17th

zoals je ziet, is de dagvolgorde verkeerd. Hoe kan ik deze sorteren, zodat de eerstaankomende dag bovenaan komt.
Ten tweede, kan ik de maandaanduiding niet wijzigen naar Nederlands.

Het script is als volgt:

$Date = Date("m/d/Y");

$Date_Array = explode("/", $Date);

$content = "";

global $prefix, $currentlang;

$eventsresult = mysql_query("SELECT uid, uname FROM users WHERE (MONTH(bday) - MONTH(NOW()) <= 2) AND (MONTH(bday) - MONTH(NOW()) >= 0) ORDER BY MONTH(bday), bday, uname");

$result = mysql_query("SELECT DATE_FORMAT(bday, '%b %D') as formatted_date FROM users WHERE (MONTH(bday) - MONTH(NOW()) <= 2) AND (MONTH(bday) - MONTH(NOW()) >= 0) ORDER BY MONTH(bday), bday, uname");

if (mysql_num_rows($eventsresult) == 0)

{

$content .= "<center><font class=\"content\">\"Geen Verjaardagen\"</font></center>";

}

else
{
$content .= "<center>[img]\"images/blocks/happy_birthday.gif\"[/img]</center><br>";

while(list($uid, $uname, $bday) = mysql_fetch_row($eventsresult))

{

$row = mysql_fetch_array($result);

$content .= "<strong><big>·</big></strong>&nbsp<a href=\"url\">$uname</a><br> $row[formatted_date]<br>";

}

}

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
voor het omzetten van datums naar 'nederlands' kun je eens kijken bij setlocale

Acties:
  • 0 Henk 'm!

  • AcXeller
  • Registratie: Mei 2002
  • Niet online
ORDER BY MONTH(bday), bday, uname

vervangen door

ORDER BY bday, uname :?

Lijkt mij namelijk iets wat je gewoon in je query kan oplossen.

Mijn YouTube kanaal


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 17-09 22:12
Je zou je timestamp ook kunnen omzetten naar een unixtimestamp. Dat kun je PHP er allerlei berekeningen mee laten doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Owkidee... de volgorde is inmiddels opgelost, bleek weer simpeler dan ik dacht. Logisch eigenlijk..... Ben snel geneigd TE moeilijk te denken.

De oplossing: ORDER BY MONTH(bday), DAYOFMONTH(bday)
Ipv: ORDER BY MONTH(bday)

Blijft enkel nog het omzetten naar het nederlands. De output voor de Dateformat wordt als volgt opgesteld (er zit 1 kleine verandering in t.o.v. voorgaand voorbeeld).

code:
1
$result = mysql_query("SELECT DATE_FORMAT(bday, '%W, %b %D') as formatted_date FROM users WHERE (MONTH(bday) - MONTH(NOW()) <= 2) AND (MONTH(bday) - MONTH(NOW()) >= 0) ORDER BY MONTH(bday), DAYOFMONTH(bday), bday, uname");


Ik heb gekeken bij "setlocale", zoals beetle71 aangegeven heeft, maar kom er niet in uit.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PHP:
1
2
3
4
5
6
setlocale (LC_TIME, 'nl_NL.ISO8859-1');
$qry="select UNIX_TIMESTAMP(bday) as datum from users";
$rs=mysql_query($qry);
while ($r=mysql_fetch_array($rs,MYSQL_ASSOC)){
    echo strftime ("%A %e %B %Y", intval($r['datum']));
}


Dit zou moeten werken.
De tweede waarde in de setlocale moet je misschien aanpassen aan je systeem, zie ook evt www.php.net/setlocale (bij de usercomments staan de verschillende mogelijkheden)
Deze die hier ingevuld is werkt op een FreeBSD server.
voor Linux achtigen is het meestal 'nl_NL',
en voor windows meestal 'dutch' maar dat moet je even nazoeken/uitproberen.

edit:

NB, setlocale werkt alleen i.c.m. de strftime() functie en niet met date() !

[ Voor 23% gewijzigd door beetle71 op 25-04-2003 11:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heyz beetle71,,

Thnx for the reply... ut luk nog nie :(

input:
PHP:
1
2
3
$result = mysql_query("SELECT DATE_FORMAT(bday, '%W, %b %D') as formatted_date FROM users WHERE (MONTH(bday) - MONTH(NOW()) <= 2) AND (MONTH(bday) - MONTH(NOW()) >= 0) ORDER BY MONTH(bday), DAYOFMONTH(bday), bday, uname"); 

$row = mysql_fetch_array($result);


Output:
PHP:
1
$content .= "<strong><big>·</big></strong>&nbsp<a href=\"url&u=$uid\">$uname</a><br> $row[formatted_date]<br>";


Ik heb alle mogelijke coderingen uitgeprobeert:
Dutch
NL_nl
en ook jou bovenstaande

helaas, helaas, helaas.....

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
setlocale (LC_TIME, 'nl_NL.ISO8859-1');
$result = mysql_query("
            SELECT 
                 UNIX_TIMESTAMP(bday) as datum 
            FROM users 
            WHERE (MONTH(bday) - MONTH(NOW()) <= 2) AND
                         (MONTH(bday) - MONTH(NOW()) >= 0) 
            ORDER BY MONTH(bday), DAYOFMONTH(bday), bday, uname");  
//..................
//................
$row = mysql_fetch_array($result);
$content .= "<strong><big>·</big></strong>&nbsp
                    <a href=\"url&u=$uid\">$uname</a><br>". 
                   strftime ("%A %e %B %Y", intval($r['datum']))
                   ."<br>";


Dus dit wil niet ??

Wat heb je voor server? specs? Win/linux/freebsd??

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

ORDER BY MONTH(bday), DAYOFMONTH(bday)
Dan hoop ik niet dat je tabel al te vol zit, want dan worden dit soort dingen bizar traag... Waarom je het zo doet blijft mij ook een raadsel trouwens.. Dit doet exact hetzelfde als:

ORDER BY bday

:?

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
code:
1
WHERE bday>=NOW() AND bday<=DATE_ADD(bday, INTERVAL 2 MONTH) ORDER BY bday


Is inderdaad wel een beetje efficienter...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beetle71,

Ik heb je voorgaande specs exact overgenomen.
Ik neem aan dat $r = $row ?
In ieder geval is het nu zo dat m'n returns 0 zijn.
en dat klopt dus niet,,, aangezien er een stuk of 8 gebruikers zijn die in de komende maanden jarig zijn :)

specs: win2k, php 4.3.1, MySQL 3.23.51


Bosmonster:

Wanneer ik puur op bday sorteer, dan vliegen de data alsnog door elkaar heen, wat vrij logisch is. Aangezien diegene die bijvoorbeeld op 16 april 1972 zijn geboren VOOR iemand in de lijst komt die op 5 april 1974 is geboren.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Sorry TheBugz, maar je moet inderdaad je eigen WHERE clause gebruiken..... De mijne klopt niet, De geboortedatum van iemand( en ik neem aan dat je die hebt ingevoerd) is natuurlijk nooit > Now().. 8)7 Jouw where clause klopte dus!!
Wanneer ik puur op bday sorteer, dan vliegen de data alsnog door elkaar heen, wat vrij logisch is. Aangezien diegene die bijvoorbeeld op 16 april 1972 zijn geboren VOOR iemand in de lijst komt die op 5 april 1974 is geboren.
En ook daar heb je weer gelijk...
en dat $r=$row IDD

en dit
PHP:
1
setlocale(LC_ALL, 'dutch');

zou moeten weken voor een windows bak

[ Voor 9% gewijzigd door beetle71 op 25-04-2003 13:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
en nu ???

:'( :'( :'(

de uitkomst blijft keihard in ut engels (zou ut een hekel aan me hebben ??)

Ik heb hier zelfs lokaal de setting al gewijzigd naar het nederlands, inclusief de toevoeging : setlocale
resultaat....... nog steeds geen verandering :(

Is het niet mogelijk om het via een omweg te doen, zoals bijvoorbeeld een Language file ?

Maand:
PHP:
1
2
3
4
5
6
7
8
9
10
function getMonthName($Date) {
        $month = Date("m",$Date);
        if ($month == "01") {
                $monthname = _CALJAN;
        } elseif ($month == "02") {
                $monthname = _CALFEB;
etc..
        }
        return $monthname;
}



Dag:
PHP:
1
2
3
4
5
6
7
8
9
10
function getLongDayName($Date) {
        $month = Date("w",$Date);
        if ($month == "0") {
                $dayname = _CALLONGFIRSTDAY;
        } elseif ($month == "1") {
                $dayname = _CALLONGSECONDDAY;
etc....
        }
        return $dayname;
}



ALS dit mogelijk is, hoe kan ik er dan voor zorgen dat:

$row[formatted_date]

bovenstaande info weergeeft ??

Long shot in the dark dittuh :)

[ Voor 96% gewijzigd door Verwijderd op 25-04-2003 13:30 ]


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
setlocale (LC_all, 'dutch'); 
$content=""; 

$result = mysql_query(" 
            SELECT 
                 UNIX_TIMESTAMP(bday) as datum
 // HIER MOET JE OOK DE ANDERE VELDEN NOG SELECTEREN DIE JE HEBBEN WILT
            FROM users 
            WHERE (MONTH(bday) - MONTH(NOW()) <= 2) AND 
                         (MONTH(bday) - MONTH(NOW()) >= 0) 
            ORDER BY MONTH(bday), DAYOFMONTH(bday), bday, uname") 
               or die(mysql_error());   
while($r = mysql_fetch_array($result,MYSQL_ASSOC)){ 
$content .= "<strong><big>·</big></strong>&nbsp 
                    <a href=\"url&u=$uid\">$uname</a><br>".  
                   strftime ("%A %e %B %Y", intval($r['datum'])) 
                   ."<br>";
}

:?

Maar als het niet blijft lukken kun je ook eens hier naar kijken http://www.codebase.nl/index.php/command/viewcode/id/188

[ Voor 20% gewijzigd door beetle71 op 25-04-2003 13:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ut wil nog nie lukken,,, ik ga kijken of ik het met die array's van codebase voor elkaar kan boxen....

Thnx voor alle hulp in ieder geval!!

Acties:
  • 0 Henk 'm!

  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 10:25
Ik moet soms "Dutch (standard)" gebruiken wil het werken. Probeer dan ook natuurlijk "Nederlands (standaard)"
Pagina: 1