Avatar billede BTEngineer Novice
24. januar 2008 - 10:07 Der er 34 kommentarer og
1 løsning

Udløbsdato?

Hej.

Jeg har lavet et lille event system.
Når man tilføjer et event, så er det muligt at tilføje en "start dato" og en "slutdato" i form af felterne:

startdato: day, month, year
slutdato: endday, endmonth, endyear

Når jeg så skal vise eventene, så har jeg skrevet følgende:

$q = mysql_query("SELECT * FROM events ORDER BY id DESC") or die(mysql_error());

while($s = mysql_fetch_array($q)) {

echo $s[event];

.. Hvordan skal jeg lave det sådan, at den kun viser de events der IKKE er udløbet? Altså hvordan tester jeg om slutdatoen er overskredet slutdatoen? Det kan vel gøres i mysql-stringen?

Som sagt er det disse felterne i databasen jeg har, og det ser således ud:

startdato: 20 2 2008
slutdato: 23 2 2008

Altså 6 forskellige felter.

Tak på forhånd :-)
Avatar billede nielle Nybegynder
24. januar 2008 - 11:06 #1
Datoer bør normalt gemmes i datetime felter i stedet for som tre talfelter. Det plejer at være det mest hensigtsmæssige.

Hvis du vælger at gøre det på den måde kan SQL'en skrives som:

SELECT * FROM events WHERE dato BETWEEN startDato ANS slutDato ORDER BY id DESC

Du kan godt lave det på den måde du er ved at lægge op til, men så bliver dels SQL'en noget mere besværlig og dels performer SQL-kaldet dårligere.
Avatar billede BTEngineer Novice
24. januar 2008 - 12:44 #2
Hvordan vil du så have jeg skal lave det?
Når jeg tilføjer datoerne, så gør jeg det jo i 6 forskellige variabler, skal det kun være to ? Eller mener du bare at jeg skal gemme day, month, year, endday, endmonth, endyear i et felt i databasen som er datetime istedet for varchar?
Avatar billede steen-h Mester
24. januar 2008 - 17:44 #3
Avatar billede nielle Nybegynder
24. januar 2008 - 18:44 #4
De skal i hvertfald slet ikke gemmes som varhar! Hvis du vælger at gemme dem i 6 forskellige felter så skal det være integer felter du bruger. Varchar er beregnet til tekst - ikke til tal.

Jeg anbefaler dog at du gemmer dem som 2 datatime-felter - et til start- og et til slutdatoen.

Når du indsætter en dato i databasen skal du gemem den i formatet yyyy-mm-dd. Dette ser vel nogenlunde sådan her ud:

$sql = "
INSERT INTO events (... , startDato, slutDato)
VALUES (... , '$startDatoAar-$startDatoMaane-$startDatoDag', '$slutDatoAar-$slutDatoMaaned-$slutDatoDag')";

mysql_query($sql) or die(mysql_error());
Avatar billede steen-h Mester
25. januar 2008 - 05:51 #5
Nielle hvorfor vil du ikke bruge timestamp ?
Avatar billede BTEngineer Novice
25. januar 2008 - 16:08 #6
Så ser det således ud i databasen:
startdate: 2008-12-27 00:00:00 enddate: 2008-12-28 00:00:00

Hvordan tester jeg så, om dags dato har overskredet enddate?
Avatar billede nielle Nybegynder
25. januar 2008 - 17:50 #7
Kommandoen:

SELECT * FROM events WHERE GETDATE() BETWEEN startDato AND slutDato

hiver kun dem ud hvor at dags dato (getdate()) ligger imellem start- og slutdato.


Kommandoen:

SELECT * FROM events WHERE GETDATE() > slutDato

hiver alle dem ud hvor slutdatoen er overskredet.
Avatar billede BTEngineer Novice
02. februar 2008 - 13:08 #8
Får følgende fejl:
FUNCTION mindb.GETDATE does not exist
Avatar billede nielle Nybegynder
03. februar 2008 - 09:45 #9
Prøv med CURDATE() i stedet for GETDATE().
Avatar billede BTEngineer Novice
03. februar 2008 - 18:41 #10
Nu viser den ingenting - Siden er helt tom.

Har tre events i databasen:
startdate: 2008-02-17 00:00:00 enddate: 2008-02-18 00:00:00
startdate: 2008-12-27 00:00:00 enddate: 2008-12-28 00:00:00
startdate: 2007-01-29 00:00:00 enddate: 2007-01-30 00:00:00

Den skulle gerne vise den øverste..

Startdate og Enddate er gemt i datatypen 'datetime' ..

Hvad kan der nu være galt?
Avatar billede nielle Nybegynder
03. februar 2008 - 18:43 #11
Har du prøvet at køre SQL'en direkte fra en phpmyadmin?
Avatar billede BTEngineer Novice
03. februar 2008 - 18:49 #12
Hvad mener du ?
Avatar billede nielle Nybegynder
03. februar 2008 - 19:41 #13
Har du ikke en PhpMYyAdmin som du kan bruge til at administrere din MySQL database med?

Hvis du har så kan du afprøve SQL sætninger direkte i denne uden at skulle igennem et lag af PHP-kode først
Avatar billede BTEngineer Novice
04. februar 2008 - 07:38 #14
jo selvfølgelig har jeg det.
det har jeg aldrig benyttet mig af før?
Avatar billede nielle Nybegynder
04. februar 2008 - 17:54 #15
PhpMyAdmin er uvurderlig når du selv skal arbejde med databasen. Uden dette ville du skulle lave små progammer hver gang at du f.eks. ville oprette en ny tabel eller tilføje data.

... og så er den altså god til at afprøve SQL kommandoer før at de bliver pakket ind i en masse kode ... og måske viser sig ikke at gøre det man troede alligevel.

Brug det :^)
Avatar billede nielle Nybegynder
11. februar 2008 - 18:22 #16
Er du kommet vidre med denne her?
Avatar billede BTEngineer Novice
11. februar 2008 - 21:41 #17
Nej, jeg ved ikke hvad jeg skal foretage mig nu?
Det sidste jeg har prøvet er at ændre GETDATE() til CURDATE()
Avatar billede nielle Nybegynder
12. februar 2008 - 06:58 #18
Fil du afprøvet det i PhpMyAdmin?
Avatar billede BTEngineer Novice
12. februar 2008 - 11:40 #19
Nej, forstod det ikke.
Avatar billede BTEngineer Novice
12. februar 2008 - 16:24 #20
Kan man ikke løse det på en anden måde?
Avatar billede nielle Nybegynder
12. februar 2008 - 16:55 #21
Det burde virke. Så lad os nu forsøge med den model indtil at vi er sikker på at jeg tager fejl og det ikke virker. ;^)

Hvis du ikke forstod hvordan PhpMyAdmin virker så må du da fortælle det i stedet for at jeg skal spørge. Det er et uhyre vigtigt værktøj til stort set alt hvad der har med databasen at gøre, så jo før du lære det at kende jo bedre.

1) Start phpMyAdmin, og log på hvis du bliver bedt om det.
2) I venstre side skulle du gerne få en liste over alle dine databaser - formentlig 1 i alt.
3) Klik på databasen.
4) Ude i venstre side burde du nu kunne se de tabeller der er i databasen - du burde kunne se 'events'.
5) Klik på events-tabellen.
6) Oppe i toppen er der nu nogle forskellige menupunkter:

(o) Browse : så kan du se de data der er i tabellen.
(o) Structure : så kan du se hvordan de enkelte felter er defineret. Her kan du også lave om på dette.
(o) SQL : det er her at du kan afprøve SQL kommandoen. Indtast den i det store felt, og tryk så på 'Go' knappen.

Der er flere muligheder end dem, men det er de tre vigtigste.
Avatar billede BTEngineer Novice
12. februar 2008 - 17:20 #22
Ah på den måde :-)

