Ik sla de datum van mijn nieuwsberichten op als date type in mijn database. Zo kan ik met select where month() de huidige maand eruit filteren, maar ik wil de datum omnoemen....

toen raadde iemand aan hem om te slaan als int van 13 lang, alleen kan ik dan niet meer month() gebruiken. Noem ik bovenstaand date type niet om krijg ik een probleem want dat is net unix... dus wordt het erges in 1970

dit zijn de scripts in kwestie:
1
<?php

//Eerst connecten we met de database
mysql_connect ("localhost","***", "***"); //host, username, password
mysql_select_db("vak429_nl_-_news"); //database

$sql = "SELECT * FROM nieuws WHERE MONTH(datum) = MONTH(NOW()) ORDER BY id DESC";
$res = mysql_query($sql);

// bekijk of er rijen als resultaat zijn
if (mysql_num_rows($res) >= 1)
{
// zet de resultaten in een 'array'
$row = mysql_fetch_array($res);

// url maken zodat laatste bericht geopend wordt //
$url="view_month.php?id=$row[id]";
header ("Location: $url");

}
else
{
echo "Er zijn geen resultaten gevonden";
}
?>



2
<?php
//Database connect //
mysql_connect ("localhost","***", "***");
mysql_select_db("vak429_nl_-_news");

// Maak query om titel en bericht behorend bij de juiste id op te halen//
$query = "SELECT * FROM nieuws WHERE id = '$id'";

// Voer query uit //
$resultaat = mysql_query($query) or die ("query mislukt");


// Maak een loop

while( // zolang er resultaten zijn//
$obj = mysql_fetch_object($resultaat)){

// haal het onderwerp uit de array
$onderwerp = $obj->onderwerp;

// haal het bericht uit de array en haal de//
//overbodige slashes eruit en begin een nieuwe//
// lijn als dit in het bericht ook gebeurd//
$bericht = stripslashes($obj->bericht);
$bericht = nl2br($bericht);

// Definieer een maanden-array
$maand_array = array(
"januari", "februari", "maart", "april",
"mei", "juni", "juli", "augustus", "september",
"oktober", "november", "december");
$datum = date("d ", $row[datum]) . $maand_array[date("m", $row[datum]) - 1] . date(" y", $row[datum]);
?>
<table width="540" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="C31E1E">
<div align="left"> <font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif"><b>
<?php echo"$datum"; ?> - <?php echo"$onderwerp"; ?></b></font>
</div> </td></tr><tr>
<td valign="top" height="43">
<table width="540" border="0" cellspacing="0" cellpadding="3" height="35">
<tr>
<td height="19" valign="top" bgcolor="#CCCCCC">
<div align="left"> <font color="#FF0000" size="1" face="Verdana, Arial, Helvetica, sans-serif">
<?php echo"$bericht"; ?>
</font></div> </td></tr><tr>
<td valign="top" height="8">
<div align="right"></div></td></tr></table></td></tr>
</table>
<br>

<table width="540" border="0" align="center" cellpadding="0" cellspacing="0">
<?

// qry uitvoeren om alles van de huidige maand uit de database te toveren //
$qry = mysql_query("SELECT * FROM nieuws WHERE MONTH(datum) = MONTH(NOW()) ORDER BY id DESC") or die (MySQL_Error());

// zolang er resultaat... //
while ($regel = mysql_fetch_array($qry)){

// $ uit array halen //
$onderwerp = $regel["onderwerp"];
$datum1 = date("d ", $regel[datum]) . $maand_array[date("m", $regel[datum]) - 1] . date(" y", $regel[datum]);
$id = $regel["id"];
?>
<tr>
<td width="166"><div align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif" color="#FF0000"><? PRINT"$datum1";?></font> </div></td>
<td width="374"><div align="left"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><? PRINT"<a href='view_month.php?id=$id'>$onderwerp</a>";?></font></div></td>
</tr>
<? }
?>
</table> <? } ?>


en de weergave wordt hierdoor dus:
01 januari 70
ok ja wist de tag zo ff niet

nouja alleen nog een puzzelstuk hoe ik dus zorg dat als de maand voorbij is dus als het straks oktober is, dat er dan een nieuwe php aangemaakt wordt die alles uit september 2005 pakt, want dit script showt tegen die tijd oktober
Met de query die je nu gebruikt selecteer je alles wat in de huidige maand zit:

