查询是否在5分钟内检查条目是否存在

时间:2015-05-25 14:24:29

标签: mysql

我无法让此查询正常工作。 当我提交表单时,应该检查并查看电子邮件地址是否已在5分钟内提交到表中。

如果有,则需要跳过写入该表的if语句。

$db_check = mysql_query("

   SELECT Send_Status, User_Email, Usage_Date_Time 
   FROM Email_Blast 
   WHERE (Send_Status = '0' OR Send_Status = '1')
   AND (Usage_Date_Time  >= '$h_date_time' - INTERVAL 5 MINUTE)
   AND (User_Email = '$h_user_email')

");

if (mysql_num_rows($db_check) == 0) {}

然而,它不会按照它的设置方式写任何东西。

我尝试使用(mysql_num_rows($db_check) > 0);但无论如何它都会继续写作。

+-------------+---------------+---------------------+---------------------+
| Send_Status | Member_Status | User_Email          | Usage_Date_Time     |
+-------------+---------------+---------------------+---------------------+
| 0           | 0             | user@domain.tld     | 2015-05-25 16:45:55 |
| 0           | 0             | name@domain.tld     | 2015-05-25 16:44:42 |
| 0           | 1             | jeff@domain.tld     | 2015-05-25 16:16:34 |
| 0           | 1             | john@gmail.com      | 2015-05-25 16:15:09 |
| 0           | 0             | peter@hotmail.com   | 2015-05-25 16:13:04 |
| 0           | 1             | server@domain.tld   | 2015-05-25 16:11:48 |
+-------------+---------------+---------------------+---------------------+
  

我使用$h_date_time = date('y-m-d H:i:s', time());来匹配数据库中条目的确切时区。

我做错了吗?

3 个答案:

答案 0 :(得分:1)

考虑以下内容......

posX db 0        ; dl = posX  <--- swapped register names
posY db 0        ; dh = posY

几分钟后......

DROP TABLE IF EXISTS email_blast;

CREATE TABLE email_blast
(Send_Status TINYINT NOT NULL DEFAULT 0
,Member_Status TINYINT NOT NULL DEFAULT 0
,User_Email VARCHAR(30) NOT NULL
,Usage_Date_Time DATETIME NOT NULL
,PRIMARY KEY(user_email,usage_date_time)
);

INSERT INTO email_blast VALUES
(0,0,'user@domain.tld','2015-05-25 16:45:55'),
(0,0,'name@domain.tld','2015-05-25 16:44:42'),
(0,1,'jeff@domain.tld','2015-05-25 16:16:34'),
(0,1,'john@gmail.com','2015-05-25 16:15:09'),
(0,0,'peter@hotmail.com','2015-05-25 16:13:04'),
(0,1,'server@domain.tld','2015-05-25 16:11:48');

SELECT * FROM email_blast;
+-------------+---------------+-------------------+---------------------+
| Send_Status | Member_Status | User_Email        | Usage_Date_Time     |
+-------------+---------------+-------------------+---------------------+
|           0 |             1 | jeff@domain.tld   | 2015-05-25 16:16:34 |
|           0 |             1 | john@gmail.com    | 2015-05-25 16:15:09 |
|           0 |             0 | name@domain.tld   | 2015-05-25 16:44:42 |
|           0 |             0 | peter@hotmail.com | 2015-05-25 16:13:04 |
|           0 |             1 | server@domain.tld | 2015-05-25 16:11:48 |
|           0 |             0 | user@domain.tld   | 2015-05-25 16:45:55 |
+-------------+---------------+-------------------+---------------------+

SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2015-05-25 16:42:03 |
+---------------------+

INSERT INTO email_blast 
(Send_Status
,member_status
,user_email
,usage_date_time
)
SELECT 0
     , 1
     , 'user@domain.tld'
     , NOW() 
  FROM email_blast x 
  LEFT JOIN email_blast y 
    ON y.user_email = 'user@domain.tld' 
   AND y.send_status IN (0,1)
   AND y.usage_date_time > NOW() - INTERVAL 5 MINUTE 
 WHERE y.user_email IS NULL 
 LIMIT 1;
Query OK, 0 rows affected (0.01 sec)

SELECT * FROM email_blast;
+-------------+---------------+-------------------+---------------------+
| Send_Status | Member_Status | User_Email        | Usage_Date_Time     |
+-------------+---------------+-------------------+---------------------+
|           0 |             1 | jeff@domain.tld   | 2015-05-25 16:16:34 |
|           0 |             1 | john@gmail.com    | 2015-05-25 16:15:09 |
|           0 |             0 | name@domain.tld   | 2015-05-25 16:44:42 |
|           0 |             0 | peter@hotmail.com | 2015-05-25 16:13:04 |
|           0 |             1 | server@domain.tld | 2015-05-25 16:11:48 |
|           0 |             0 | user@domain.tld   | 2015-05-25 16:45:55 |
+-------------+---------------+-------------------+---------------------+
6 rows in set (0.00 sec)

答案 1 :(得分:0)

$db_check = mysql_query("

SELECT `Send_Status`, `User_Email`, `Usage_Date_Time` 
FROM `Email_Blast` 
WHERE (`Send_Status` = '0' OR `Send_Status` = '1')
AND (`Usage_Date_Time`  >= DATE_SUB(NOW(), INTERVAL 5 MINUTE))
AND (`User_Email` = '$h_user_email')

");

if (mysql_num_rows($db_check) == 0) {}

您也可以将NOW()替换为日期变量。

仅仅是一个FYI,mysql_ *函数现已被弃用。请考虑使用Mysqli_ *或PDO来使用预准备语句。

如果上述代码有效,请告诉我。

答案 2 :(得分:0)

为了调试它,输出您提交给数据库的实际SQL文本。分两个步骤完成。将SQL文本动态准备为单个字符串变量的第一步,以及将其提交到数据库的第二步。在这两个步骤之间,echovardump包含SQL语句的字符串,以便您可以查看提交给数据库的内容,并将其带到另一个客户端进行测试。

$sql = " SELECT ... " . $some_variable . " ... ";
echo "SQL=" . $sql;   //for debugging

我们怀疑您提交给数据库的SQL语句并没有按照您的想法进行操作。从显示的代码中,我们没有线索变量$h_date_time包含的内容。

据我们所知,它可能包含以下内容:

$h_date_time = "1999-01-01' OR NOW() > '1999-01-01"; 

或者

$h_date_time = "0"; 

如果没有人将实际的 SQL语句提交到数据库中,那么在使用SQL语句时是否有人会调试问题?

如果必须在SQL语句中提供值,则更好的模式是将预备语句绑定占位符一起使用。如果您在实际SQL文本中提供了可能不安全的值(而不是通过绑定占位符),则必须正确转义这些值(例如mysqli_real_escape_string。)