繁体   English   中英

MySQL查询,比较日期时间

[英]MySQL query, comparing datetime

在我的页面中,用户可以注册电子邮件并订阅新闻。 我将电子邮件,IP和时间戳放入我的数据库。 我想确保一个IP每天只能收到5封电子邮件,我不想在我的数据库中使用相同的电子邮件地址。

我尝试了这个,但它不起作用,我可以发布尽可能多的内容。

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

而不是写相同的电子邮件我应该在插入后使用这样的东西?

FROM dual WHERE NOT EXISTS(SELECT * FROM subscriber WHERE email =“'。$ email。'”)';

你为什么不把查询分开呢? 首先检查一下

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

如果结果<5则执行插入操作。 它简单易读。

整个代码:

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

如果您在DB中的这些字段上放置索引将会很好。 但我建议你使用PDO而不是mysqli。 您可以在http://php.net/manual/en/book.pdo.php上阅读更多相关信息

如果要计算来自同一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() 
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM