Avatar billede phpbegynder2004 Nybegynder
17. november 2005 - 18:32 Der er 16 kommentarer og
1 løsning

Sortering af MySQL resultat

Hej,

Jeg har et script der ser på en fødselsdagsdato (F.eks. 24-12-1983) og udskriver hvor mange dage der er til fødselsdagen og hvor gammel personen bliver. (F.eks.: Peter bliver 14 år om 180 dage)

Tabellen med oplysningerne hedder users og fødselsdagen er delt op således:
fosdag | fosmaaned | fosaar

Scriptet fungerer fint, men jeg kunne godt tænke mig, at resultatet blev sorteret, så den person der har fødselsdag tættest på, står først. F.eks.:
Peter bliver 14 år om 180 dage
Helen fylder 35 år om 200 dage
Niels fylder 20 år om 250 dage

Selve fødseldags funktionen:

function birthDay($day,$month,$year){
    $todayArr = getdate();
    $today  = mktime(0,0,0,$todayArr["mon"],$todayArr["mday"],$todayArr["year"]);
    $future  = mktime(0,0,0,$month,$day);
    $birth  = mktime(0,0,0,$month,$day,$year);

    if($today > $future)    {
        $futureYear = date("Y", $future);
        $futureYear++;
        $future  = mktime(0,0,0,$month,$day,$futureYear);
        $age = date("Y", $today) - $year + 1;
    }    else    {
        $age = date("Y", $today) - $year;
    }
   
    $secLeft = $future - $today;
    $secDay = 24 * 60 * 60;
    $daysLeft = floor($secLeft/$secDay);
    if ($daysLeft > 1)
        $VAR= " fylder " . $age . " år om  " . $daysLeft . " dage";
    else if ($daysLeft == 1)
        $VAR= " fylder " . $age . " år <b>imorgen</b>";
    else if ($today == $future)
        $VAR= " fylder " . $age . " år <b>idag!</b>";
    else
        $VAR=" Passed";
RETURN $VAR;
}


Og kode der afvikler funktionen:

$bdays=mysql_query("SELECT * FROM users");
while($row=mysql_fetch_assoc($bdays)){
echo $row[nick].birthDay($row[fosdag],$row[fosmaaned],$row[fosaar]);
echo"<br>";
}
Avatar billede nizo Nybegynder
17. november 2005 - 18:50 #1
lav
$bdays=mysql_query("SELECT * FROM users");

om til
$bdays=mysql_query("SELECT * FROM users ORDER BY '$VAR'");
(eller)
$bdays=mysql_query("SELECT * FROM users ORDER BY {$VAR}");
Avatar billede jakobdo Ekspert
17. november 2005 - 18:50 #2
Det kan du ikke lave via en sql, du skal smide dit resultat i et array.
Og du for at gøre det, skal du rette din funktion, da den "bare" returnere en streng.

Men noget i denne stil:
array(navn, alder, dage_tilbage);
Så kan du lave en sort på dage_tilbage.
Avatar billede nizo Nybegynder
17. november 2005 - 19:04 #3
jakobdo: Jeg var ogsaa lidt i tvivl om man nu kunne :o) Tak fordi du rettede min "fejl"
Avatar billede wakko Nybegynder
17. november 2005 - 22:14 #4
$days_left = $row['days_left'];
$bdays=mysql_query("SELECT * FROM users ORDER BY '".$days_left."'");
Avatar billede phpbegynder2004 Nybegynder
18. november 2005 - 20:31 #5
Hej igen og tak for jeres foreslag!
Jeg har prøvet at lave noget array-sjov. Det virker fint nok på min egen computer, men når jeg uploader det, bliver sorteringen blandet rundt og virker ikke. Det er sikkert noget emd at jeg sorterer alfabetisk, men ved ikke hvordan jeg ændre dette til numerisk:

