Avatar billede MartinJakobsen Nybegynder
28. januar 2012 - 12:32 Der er 23 kommentarer og
1 løsning

Kommende fødselsdage/begivenheder

Hej!

Jeg er ved at lave et script der viser de kommende 10 fødselsdage i min bruger db. Fødselsdage er angivet som ÅÅÅÅ-MM-DD i databasen, og mit script sorterer dem jo selvfølgelig efter årstal, og ikke efter kommende fødselsdage. Hvordan får jeg det sorteret fra, så den viser kommende fødselsdage, uden at tage højde for årstal?

Jeg vil så gerne have det her til at virke, men jeg er ved at få lange nosser og grå hår :-(


$idag = date("Y-m-d");
$sql = "SELECT * FROM tabelnavn WHERE foedselsdag >= '$idag' ORDER BY foedselsdag ASC LIMIT 10;";
$result = mysql_query($sql);

while($bruger = mysql_fetch_array($result)){
echo $bruger['member_id']." ".$bruger['foedselsdag']."<br />";}
Avatar billede olebole Juniormester
28. januar 2012 - 15:51 #1
<ole>

Bruger du en passende datatype for feltet?

/mvh
</bole>
Avatar billede DeeDawg Nybegynder
28. januar 2012 - 16:52 #2
Du kan jo altid lade PHP sortere det for dig. Ikke testet, men dette burde give dig hvad du ønsker:

<?php
    $idag = date("Y-m-d");
    $sql = "SELECT * FROM tabelnavn WHERE foedselsdag >= '$idag' LIMIT 10";
    $result = mysql_query($sql);
   
    while($bruger = mysql_fetch_assoc($result)){
        $fdage[] = array("user" => $bruger['member_id'], "date" => $bruger['foedselsdag']);
    }
   
    function sort_by_fdag($a, $b){
        $v = array(
            strtotime(preg_replace("#^[0-9]{4}#", "1970", $a['date'])),
            strtotime(preg_replace("#^[0-9]{4}#", "1970", $b['date']))
        );
       
        if($v[0] == $v[1]){ return 0; }
        return ($v[0] < $v[1] ? -1 : 1);
    }
   
    uasort($fdage, "sort_by_fdag");
   
    foreach($fdage as $fdag){
        echo $fdag['user']." ".$fdag['date']."<br />";
    }
?>
Avatar billede olebole Juniormester
28. januar 2012 - 17:03 #3
Det er helt klart en opgave, man bør overlade til databasen. Den gør det laaangt mere effektivt - men det kræver, den ved, hvilken type data den behandler. Er feltet f.eks. sat til varchar, vil data naturligvis ikke blive sorteret som datoer
Avatar billede DeeDawg Nybegynder
28. januar 2012 - 17:05 #4
Er fuldkommen enig, olebole. Ville bare vise at han også har andre muligheder. :)
Avatar billede olebole Juniormester
28. januar 2012 - 17:15 #5
DamnedDawg ... grrrrrr!  *D
Avatar billede MartinJakobsen Nybegynder
28. januar 2012 - 18:37 #6
Tak for hjælpen! I har ret, jeg havde pillet for meget i databasen ;-)

Man skal lade være med at sidde til den lyse morgen og kode, ens logiske sans forsvinder stille og roligt :-D Men tak fordi i reddede mig fra grå hår og lange nosser ;-)
Avatar billede olebole Juniormester
28. januar 2012 - 18:47 #7
Hmmm ... hvis de bliver lange, bliver der jo længere mellem de grå hår - og så er det vel ikke så slemt  :D

Pointene må vist gå til DeeDawg  *o)
Avatar billede MartinJakobsen Nybegynder
28. januar 2012 - 18:53 #8
Og bedst som jeg troede at alt var løst får jeg en ny fejl :( Den viser kun datoer som er i fremtiden, og ikke i fortiden. Se, den er ikke god :( Brugte php-scriptet
Avatar billede DeeDawg Nybegynder
28. januar 2012 - 19:51 #9
Datoer i fortiden? Lol what.
Avatar billede olebole Juniormester
28. januar 2012 - 19:55 #10
Hvorfor ikke bare skifte typen på feltet til DATE? Så kan MySQL sortere for dig med ORDER BY - og meget hurtigere end noget PHP-script kan
Avatar billede olebole Juniormester
28. januar 2012 - 19:56 #11
Ja, det hænger ikke rigtig sammen med "Kommende fødselsdage/begivenheder"  =)
Avatar billede olebole Juniormester
28. januar 2012 - 20:01 #12
Undskyld, glem indlægget #10! Det er mig, der vrøvler. MySQL vil selvfølgelig stadig sortere efter dato (= år først)!

Men både DeeDawg og jeg har vist knækket undertråden her. 'Kommende' og 'i fortiden' må du nok forklare nærmere
Avatar billede olebole Juniormester
28. januar 2012 - 20:02 #13
- og det må du altså gerne forklare i allernærmeste fortid  =)
Avatar billede MartinJakobsen Nybegynder
28. januar 2012 - 20:41 #14
Jamen jeg skal bare have noget søvn tror jeg :-D

