Beste forumleden,

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:


<?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";
                                   
                                }
                         
                         }


?>

SELECT datumversturen, (datumversturen < NOW() - INTERVAL 1 MONTH) AS meerdanmaand
FROM emails
WHERE klant_id = 123;


meerdanmaand is dan 0 of 1, al naar gelang...
Ivo P op 15/04/2014 13:42:13


SELECT datumversturen, (datumversturen < NOW() - INTERVAL 1 MONTH) AS meerdanmaand
FROM emails
WHERE klant_id = 123;


meerdanmaand is dan 0 of 1, al naar gelang...


Dus ik moet helemaal niet via Php dit vergelijken maar beter via mysql zelf?
>>> 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.


Oke top, ga ik dit is proberen!
mijn query haalt nog steeds alles op, maar dan met een 0 of 1 erbij.

Mogelijk ben je nog beter af als je die vergelijking naar het WHERE-stuk verplaatst
>>> mijn query haalt nog steeds alles op, maar dan met een 0 of 1 erbij.
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

[quote="Ivo P op 15/04/2014 13:42:13"]

SELECT datumversturen, (datumversturen < NOW() - INTERVAL 1 MONTH) AS meerdanmaand
FROM emails
WHERE klant_id = 123;


meerdanmaand is dan 0 of 1, al naar gelang...


Beste Ivo,

Ik heb geprobeerd dit rechtstreeks in mijn query te stoppen maar het is nooit true.


<?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";

                         }
?>

Dus ik moet helemaal niet via Php dit vergelijken maar beter via mysql zelf?
[/quote]



[size=xsmall]Toevoeging op 15/04/2014 14:41:48:[/size]

Excuses als ik de - interval een + maak werkt die prima!
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?



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?



Het werkt nu naar behoren, bedankt! Ik sla de datum van verzonden op zonder toevoegingen.

Reageren