2016-10-20 10 views
1

私のページで、ユーザは電子メールで登録し、ニュースを購読することができます。私は電子メール、IPとタイムスタンプを自分のデータベースに入れています。私は1つのIPが1日に5つの電子メールを得ることができることを確かめたいと私は私のデータベースの同じ電子メールアドレスがほしいと思わない。MySQLクエリ、datetimeを比較

私はこれを試しましたが、うまくいかず、私が望むだけ多く投稿できます。

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

同じメールを書きません。挿入後にこのようなものを使用する必要がありますか? EXISTS、NOTデュアル FROM

'(メール=加入者 FROM SELECT *を "」。$メール。」');

答えて

2

なぜクエリを分割しないのですか。

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

ため まずチェックし、結果が< 5であれば、その後の挿入を行います。シンプルで読みやすいでしょう。

コード全体:あなたはDBで、このフィールドにインデックスをつけた場合

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

は、それが良いだろう。 しかし、私はあなたにmysqliの代わりにPDOを使うことを勧めます。あなたはそれについてもっと読むことができますhttp://php.net/manual/en/book.pdo.php

+0

は、あなたは私のすべてのクエリを記述してくださいことはできますか? D – Alphonse

+0

私の編集した回答を確認してください – krasipenkov

+0

はい、ありがとう、もう1つ必要なことは、同じメールをデータベースに書き込まないことです...編集した質問を確認してください – Alphonse

1

同じIPからのすべての電子メールを数えたい場合は、電子メールでGROUP BYしないでください。

だからあなたの固定されたクエリは次のようになります。

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 
    ) 

あなたはまた、別の方法

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 
    ) 

それとも、このように書くことができます。

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() 
    )