Avatar billede morten_21 Nybegynder
02. februar 2004 - 14:25 Der er 13 kommentarer og
1 løsning

Dato-regning: Få vist en side afhængig af hvilken dato det er.

Halløj.

Jeg har bakset med at lave en funktion, hvor man får vist en side efter den aktuelle dato.
Mere konkret, så har jeg flere enkelte sider der hver beskriver et show, og så skal man kunne klikke på f.eks. "Næste show", og så få vist det næste show.
Hvert show har en dato, og hvis den aktuelle dato er senere end den pågældende showdato, får man vist den næste.

Jeg har sat en database op med et unikt ID og en dato for hvert show, og omregnet det hele til Epoch via PHP, men jeg kan ikke overskue hvordan jeg kan sammenligne Epoch-resultatet og få noget brugbart ud af det?

På forhånd tak! :)
Avatar billede morten_21 Nybegynder
02. februar 2004 - 20:18 #1
Slet ingen bud?
Avatar billede Slettet bruger
02. februar 2004 - 22:05 #2
Prøv at vise din eksisterende kode. Det er lidt lettere, når man har noget at gå ud fra.
Avatar billede morten_21 Nybegynder
02. februar 2004 - 22:40 #3
Ok, men det er ret begrænset hvad jeg har fundet ud af.. Here it goes:

<code>
<?php

  $dbcnx = @mysql_connect("localhost", "PASS", "USER");
  $select = @mysql_select_db("test");
  $result = mysql_query("SELECT id, dato FROM shows") or die(mysql_error());

  $nu_epoch = date( 'Y-m-d', time() );
  $nu = date( 'Y-m-d', time() );

  //Omskriver akt. dato til Epoch
  $split=explode("-",$nu_epoch);
  $nu_epoch=mktime(0,0,0,$split[1],$split[0],$split[2]);

while ( $row = mysql_fetch_array($result) ) {

    $id = $row["id"];
    $dato2 = $row["dato"];

    $dato2_epoch = $row["dato"];


    //Omregn db tider til Epoch
    $split=explode("-",$dato2_epoch);
    $dato2_epoch=mktime(0,0,0,$split[1],$split[0],$split[2]);


    echo("<tr><td>$id</td>");
    echo("<td>$dato2_epoch</td>");
    echo("<td>$dato2</td>");
  }

echo("</table>");   
echo("Aktuel dato i Epoch: $nu_epoch");
?>
<BR>
Aktuel dato i MySQL: <?php echo("$nu"); ?>

</code>

Der må gerne grines af koden.. - jeg er ikke særlig snu til php :o)
Avatar billede Slettet bruger
02. februar 2004 - 22:59 #4
Jeg har såmænd set meget slemmere kode.

Første skridt på vejen til at få noget rigtigt godt ud af det her, er at skifte til at bruge et rigtigt datofelt i din database. Så kan MySQL nemlig selv lave sortering ud fra dato, og det vil gøre PHP-koden meget simplere.

opret en ny kolonne af typen DATE og kald den nydato
Derefter kører du følgende script, der lige klarer konverteringen.

<?php

$dbcnx = @mysql_connect("localhost", "PASS", "USER");
$select = @mysql_select_db("test");
$result = mysql_query("SELECT id, dato FROM shows") or die(mysql_error());

while ( $row = mysql_fetch_array($result) ) {
  $split=explode("-",$row['dato']);
  $nydato=$split[2] . $split[1] . $split[0];
  mysql_query("UPDATE shows SET nydato='$nydato' WHERE id='{$row['id']}'") or die  (mysql_error());
}

?>
Avatar billede Slettet bruger
02. februar 2004 - 23:08 #5
Du har nu to datofelter. Hvis det ser ud til at nydato indeholder det rigtige hele vejen, kan du slette den gamle kolonne og omdøbe den ny til at hedde dato.

Bagefter kan du i dine SQL-sætninger bruge SELECT UNIX_TIMESTAMP(dato) AS dato, og så vil MySQL selv lave værdien om til noget, som PHP umiddelbart kan arbejde med.

Forresten lavede du lidt mange krumspring for at få din epoch-værdi for tiden lige nu. Det er ikke sværere end bare at sige:

$nu=time();

Den behøver altså ikke blive formateret, splittet op, og genbygget. Den er allerede i det rette format.
Avatar billede morten_21 Nybegynder
03. februar 2004 - 09:16 #6
Ok - det er gjort. Mit gamle datofelt var nu også af typen DATE, men jeg var ikke klar over at man kunne lave det SELECT UNIX.. osv. Det gør det jo lidt nemmere.