Men med fortid/fremtid mener jeg selvfølgelig årstal. Mente bare at den stadig sorterer efter årstal, og at det jo var noget dillerdaller...
Avatar billede olebole Juniormester
28. januar 2012 - 20:53 #15
Forudsat, foedselsdag er af typen DATE, kan du vel bare skrive:

$sql = "SELECT * FROM tabelnavn WHERE foedselsdag >= CURDATE() ORDER BY foedselsdag ASC LIMIT 10;";
$result = mysql_query($sql);
Avatar billede DeeDawg Nybegynder
28. januar 2012 - 22:04 #16
"Mente bare at den stadig sorterer efter årstal"

- jeg vil gerne tillade mig at slå tvivl om den påstand. Det script jeg gav dig, omskriver årstallet til 1970 (der selvfølgelig kunne være et andet, men det er passende), inden den sammenligner, hvilket gør at den eneste forskel der kan være, er måned og dag. Derfor er det umuligt, at det bliver sorteret efter årstal.

Har også lige testet det af, og det fungerer som det skal. :)
Avatar billede olebole Juniormester
28. januar 2012 - 23:17 #17
$sql = "SELECT * FROM tabelnavn WHERE DAYOFYEAR(foedselsdag) >= DAYOFYEAR(NOW()) ORDER BY DAYOFYEAR(foedselsdag) ASC LIMIT 10;";
$result = mysql_query($sql);

- så skulle den vist gerne være der  =)
Avatar billede showsource Seniormester
29. januar 2012 - 11:00 #18
hvad nu hvis det f.eks. er den 31 dec. ?
Avatar billede showsource Seniormester
29. januar 2012 - 11:01 #19
øhh, altså datoen hvor script skal hente de næste fø'sdage
Avatar billede olebole Juniormester
29. januar 2012 - 16:03 #20
Så henter man bare resten, hvor DAYOFYEAR(foedselsdag) >= 1. En komplet funktion kunne se sådan ud:

function getBirthDays($maxDates=10) {
    $aRet = array();
    $sql = "SELECT * FROM tabelnavn WHERE DAYOFYEAR(foedselsdag) >= DAYOFYEAR(NOW()) ORDER BY DAYOFYEAR(foedselsdag) ASC LIMIT ".$maxDates;
    $result = mysql_query($sql);
    while ($row=mysql_fetch_assoc($result)) {
        $aRet[] = '<div>'.$row['navn'].': <span>'.$row['foedselsdag'].'</span></div>';
    }
    $numDates = count($aRet);
    if ($numDates<$maxDates) {
        $sql = "SELECT * FROM tabelnavn WHERE DAYOFYEAR(foedselsdag) >= 1 ORDER BY DAYOFYEAR(foedselsdag) ASC LIMIT ".($maxDates-$numDates);
        $result = mysql_query($sql);
        while ($row=mysql_fetch_assoc($result)) {
            $aRet[] = '<div>'.$row['navn'].': <span>'.$row['foedselsdag'].'</span></div>';
        }
    }
    return implode('', $aRet);
}

- og nede i HTML'en skriver man så:

<div class="next-birthdays">
<?php echo getBirthDays() ?>
</div>
Avatar billede olebole Juniormester
29. januar 2012 - 16:18 #21
- og SQL nummer to kunne vel også se sådan ud:

$sql = "SELECT * FROM tabelnavn ORDER BY DAYOFYEAR(foedselsdag) ASC LIMIT ".($maxDates-$numDates);
Avatar billede MartinJakobsen Nybegynder
07. marts 2012 - 09:44 #22
Mange tak for hjælpen, smid et svar, så lukker jeg tråden :-)
Avatar billede olebole Juniormester
07. marts 2012 - 10:18 #23
Ellers tak, jeg samler ikke point. Spørg evt. andre i tråden, som du mener, har bidraget til en løsning. Ellers lægger du selv et svar og accepterer det, så tråden lukkes  =)
Avatar billede MartinJakobsen Nybegynder
11. juni 2012 - 00:24 #24
Lukket og takker for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester