[php/sql]Sorteer op publicatiedatum

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TiSaE
  • Registratie: Juli 2002
  • Laatst online: 15:40
Ik ben bezig met een nieuwssysteem. Het cms gedeelte is al af, nu ben ik bezig met de voorkant. En om ervoor te zorgen dat de publicatiedatum start en publicatiedatum stopt goed en wordt uitgelezen, gecontroleerd. Alleen hier gaat het mis. De controle of een nieuwsitem zichtbaar moet worden gaat niet goed.

Bij het invoeren van een nieuwsitem in het cms systeem wordt een titel, publicatiedatum start en publicatiestop en content ingevoerd.

De code om te controleren of het nieuwsitem gepubliceerd kunnen worden
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
       $startpublicatie = $row->Startdatum;
          $jaarstarten = substr ($startpublicatie, 4, 4);
          $maandstarten = substr ($startpublicatie, 2, 2);
                    $maandstarten = fixlen($maandstarten);
          $dagstarten = substr($startpublicatie, 0, 2);
                    $dagstarten = fixlen($dagstarten);
       $stoppublicatie = $row->Stopdatum;
          $jaarstopen = substr ($stoppublicatie, 4, 4);
          $maandstopen = substr ($stoppublicatie, 2, 2);
                    $maandstopen = fixlen($maandstopen);
          $dagsstopen = substr($stoppublicatie, 0, 2);
                    $dagsstopen = fixlen($dagsstopen);



$dagnu = date("j");
$dagnu = fixlen($dagnu);
$maandnu = date("n");
$maandnu = fixlen($maandnu);
$jaarnu = date("Y");

// Als de jaren gelijk zijn wordt er gekeken naar de maanden
if($jaarnu >= $jaarstarten && $jaarnu <= $jaarstopen)
{    // Als de maanden gelijk zijn wordt er gekeken naar de dagen
    if($maandnu >= $maandstarten && $maandnu <= $maandstopen)
    {
        if($dagnu >= $dagstarten && $dagnu <= $dagsstopen)
        {
            $goed = 1;
        }
    }
}

if($goed == 1)
{
    echo"
    <tr>
     <td height=4px></tr>
    </tr>
    <tr>
      <td><a href=\"index.php?nav=1&item=$id\" class=\"pagelink\">$titel</a> </td>
    </tr>";
}


Alleen hij laat helemaal niks zien. Door mij foutcontrole merk ik dat de fout in de tweede if loop zit dus:
code:
1
  if($maandnu >= $maandstarten && $maandnu <= $maandstopen)


Alleen ik zie het even niet meer..... weet iemand een handiger manier, of een manier om deze manier werkend te krijgen?
Ik kijk me helemaal gek op dit stukje code.... 8)7

Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 10-09 21:59
SQL:
1
2
3
SELECT *
FROM table
WHERE table.startdatum > now() AND table.stopdatum < now();


Ik denk dat je meer in die richting moet zoeken. Alles wat je via sql kan oplossen gaat een stuk sneller dan wanneer je het via php wilt gaan doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Zoals DamadmOO ook al aangeeft kan het simpeler. Het snelst is als je de datum velden in je SQL als int(10) instelt. Een unix timestamp is namelijk maar 10 getallen lang (voorlopig). Een unix timestamp telt de seconden sinds 1 januari 1970 en is dus heel makkelijk om mee te rekenen. De time() functie doet namelijk hetzelfde. Dan hoef je helemaal niet zo moeilijk te rekenen.

"SELECT * FROM table WHERE startdatum < ".time()." and einddatum > ".time();

Een index op je SQL met een int(10) datum veld is ook supersnel. Het is alleen minder leesbaar voor het oog. Maar je kunt ook een datum converteren in MySQL:

"SELECT date_format(from_unixtime(startdatum),'%d-%m-%Y %H:%i:%s') new_date FROM table";

Dit scheelt ook weer PHP.

Maar zoals jij het schreef is heel erg omzichtig en dan maak je het terugkijken ook complex. Na een half jaar weet je niet meer hoe je je datum-check ook alweer had opgebouwd. Terwijl een "datum > time()" heel logisch en compact is.

Ik hoop dat het helpt.

- Unomi -

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

@unomi: Waarom zo lastig doen met int velden met unix timestamps? In SQL heb je gewoon het datum type. Hiermee wordt ne zo snel gerekend en heeft als bijkomend voordeel dat je vervolgens ook nog een berg date en time functies tot je beschikking hebt. Ook op een date veld kun je een index zetten.

Gebruik voor je datatype gewoon het type van de data.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • TiSaE
  • Registratie: Juli 2002
  • Laatst online: 15:40
Hmm, er worden intressante oplossingen aangegeven waar ik nog niet aan gedacht had. Hiervoor mijn dank!

Echter nu ik met deze oplossingen bezig ben merk ik dat je door middel van de sql statement te veranderen al automatisch kunt controleren op publicatiedatum, erg handig. Maar de invoer naar de database toe via het cms. Gaat nu d.m.v keuzevakken 1 t/m 31, 1 t/m 12, 2005 t/m 2020 dit gaat nu wat anders door het door te berekenen naar seconden...

Maargoed ik vroeg mij af of ik de enige was met deze methode van publicatiedatum en zoniet (waar ik vanuit ga) hoe hebben jullie dit dan gedaan.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ik denk dat je een van de weinigen bent (of in ieder geval zou moeten zijn) die uit zijn database alle resultaten haalt om ze vervolgens in de applicatie zelf te gaan filteren. Het hele doel van je database is om je gegevens gestructureerd op te slaan en vervolgens simpel op te vragen.

Wat is trouwens het probleem met de invoer? Je kunt in je insert query gewoon aangeven wat de dag maand en jaar warde van je datum veld moet worden. Daar zijn legio functies voor. In de mysql manual staat een hoofdstuk over date en time functies. Ik neem aan dat je met dat onderdeel erbij makkelijk zelf een leuke oplossing kunt maken.

Dit hoofdstukje dus

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • TiSaE
  • Registratie: Juli 2002
  • Laatst online: 15:40
Hierbij mijn oplossing, die hebben jullie wel verdiend. Ik heb weer nieuwe dingen geleerd van mySQL, hiervoor mijn dank.

Mijn oplossing:
code:
1
SELECT * FROM `nieuws` WHERE ( CURDATE() > `Startdatum`) AND (CURDATE() < `Stopdatum` ) ORDER BY ID DESC LIMIT 4


De oplossing was makkelijker dan ik had gedacht....maarja dat is meestal zo
Pagina: 1