[PHP/MySQL] nieuwsarchief maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik zit met een vraagje.

Ik heb voor een site een nieuwstabel die vol staat met nieuws, als datumnotering gebruik ik JaarMaandDagUurMinuut. (voorbeeld: 200304231636)

nu moet ik een nieuwsarchief maken, waarbij je eerst een overzicht krijgt als:
januari 2003
februari 2003

etc. zodat je het nieuws uit de maand kunt kiezen. Niet elke maand is er nieuws geplaatst. Nou kan ik natuurlijk om dat overzicht te maken alle datums uit de tabel op gaan halen, maar dit lijkt me aardig slecht voor de performance van de page (vooral als je veel nieuwsberichten heb staan)

wat is de beste manier om zo'n overzichtje te maken? Moet ik een tabel gaan maken met de maanden en jaren erin waarin ik nieuws heb?

Acties:
  • 0 Henk 'm!

Verwijderd

Als je verwacht dat je veel queries op basis van maand en jaar zal maken, dan kan het nuttig zijn om aparte kolommen voor maand en jaar op te nemen, en hier indexen op te zetten.

Bedenk wel dat je redundante data aan het opslaan ben daarmee, en dat je ten alle tijden moet zorgen dat de datum in je datumkolom gelijk loopt met de waarden in de maand en jaar kolom. In MySQL zitten geen triggers (waarmee je dit redelijk veilig had kunnen oplossen), dus zorg dat je je code heel goed opbouwt om problemen te voorkomen.

Edit:
Overigens is het beter om een datum/tijd kolomtype te kiezen dan een eigen formaat te hanteren voor dergellijke waardes.

[ Voor 12% gewijzigd door Verwijderd op 17-05-2003 13:17 ]


Acties:
  • 0 Henk 'm!

  • wolly_a
  • Registratie: September 2002
  • Niet online
Kun je niet via SQL gewoon een bepaald gebied opvragen!? Zoiets als:

$sql = "SELECT * FROM nieuws WHERE datum >= 200301010000 AND datum < 200301310000";

En ook die getallen kun je weer automatisch opbouwen in php.

Misschien ietsje onduidelijk, maar uitleggen ben ik niet zo'n ster in :)

Acties:
  • 0 Henk 'm!

  • wolly_a
  • Registratie: September 2002
  • Niet online
Kijk trouwens ook eens hier: http://www.hotscripts.com...Programs/News_Publishing/ Aantal handige en kant en klare oplossingen :D

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wolly_a schreef op 17 May 2003 @ 13:15:
Kun je niet via SQL gewoon een bepaald gebied opvragen!? Zoiets als:

$sql = "SELECT * FROM nieuws WHERE datum >= 200301010000 AND datum < 200301310000";

En ook die getallen kun je weer automatisch opbouwen in php.

Misschien ietsje onduidelijk, maar uitleggen ben ik niet zo'n ster in :)
dat kan, maar dan krijg je ook maanden zonder nieuws en dit is niet zo netjes, maar ik denk dat ik het toch maar zo op ga lossen, zoveel queries zullen het niet worden denk ik.

Acties:
  • 0 Henk 'm!

  • wolly_a
  • Registratie: September 2002
  • Niet online
Eventuele maanden zonder nieuws zou je weer weg kunnen laten.

$resultaat = mysql_query($sql);

// Aantal rijen
$aantal = mysql_num_rows($resultaat);

En als $aantal nul is, dan laat je die maand gewoon weg :D

Ik heb zelf heel veel gemak gehad van een tutorial die ik vond op phpfreakz. http://www.phpfreakz.nl/artikelen.php?aid=19 Ik weet niet hoe handig je bent met mysql en php?!

Acties:
  • 0 Henk 'm!

Verwijderd

Hm. Ik denk dat je het beste kunt leren om met Timestamps te gaan werken.
Kijk even naar www.php.net/time
Daar kun je een hoop van leren.
Overigens heeft www.php.net/mktime er ook mee te maken.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Om een overzichtje te krijgen van alle maanden waarin nieuws is gepost kun je dit doen:
code:
1
SELECT DISTINCT CONCAT(YEAR(datum),MONTH(datum)) FROM nieuws