Din SQL-forespørgsel blev udført korrekt (Forepørgsel tog 0.0004 sek)SQL-forespørgsel:SELECT *
FROM EVENTS WHERE CURDATE( )
BETWEEN startdate
AND enddate
ORDER BY id DESC

- Den er gennemført.
Avatar billede nielle Nybegynder
12. februar 2008 - 17:31 #23
Fik du så også de korrekte data/rækker ud?
Avatar billede BTEngineer Novice
12. februar 2008 - 17:48 #24
Ja jeg gjorde det jo med de korrekte rækker 'startdate' og 'enddate' med værdien datetime.
Avatar billede nielle Nybegynder
13. februar 2008 - 06:21 #25
Ok, så SQL-sætningen virker altså som den skal. :^)

Hvad er det så som ikke virker endnu?
Avatar billede BTEngineer Novice
13. februar 2008 - 12:07 #26
Testets her: http://www.intetliv.dk/test/events/index.php


Min index.php fil:
<?
include("../inc/cfg.php");
       
$q = mysql_query("SELECT * FROM events WHERE CURDATE() BETWEEN startdate AND enddate ORDER BY id DESC") or die(mysql_error());
while($s = mysql_fetch_array($q)) {
?>

<a href="index.php?mode=show&id=<? echo $s['id']; ?>"><? echo $s['city']; ?> - <? echo $s['overskrift']; ?></a>
       
<?
}
?>

Og min database 'events' som den ser ud nu (udsnit):
http://www.intetliv.dk/test/events/db.JPG
Avatar billede dkfire Nybegynder
13. februar 2008 - 12:34 #27
Prøv lige denne her kode:

<?php
error_reporting(E_ALL);
include("../inc/cfg.php");
     
$q = mysql_query("SELECT * FROM events WHERE CURDATE() BETWEEN startdate AND enddate ORDER BY id DESC") or die(mysql_error());
while($s = mysql_fetch_array($q)) {
?>

<a href="index.php?mode=show&id=<?php echo $s['id']; ?>"><? echo $s['city']; ?> - <? echo $s['overskrift']; ?></a>
     
<?php
}
?>

Og så lige en anden ting, det kan umuligt være din indexfil du du viser, for på dit link dannes der en tabel hvilket jo intet har med den kode ud viser.
Avatar billede BTEngineer Novice
13. februar 2008 - 22:04 #28
Der skete ikke noget ved at ændre koden.

- Jo, det er indexfilen jeg viser.
Avatar billede dkfire Nybegynder
14. februar 2008 - 14:26 #29
Hvordan kan det så være der er en tabel på den side du linker til og der ikke er noget i koden du viser som danner en tabel ??
Avatar billede BTEngineer Novice
14. februar 2008 - 19:04 #30
fordi jeg kun har vist php'en fra min fil..
Avatar billede nielle Nybegynder
14. februar 2008 - 19:38 #31
Der er da heller ikke umiddelbart nogen af rækkerne fra dit eksempel som skal vises lige nu.
Avatar billede BTEngineer Novice
22. februar 2008 - 10:47 #32
Hvad mener du?
Hvordan får jeg det til at virke ?
Avatar billede nielle Nybegynder
22. februar 2008 - 17:44 #33
Der var ikke nogen af de rækker som du viser i eksemplet i:

http://www.intetliv.dk/test/events/db.JPG

som opfylder at d.d. (dvs. datoen 13/02-2008 den gang og 22/02-2008 her nu idag) skulle ligge mellem start- og slutdatoen. Det skete for en kort periode de. 17/2 indtil 18/2 da din 1. række opfyldte kriterierne, og det vil ske igen til december når den 2. række vil opfylde dem i døgnet fra 27/12 til 28/12.

Funktionen CURDATE() giver altid datoen idag.
Avatar billede BTEngineer Novice
24. februar 2008 - 10:40 #34
Det virker nu - Tak for hjælpen.
Det er mig der har været lidt langsom opfattende :-)

Smid et svar Nielle, så vi kan få lukket tråden.
Avatar billede nielle Nybegynder
24. februar 2008 - 11:01 #35
Svar :^)
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