Ja, jeg kan godt se at epoch/nu-tiden bliver revet lidt rundt :) Så har jeg lært noget.

Hvad kan jeg så gøre hvis jeg vil sammenligne den aktuelle dato med datoerne i databasen?
Avatar billede henninghabor Nybegynder
03. februar 2004 - 12:37 #7
Jeg kunne forestille mig at du skal lave en query i din database, hvor du sætter en betingelse på, der matcher dags dato og tid:

$result = mysql_query("SELECT id, nydato FROM shows WHERE nydato = 'date('Y-m-d G:H:s')'") or die(mysql_error());

Men da ovenstående kun får fat i de data der matcher både datoen OG tiden, kan jeg forestille mig at du skal gøre følgende:

$result = mysql_query("SELECT id, nydato FROM shows WHERE nydato = 'date('Y-m-d')'") or die(mysql_error());

Om du kan få disse 2 eksempler til at virke med apostrofferne, ved jeg ikke, men det er da et forsøg værd... :o)
Avatar billede henninghabor Nybegynder
03. februar 2004 - 12:46 #8
Ok, prøvede selv lige at lave en query i min database og fandt ud af at du skal fjerne apostrofferne i date('Y-m-d').

Så det skal altså hedde date(Y-m-d).

Hvis du så vil have fat i en fremtidig dato, kan du prøve følgende:

$result = mysql_query("SELECT id, nydato FROM shows WHERE nydato < 'date(Y-m-d)' ORDER BY nydato LIMIT 0,1") or die(mysql_error());
Avatar billede Slettet bruger
03. februar 2004 - 14:33 #9
Hvis du vil hente alt fra idag, kan du bruge:

SELECT id, data FROM shows WHERE TO_DAYS(dato)=TO_DAYS(NOW())

Fra idag og fremover:

SELECT id, data FROM shows WHERE TO_DAYS(dato)>=TO_DAYS(NOW())

TO_DAYS er nødvendig, for når datofeltet sammenlignes med NOW(), bliver den set på som midnat ved starten af den dato, og midnat idag er naturligvis ikke lig med nu.
Avatar billede Slettet bruger
03. februar 2004 - 14:39 #10
OK, det er faktisk smartere at bruge MySQLs egen DATE()-funktion, hvis din MySQL er nyere end 4.1.1. Den bruges dog således ifølge http://www.mysql.com/doc/en/Date_and_time_functions.html

SELECT id, data FROM shows WHERE dato=DATE(NOW())
eller
SELECT id, data FROM shows WHERE dato>=DATE(NOW())
Avatar billede morten_21 Nybegynder
03. februar 2004 - 23:21 #11
Nu har jeg lavet følgende:

$dbcnx = @mysql_connect("localhost", "user", "pass");
$select = @mysql_select_db("test");
$result = mysql_query("SELECT id, dato FROM shows WHERE TO_DAYS(dato)>=TO_DAYS(NOW())") or die(mysql_error());

while ( $row = mysql_fetch_array($result) ) {
$id = $row["id"];
}
include("f$id.html");

men det lader til at den id der bliver returneret er den sidste dato i systemet. Her er databasen:


(1, '2003-09-05');
(2, '2003-10-23');
(3, '2003-11-14');
(4, '2003-11-20');
(5, '2003-12-12');
(6, '2004-01-24');
(7, '2004-01-30');
(8, '2004-02-10');
(9, '2004-03-12');
(10, '2004-03-29');
(11, '2004-04-16');

Når jeg kører den får jeg vist id 11, og ikke id 8 som jeg jo burde, da vi kun har 3/2-04.. nogen forslag til det?
Avatar billede Slettet bruger
03. februar 2004 - 23:30 #12
Det er fordi denne kode cykler igennem alle resultater.

while ( $row = mysql_fetch_array($result) ) {
$id = $row["id"];
}

Ret til:

$row = mysql_fetch_array($result);
$id = $row["id"];

Og hvis du alligevel kun henter et resultat ud, kan du bede MySQL om kun at give den første række:

$result = mysql_query("SELECT id, dato FROM shows WHERE TO_DAYS(dato)>=TO_DAYS(NOW()) ORDER BY dato LIMIT 1") or die(mysql_error());
Avatar billede morten_21 Nybegynder
03. februar 2004 - 23:51 #13
Fantastisk :-)

Jeg takker - Sandbox, du smider bare et svar.
Avatar billede Slettet bruger
04. februar 2004 - 00:53 #14
OK, det kommer her
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