2016-10-20 6 views
1

In meiner Seite Benutzer kann sich mit E-Mail registrieren und abonnieren für Neuigkeiten. Ich lege E-Mail, IP und Zeitstempel in meine Datenbank. Ich möchte sicherstellen, dass eine IP nur 5 E-Mails pro Tag erhalten kann und ich nicht die gleichen E-Mail-Adressen in meiner Datenbank möchte.MySQL Abfrage, Vergleich Datetime

Ich habe es versucht, aber es funktioniert nicht, ich kann so viele, wie ich möchte.

if(isset($_POST["send"])) 
{ 
    $email = test_input($_POST['email']); 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    $query = 'INSERT INTO subscriber (data, ip, email) (SELECT CURRENT_TIMESTAMP, "'.$_SERVER['REMOTE_ADDR'].'", "'.$email.'" FROM dual where NOT EXISTS (Select count(email) as c FROM (
    SELECT email FROM subscriber WHERE ip="'.$_SERVER['REMOTE_ADDR'].'" and DATE(`data`) = CURDATE() group by email) as a having c>5))'; 
    $result = mysqli_query($dbc, $query) or die(mysqli_error($dbc)); 
    $msg="E-mail sent successfully"; 
} else 
{ 
    $msg="Wrong e-mail address"; 
} 

Und um nicht dieselben E-Mails zu schreiben, sollte ich so etwas nach dem Einfügen verwenden?

FROM dual WHERE NOT EXISTS ( SELECT * FROM Teilnehmer WHERE email = "‘ $ E-Mail.. '“)';

Antwort

2

Warum trennen Sie nicht einfach die Abfragen. Erste Prüfung für

SELECT count(id) FROM subscriber 
WHERE ip="'.$_SERVER['REMOTE_ADDR'].'" 
and DATE(`data`) = CURDATE() 

Und wenn das Ergebnis < 5 dann den Einsatz tun. Es wird einfach und lesbar sein.

Der gesamte Code:

if(isset($_POST["send"])){ 

$email = test_input($_POST['email']); 
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    $query = 'SELECT count(id) FROM subscriber 
       WHERE ip="'.$_SERVER['REMOTE_ADDR'].'" 
       and DATE(`data`) = CURDATE()'; 
    $result = mysqli_query($dbc, $query); 
    $count = mysqli_fetch_field($result); 

    if($count < 5) { 
     $query = "SELECT id FROM subscriber 
        WHERE email='".$email."' 
        LIMIT 1"; 
     $result = mysqli_query($dbc, $query); 
     $mailExist = mysqli_num_rows($result); 

     if($mailExist > 0) { 
      $msg="E-mail is already existing in the DB"; 
     } 
     else { 
      $query = "INSERT INTO subscriber (data, ip, email) VALUES (CURDATE(), '".$_SERVER['REMOTE_ADDR']."', '".$email."')"; 
      mysqli_query($dbc, $query); 
      $msg="E-mail sent successfully"; 
     } 
    } 
    else { 
     $msg="5 emails today"; 
    } 
} 
else { 
    $msg="Wrong e-mail address"; 
} 

Es wird gut sein, wenn Sie Indizes auf diesen Feldern in DB setzen. Aber ich rate Ihnen, PDO anstelle von mysqli zu verwenden. Sie können mehr darüber hier lesen http://php.net/manual/en/book.pdo.php

+0

Können Sie schreiben Sie mir bitte alle query:

INSERT INTO subscriber (data, ip, email) SELECT CURRENT_TIMESTAMP, {$_SERVER['REMOTE_ADDR']}, {$email} FROM dual where NOT EXISTS ( Select count(email) as c FROM ( SELECT email FROM subscriber WHERE ip={$_SERVER['REMOTE_ADDR']} and DATE('data') = CURDATE() ) as a having c>=5 ) 

Sie können auch

INSERT INTO subscriber (data, ip, email) SELECT CURRENT_TIMESTAMP, {$_SERVER['REMOTE_ADDR']}, {$email} FROM dual where NOT EXISTS ( Select count(email) as c FROM subscriber WHERE ip={$_SERVER['REMOTE_ADDR']} and DATE('data') = CURDATE() having c>=5 ) 

Oder auf diese Weise anders schreiben? Es ist ein wenig schwierig für mich: D – Alphonse

+0

Überprüfen Sie meine bearbeitete Antwort – krasipenkov

+0

Ja, danke, und eine weitere Sache, die ich brauche, ist nicht die gleichen E-Mails in die Datenbank schreiben ... Überprüfen Sie meine Frage – Alphonse

1

Sie sollten nicht GROUP BY E-Mail, wenn Sie alle E-Mails von der gleichen IP zählen möchten.

So Ihre feste Abfrage wäre:

INSERT INTO subscriber (data, ip, email) 
    SELECT CURRENT_TIMESTAMP, {$_SERVER['REMOTE_ADDR']}, {$email} 
    FROM dual 
    where 5 < (
     Select count(email) as c 
     FROM subscriber 
     WHERE ip={$_SERVER['REMOTE_ADDR']} 
      and DATE(`data`) = CURDATE() 
    )