Datetimes vergelijken wilt mij niet lukken
Ik zit al uren te klooien met datetimes maar ik kom er maar niet uit, ik hoop dat iemand mij wilt helpen.
Het volgende wil ik realiseren, een gebruiker verstuurt een e-mail, ik sla nu de verzend datum op als een datetime in het volgende formaat: 2014-04-14 22:44:47. Nu wil ik een aantal check op deze datum uitvoeren zodat bij een volgende verzending er gekeken wordt of er binnen 1 maand al een email verzonden is, zo ja weergeef error.
Daarnaast heb je bepaalde acties naast het emailadres op basis van jouw verzend datum. Na 1 maand moet er namelijk een icoontje komen met opnieuw versturen erbij.
Het doel is dus controleren of er al een maand is verstreken maar het lukt mij van geen kanten:
Het volgende had ik bedacht:
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
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
<?php
function vergelijkDatum($datetime)
{
$start = new DateTime($datetime);
$end = new DateTime(getHuidigeDateTime());
$diff = $start->diff($end);
if ($diff->m >= 1)
{
// langer dan een maand..
return 1;
}
else
{
return 0;
}
}
// Check of uitnodiging binnen 1 maand al is verzonden
$q = "SELECT * FROM emails WHERE klant_id = ".getKlantIdFromKlanten()." AND domein_id = ".getCurrentDomeinId()." AND email = '".$email."'";
$result = $database->query($q);
while ($rows = mysqli_fetch_assoc($result))
{
if($limietBereikt !== 1 && vergelijkDatum($rows['laatst_verzonden'] == 0))
{
$errors[] .= $email." is al uitgenodigd binnen 1 maand";
}
}
?>
function vergelijkDatum($datetime)
{
$start = new DateTime($datetime);
$end = new DateTime(getHuidigeDateTime());
$diff = $start->diff($end);
if ($diff->m >= 1)
{
// langer dan een maand..
return 1;
}
else
{
return 0;
}
}
// Check of uitnodiging binnen 1 maand al is verzonden
$q = "SELECT * FROM emails WHERE klant_id = ".getKlantIdFromKlanten()." AND domein_id = ".getCurrentDomeinId()." AND email = '".$email."'";
$result = $database->query($q);
while ($rows = mysqli_fetch_assoc($result))
{
if($limietBereikt !== 1 && vergelijkDatum($rows['laatst_verzonden'] == 0))
{
$errors[] .= $email." is al uitgenodigd binnen 1 maand";
}
}
?>
Gewijzigd op 15/04/2014 13:45:20 door Furio Scripting
Code (php)
1
2
3
2
3
SELECT datumversturen, (datumversturen < NOW() - INTERVAL 1 MONTH) AS meerdanmaand
FROM emails
WHERE klant_id = 123;
FROM emails
WHERE klant_id = 123;
meerdanmaand is dan 0 of 1, al naar gelang...
Ivo P op 15/04/2014 13:42:13:
Dus ik moet helemaal niet via Php dit vergelijken maar beter via mysql zelf?
MySQL is inderdaad beter. Anders ga je eerst alles ophalen. En dan met PHP nog eens vergelijkingen uitvoeren. MySQL de vergelijking laten doen en dan ophalen wat je nodig hebt is logischer.
Michael - op 15/04/2014 13:46:20:
>>> Dus ik moet helemaal niet via Php dit vergelijken maar beter via mysql zelf?
MySQL is inderdaad beter. Anders ga je eerst alles ophalen. En dan met PHP nog eens vergelijkingen uitvoeren. MySQL de vergelijking laten doen en dan ophalen wat je nodig hebt is logischer.
MySQL is inderdaad beter. Anders ga je eerst alles ophalen. En dan met PHP nog eens vergelijkingen uitvoeren. MySQL de vergelijking laten doen en dan ophalen wat je nodig hebt is logischer.
Oke top, ga ik dit is proberen!
Mogelijk ben je nog beter af als je die vergelijking naar het WHERE-stuk verplaatst
Als je op mijn reactie doelt; ja, maar wel gereed voor gebruik zonder dat PHP nog vergelijkingen moet doen. Dus sowieso efficiënter.
Furio Scripting op 15/04/2014 13:44:31:
Beste Ivo,
Ik heb geprobeerd dit rechtstreeks in mijn query te stoppen maar het is nooit true.
Dus ik moet helemaal niet via Php dit vergelijken maar beter via mysql zelf?
Ivo P op 15/04/2014 13:42:13:
Beste Ivo,
Ik heb geprobeerd dit rechtstreeks in mijn query te stoppen maar het is nooit true.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Check of uitnodiging binnen 1 maand al is verzonden
$q = "SELECT * FROM emails WHERE klant_id = ".getKlantIdFromKlanten()." AND domein_id = ".getCurrentDomeinId()." AND email = '".check_input($email)."' AND (laatst_verzonden < NOW() - INTERVAL 1 MONTH)";
$result = $database->query($q);
while ($rows = mysqli_fetch_assoc($result))
{
echo 'hier kom ik!';
$errors[] .= $email." is al uitgenodigd binnen 1 maand";
}
?>
// Check of uitnodiging binnen 1 maand al is verzonden
$q = "SELECT * FROM emails WHERE klant_id = ".getKlantIdFromKlanten()." AND domein_id = ".getCurrentDomeinId()." AND email = '".check_input($email)."' AND (laatst_verzonden < NOW() - INTERVAL 1 MONTH)";
$result = $database->query($q);
while ($rows = mysqli_fetch_assoc($result))
{
echo 'hier kom ik!';
$errors[] .= $email." is al uitgenodigd binnen 1 maand";
}
?>
Dus ik moet helemaal niet via Php dit vergelijken maar beter via mysql zelf?
Toevoeging op 15/04/2014 14:41:48:
Excuses als ik de - interval een + maak werkt die prima!
Dus als iets over 1 week verzonden "is", dan is het juist?
Wat sla jij op in laatst_verzonden? De datum van verzenden, of de datum van verzenden + 1 maand?
Ivo P op 15/04/2014 14:45:44:
dus als laatst_verzonden kleiner is dan NU + 1 maand?
Dus als iets over 1 week verzonden "is", dan is het juist?
Wat sla jij op in laatst_verzonden? De datum van verzenden, of de datum van verzenden + 1 maand?
Dus als iets over 1 week verzonden "is", dan is het juist?
Wat sla jij op in laatst_verzonden? De datum van verzenden, of de datum van verzenden + 1 maand?
Het werkt nu naar behoren, bedankt! Ik sla de datum van verzonden op zonder toevoegingen.