$bdays=mysql_query("SELECT * FROM users)or DIE(mysql_error());
while($row=mysql_fetch_assoc($bdays)){
if(birthDay($row[fosdag],$row[fosmaaned],$row[fosaar])!="Fejl!"){
$fruits[$row[nick]] = birthDay($row[fosdag],$row[fosmaaned],$row[fosaar]);
}
}

asort($fruits);
foreach ($fruits as $key => $val) {
  echo "$key $val\n<br>";
}

Kan I hjælpe?
Avatar billede wakko Nybegynder
18. november 2005 - 20:36 #6
Har du prøvet det jeg skrev ? Virkede for mig
Avatar billede phpbegynder2004 Nybegynder
18. november 2005 - 20:37 #7
Hvis det er en hjælp, kan jeg oplyse om, at $row[nick] kan være f.eks. "Peter"
Og birthDay($row[fosdag],$row[fosmaaned],$row[fosaar]) kan være f.eks "fylder 14 år om 180 dage"

Derfor:
echo "$key $val\n<br>"; //Peter fylder 14 år om 180 dage
Avatar billede phpbegynder2004 Nybegynder
18. november 2005 - 20:38 #8
Men hvordan finder jeg ud af, hvor mange dage der er tilbage? Har ikke nogen "days_left"-række.
Avatar billede jakobdo Ekspert
18. november 2005 - 21:17 #9
Ret din funktion birthday, så den returnere et array, og ikke "bare" en streng.
Avatar billede phpbegynder2004 Nybegynder
18. november 2005 - 22:21 #10
Hvis jeg retter birthday funktionen så:
        $VAR= " fylder " . $age . " år om  " . $daysLeft . " dage";

bliver til:
        $VAR= array("fylder " . $age . " år om  " . $daysLeft . " dage");


Udskriver den blot:
Peter Array

Jeg går ud fra jeg ahr gjort noget forkert...
Avatar billede jakobdo Ekspert
21. november 2005 - 18:18 #11
Du kunne gøre sådan her:
$VAR= array("year" =>$age,"days"=>$daysLeft);

så vil $VAR indeholde
year = hvad fylder personen af år næste gang?
days = hvor mange dage er der til.
Så kan du sortere array'et efter days.
Avatar billede phpbegynder2004 Nybegynder
21. november 2005 - 22:14 #12
Okay tak, men kan stadig ikke finde ud af det?
Hvordan sorterer jeg efter $daysleft?
Har siddet og tumlet med det to timer nu :(
Ved heller ikke hvilket sort-funktion jeg skal bruge. Har prøvet php.net

Funktionen:
    if ($daysLeft > 1)
        $VAR= array("year" =>$age,"days"=>$daysLeft);
    else if ($daysLeft == 1)
        $VAR= "fylder " . $age . " år <b>imorgen</b>";
    else if ($today == $future)
        $VAR= "fylder " . $age . " år <b>idag!</b>";
    else
        $VAR="Fejl!";
RETURN $VAR;


Arrayet:
$bdays=mysql_query("SELECT * FROM users WHERE gruppe='$gruppe' AND fosmaaned!=''")or DIE(mysql_error());
while($row=mysql_fetch_assoc($bdays)){
if(birthDay($row[fosdag],$row[fosmaaned],$row[fosaar])!="Fejl!"){
$fruits[$row[nick]] = birthDay($row[fosdag],$row[fosmaaned],$row[fosaar]);
}
}
asort($fruits);
foreach ($fruits as $key => $daysLeft) {
  echo "$key har fødselsdag om <b>$daysLeft</b> dage\n<br>";
}
Avatar billede jakobdo Ekspert
22. november 2005 - 07:52 #13
Du kunne lave et array uden for din birthday funktion:
$mitArray = array();

Efter du har kaldt funktionen laver du:
$mitArray[] = birthDay(....);

Prøv så lige at lave et dump af $mitArray() efter alle data er indlæst.

echo "<pre>";
print_r($mitArray);
echo "</pre>";
Avatar billede phpbegynder2004 Nybegynder
22. december 2005 - 12:27 #14
Langt om længe virker det. Tak for hjælpen (og tålmodigheden!)
Avatar billede phpbegynder2004 Nybegynder
22. december 2005 - 12:27 #15
... læg et svar ;)
Avatar billede jakobdo Ekspert
22. december 2005 - 18:09 #16
svar...
Avatar billede jakobdo Ekspert
23. december 2005 - 09:52 #17
Takker for point!
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