PHP datum probleem
Ik heb een probleem met onderstaand script. Het betreft een verjaardag script wat ik heb geschreven, echter krijg ik hem niet geheel werkend.
Probleem = Ik heb in het script een verleden en toekomst toegevoegd, zodat je kan zien wie ook 10 dagen geleden jarig was en wie dus dan ook 10 dagen in de toekomst jarig zal zijn. Nu ontstaat het probleem, als het bijvoorbeeld de 25-06-2008 is en 10 dagen verder, het script alleen maand 07 weergeeft en dus de gehele maand 06 weg laat (terwijl die nog 5 dagen bevat). Hoe kan ik dit aanpassen in mijn script? Ik ben niet ver gevorderd in PHP, dus het script zal wat omslachtig zijn, maar werkt "bijna" wel :)
Code (php)
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
44
45
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
44
45
<?php
include 'dbconnect.php';
// Datum in daggetal voor bepalen of iemand vandaag jarig is
$dag = date("d");
// Datum in maandgetal voor bepalen of iemand vandaag jarig is
$maand = date("m");
// Datum 10 dagen in de toekomst
$datumtoekomst = mktime(0, 0, 0, date("m") , date("d")+10, date("Y"));
$dagtoekomstuitkomst = date('d', $datumtoekomst);
$maandtoekomstuitkomst = date('m', $datumtoekomst);
// Datum 10 dagen in het verleden
$datumverleden = mktime(0, 0, 0, date("m") , date("d")-10, date("Y"));
$dagverledenuitkomst = date('d', $datumverleden);
$maandverledenuitkomst = date('m', $datumverleden);
$query = "SELECT naam, geboorte, vestiging, datumindienst, geboortedag, geboortemaand FROM birthday
WHERE geboortedag BETWEEN $dagverledenuitkomst AND $dagtoekomstuitkomst
AND geboortemaand BETWEEN $maandverledenuitkomst AND $maandtoekomstuitkomst
ORDER BY geboortemaand, geboortedag";
$result = mysql_query($query);
while(list($naam,$geboorte,$vestiging,$datumindienst,$geboortedag,$geboortemaand)= mysql_fetch_row($result))
{
if ($geboortedag == $dag && $geboortemaand == $maand) {
echo "<b>$geboorte :: $naam ($vestiging)</b> <img src=\"birthday.gif\"><br>"; }
else {
echo "$geboorte :: $naam ($vestiging)<br><br>"; }
}
// *** controle onderaan de pagina, dit is overbodig ***
echo "$dagverledenuitkomst <br>";
echo "$maandverledenuitkomst <br>";
echo "$dagtoekomstuitkomst <br>";
echo "$maandtoekomstuitkomst <br>";
// *** controle onderaan de pagina, dit is overbodig ***
include 'closedbconnect.php';
?>
include 'dbconnect.php';
// Datum in daggetal voor bepalen of iemand vandaag jarig is
$dag = date("d");
// Datum in maandgetal voor bepalen of iemand vandaag jarig is
$maand = date("m");
// Datum 10 dagen in de toekomst
$datumtoekomst = mktime(0, 0, 0, date("m") , date("d")+10, date("Y"));
$dagtoekomstuitkomst = date('d', $datumtoekomst);
$maandtoekomstuitkomst = date('m', $datumtoekomst);
// Datum 10 dagen in het verleden
$datumverleden = mktime(0, 0, 0, date("m") , date("d")-10, date("Y"));
$dagverledenuitkomst = date('d', $datumverleden);
$maandverledenuitkomst = date('m', $datumverleden);
$query = "SELECT naam, geboorte, vestiging, datumindienst, geboortedag, geboortemaand FROM birthday
WHERE geboortedag BETWEEN $dagverledenuitkomst AND $dagtoekomstuitkomst
AND geboortemaand BETWEEN $maandverledenuitkomst AND $maandtoekomstuitkomst
ORDER BY geboortemaand, geboortedag";
$result = mysql_query($query);
while(list($naam,$geboorte,$vestiging,$datumindienst,$geboortedag,$geboortemaand)= mysql_fetch_row($result))
{
if ($geboortedag == $dag && $geboortemaand == $maand) {
echo "<b>$geboorte :: $naam ($vestiging)</b> <img src=\"birthday.gif\"><br>"; }
else {
echo "$geboorte :: $naam ($vestiging)<br><br>"; }
}
// *** controle onderaan de pagina, dit is overbodig ***
echo "$dagverledenuitkomst <br>";
echo "$maandverledenuitkomst <br>";
echo "$dagtoekomstuitkomst <br>";
echo "$maandtoekomstuitkomst <br>";
// *** controle onderaan de pagina, dit is overbodig ***
include 'closedbconnect.php';
?>
Begin eens met foutafhandeling in te bouwen. In een query hoort data/tekst tussen enkele quotes. Verder haal alle $vars buiten de quotes. Gebruik je wel het juiste datatype in de database? (DATE of DATETIME)
Ik heb in ieder geval de code iets opgeschoond en de quotes veranderd, echter veranderd dit niet het probleem. In de database gebruik ik het datatype "DATE" > 2008-06-17.
Heb nu ook een errorcheck ingezet:
$result = mysql_query($query)
or die(mysql_error());
wat is er in me filter nou niet juist...
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT *
FROM birthday
WHERE (geboortedag = NOW() - 10 DAY
OR geboortedag = NOW()
OR geboortedag = NOW() + 10 DAY)
ORDER BY geboortedag;
FROM birthday
WHERE (geboortedag = NOW() - 10 DAY
OR geboortedag = NOW()
OR geboortedag = NOW() + 10 DAY)
ORDER BY geboortedag;
Je kunt het beter als een DATE opslaan, dat gaat ook makkelijker met het outputten.
Dus:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$query = "SELECT * FROM birthday WHERE (geboorte = NOW() - 10 DAY OR geboorte = NOW() OR geboorte = NOW() + 10 DAY) ORDER BY geboortedag";
?>
$query = "SELECT * FROM birthday WHERE (geboorte = NOW() - 10 DAY OR geboorte = NOW() OR geboorte = NOW() + 10 DAY) ORDER BY geboortedag";
?>
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DAY OR geboorte = NOW() OR geboorte = NOW() + 10 DAY) ORDER BY geboortedag' at line 1
Gewijzigd op 01/01/1970 01:00:00 door Marvin H
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT *
FROM birthday
WHERE (geboorte = CURRENT_DATE - 10 DAY
OR geboorte = CURRENT_DATE
OR geboorte = CURRENT_DATE + 10 DAY)
ORDER BY geboorte;
FROM birthday
WHERE (geboorte = CURRENT_DATE - 10 DAY
OR geboorte = CURRENT_DATE
OR geboorte = CURRENT_DATE + 10 DAY)
ORDER BY geboorte;
En zo?
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DAY OR geboorte = CURRENT_DATE OR geboorte = CURRENT_DATE + 10 DAY) ORDER BY geb' at line 1
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT *
FROM birthday
WHERE (geboorte = NOW() - 10 DAY
OR geboorte = NOW()
OR geboorte = NOW() + 10 DAY)
ORDER BY geboorte;
FROM birthday
WHERE (geboorte = NOW() - 10 DAY
OR geboorte = NOW()
OR geboorte = NOW() + 10 DAY)
ORDER BY geboorte;
Probeer het zo eens? En laat de enters er eens in staan, kijken welke lijn hij in de fout aangeeft.
@Marvin: zoek eens op het forum, er zijn wel vaker queries voorbij gekomen om verjaardagen te bepalen...
ps. De query die je zou kunnen gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
*
FROM
birthday
WHERE
geboorte + INTERVAL (YEAR(NOW()) - YEAR(geboorte)) YEAR
BETWEEN
NOW() - INTERVAL 10 DAY
AND
NOW() + INTERVAL 10 DAY
*
FROM
birthday
WHERE
geboorte + INTERVAL (YEAR(NOW()) - YEAR(geboorte)) YEAR
BETWEEN
NOW() - INTERVAL 10 DAY
AND
NOW() + INTERVAL 10 DAY
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
In mijn database heb ik ook de dag en de maand appart vermeld, namelijk "geboortedag" en "geboortemaand"... ik heb overal de gehele dag lopen zoeken, maar kan niet hetgeen vinden wat ik wil bereiken in mijn script. Eigenlijk is het niet zo moielijk, gewoon alle mensen die binnen 10 dagen geleden en 10 dagen in de toekomst geboren zijn moeten tevoorschijn komen...
hoe doe ik dat?
Jezpur schreef op 17.06.2008 18:09:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DAY OR geboorte = NOW() OR geboorte = NOW() + 10 DAY) ORDER BY geboorte' at line 3
Quote:
Dat is dus niet slim, de geboortedatum sla je gewoon als DATE op in de database, nooit als losse dagen of maanden. n mijn database heb ik ook de dag en de maand appart vermeld, namelijk "geboortedag" en "geboortemaand"...
Zie de edit van mijn vorige post voor de query die je zou kunnen gebruiken. De kolom 'geboorte' is van het type DATE.
ps. Die queries van Jezpur mag je vergeten. Hoe goed het ook bedoeld is, daar klopt niets van...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Blanche schreef op 17.06.2008 18:33:
@Jezpur: de query die je geeft klopt niet. Allereerst vergeet je het gebruik van INTERVAL en daarnaast zal de query ook niet doen wat de TS wenst. In de geboortedatum zit waarschijnlijk ook het jaartal opgeslagen en dus heb je aan een vergelijking met NOW() niet zo heel veel...
@Marvin: zoek eens op het forum, er zijn wel vaker queries voorbij gekomen om verjaardagen te bepalen...
ps. De query die je zou kunnen gebruiken:
@Marvin: zoek eens op het forum, er zijn wel vaker queries voorbij gekomen om verjaardagen te bepalen...
ps. De query die je zou kunnen gebruiken:
Echt helemaal toppie... me verjaardag systeem werkt perfect :)
THANKS!
Graag gedaan ;-)