<?php
// selecteer huidige maand
"SELECT *
FROM nieuws
WHERE MONTH(datum) = MONTH(NOW())
ORDER BY id DESC"
?>

Dus met de volgende query selecteer je alles wat NIET in de huidige maand zit

<?php
// selecteer alles, behalve huidige maand
"SELECT *
FROM nieuws
WHERE MONTH(datum) != MONTH(NOW())
ORDER BY id DESC"
?>

De resultaten van die query zou je dus naar een archieftabel kunnen verplaatsen.
Jan Koehoorn schreef op 24.09.2005 09:10
Dus met de volgende query selecteer je alles wat NIET in de huidige maand zit

<?php
// selecteer alles, behalve huidige maand
"SELECT *
FROM nieuws
WHERE MONTH(datum) != MONTH(NOW())
ORDER BY id DESC"
?>

De resultaten van die query zou je dus naar een archieftabel kunnen verplaatsen.
kan je dan ook werken met groter/kleiner? vb voor dan volgende maanden en vorige maanden?

//EDIT: hoe moet de datum dan opgeslaan zijn? ( is 0000-00-00 00:00:00 ok?)
Een DATE veld heeft het format yyyy-mm-dd
Een TIME veld heeft het format hh:mm:ss
Een DATETIME veld heeft het format yyyy-mm-dd hh:mm:ss

MONTH retourneert volgens mij een nummer voor de maand, dus je kunt gewoon met groter/kleiner werken.
um, een unix timestamp gaat volgens mij niet in een int, maar heeft meer een bigint nodig zou zeggen van +/- 12 tekens. (Kun je ongeveer tot het jaar 33680 :P)
Let op:

een UNIX timestamp is de waarde die je terugkrijgt van time (). Die is 10 cijfers en past dus makkelijk in een INT veld. Een unsigned int gaat tot en met 4294967295.

Het formaat van een UNIX timestamp is anders dan een veld van het type TIMESTAMP in MySql.

Uit MySql Reference Manual:
In MySQL 4.0 and earlier, TIMESTAMP values are displayed in YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD, or YYMMDD format, depending on whether M is 14 (or missing), 12, 8, or 6, but allows you to assign values to TIMESTAMP columns using either strings or numbers. The M argument affects only how a TIMESTAMP column is displayed, not storage. Its values always are stored using four bytes each. From MySQL 4.0.12, the --new option can be used to make the server behave as in MySQL 4.1.
Kort samengevat: Je hebt in je database een DATETIME staan die je met een andere weergave op het scherm wilt hebben.

Vergeet alsjeblieft die smerige UNIX timestamp, dit levert meer problemen dan oplossingen op. MySQL heeft een heel aantal functies om weergaves voor jou te regelen, dit is meestal een stuk eenvoudiger. Een soortgelijk probleem, inclusief oplossing, vind je op http://www.phpfreakz.nl/forum.php?forum=2&iid=702629
Jan Koehoorn schreef op 24.09.2005 18:00

een UNIX timestamp is de waarde die je terugkrijgt van time (). Die is 10 cijfers en past dus makkelijk in een INT veld. Een unsigned int gaat tot en met 4294967295.


Ik neem altijd een even getal waarin het aantal cijfers aan 9'ens zou passen en dat is twaalf :P, maar k dat ben ik ;)
Jan Koehoorn schreef op 24.09.2005 09:10
Met de query die je nu gebruikt selecteer je alles wat in de huidige maand zit:

<?php
// selecteer huidige maand
"SELECT *
FROM nieuws
WHERE MONTH(datum) = MONTH(NOW())
ORDER BY id DESC"
?>

Dus met de volgende query selecteer je alles wat NIET in de huidige maand zit

<?php
// selecteer alles, behalve huidige maand
"SELECT *
FROM nieuws
WHERE MONTH(datum) != MONTH(NOW())
ORDER BY id DESC"
?>

De resultaten van die query zou je dus naar een archieftabel kunnen verplaatsen.


Klopt, maar ik wil graag een archiefindex met pagina's voor losse maanden. Dus:

Als nieuwe maand aanbreekt, bouw pagina met alles van vorige maand dit jaar, voeg een link toe aan de archiefindex

Reageren