moet je daarna alleen nog ff met php het jaar er af halen (altijd de eerste 4 tekens)
of, wat ook kan, als je 'm zonder jaar wil:
code:
1
SELECT MONTH(datum) FROM nieuws GROUP BY CONCAT(YEAR(datum),MONTH(time))

maar group by is trager en lijkt me dat je dat jaar ook wel wil weten

edit
of je doet
code:
1
SELECT DISTINCT CONCAT(YEAR(datum),'-',MONTH(datum)) FROM nieuws

dan kun je 'm daarna in php heel easy op de - exploden

kortom, opties zat :)

[ Voor 19% gewijzigd door marty op 17-05-2003 14:36 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
code:
1
SELECT DISTINCT CONCAT(YEAR(datum),'-',MONTH(datum)) FROM

Mag je dan niet gewoon dit doen als je alleen de maand wilt hebben:?
code:
1
SELECT DISTINCT CONCAT(YEAR(datum),'-',MONTH(datum)), MONTH(datum) AS maand FROM

Moeten we de records verder niet sorteren, je mag er toch niet van uitgaan dat de gegevens in de juiste volgorde uit de database komen?

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
djluc schreef op 17 May 2003 @ 14:51:
code:
1
SELECT DISTINCT CONCAT(YEAR(datum),'-',MONTH(datum)) FROM

Mag je dan niet gewoon dit doen als je alleen de maand wilt hebben:?
code:
1
SELECT DISTINCT CONCAT(YEAR(datum),'-',MONTH(datum)), MONTH(datum) AS maand FROM
Dat mag :)
Maar ik neem aan dat je het jaartal ook wel wil weergeven....., dus dan is zo'n explode best een goeie optie lijkt me.... of je selecteert het jaar er ook nog een keer bij. weet niet wat sneller is.
Moeten we de records verder niet sorteren, je mag er toch niet van uitgaan dat de gegevens in de juiste volgorde uit de database komen?
Ja, niet aan gedacht er bij te zetten (net zo goed als dat je die concat dan ook ff moet aliasen), maar dat kan de TS zelf ook wel bedenken. het ging me meer om het aandragen van een oplossing voor zijn probleem. wel of niet sorteren heeft daar weinig mee te maken

[ Voor 7% gewijzigd door marty op 17-05-2003 15:02 ]


Acties:
  • 0 Henk 'm!

  • T. van Beek
  • Registratie: Januari 2002
  • Laatst online: 13-10-2024

T. van Beek

flickritus

een substr doen en dan alles indelen?

http://flickr.com/photos/itommy/


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

Ik citeer even uit de php manual:
Read further if you are getting dates far away into the future (2033).

If you want to get a Timestamp (20020231164333 format) from a mysql database and format it into a readable output, use this command on your mySQL query,

assuming you have something like

SELECT lastaccesstime FROM user WHERE userid= 'hecky';

change it to

SELECT date_format(lastaccesstime, '%M %e, %Y') FROM user WHERE userid = 'hecky';

this will format the date to a Month, date year.

the % options should be the same as PHP ones, %M = month, %i = minutes, %Y = year , etc.

As with PHP's date() function you customize the format.

eg

'Year is %Y, and month is %M'
=Year is 2002,and month is February

Hope this helped

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Die techniek schijnt bij de grotere query's wel wat vertraging op te leveren maar hier kan dat denk ik wel, testen is the word.
dus dan is zo'n explode best een goeie optie lijkt me....
Waarom zou je dan niet meteen in je query die gegevens splitsen, dat lijkt me dan wat duidelijker...

[ Voor 5% gewijzigd door djluc op 17-05-2003 16:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb nu deze querry:

code:
1
SELECT DISTINCT CONCAT(YEAR(tijd),'-',MONTH(tijd)) AS maand FROM bs_nieuws


als er nieuws wordt geplaatst doe ik als value voor het veld tijd NOW()

maar nu heb ik dus bijvoorbeeld 2003-05-17 16:51:44 in mijn database staan, is er een functie voor in mysql om het om te zetten naar gewoon nederlands formaat (dag-maand-jaar mn-uur)?

edit:

prut, zie nu pas de post hierboven. het werkt! tnx iedereen! querry om de tijd op te halen:

[code]
date_format(tijd, '%m-%d-%Y %H:%i') AS tijd
[/code]

[ Voor 91% gewijzigd door Verwijderd op 17-05-2003 17:10 ]

Pagina: 1