【发布时间】:2016-07-13 18:41:16
【问题描述】:
这是我的脚本:
try{
$dbh_conn->beginTransaction();
$user_id = $_POST['iuser_id'];
$token = hash('sha512', bin2hex(openssl_random_pseudo_bytes(16)).$user_id);
$stm = $dbh_conn
->prepare("INSERT INTO resend_pass(user_id, token, date_time)
SELECT ?, ?, unix_timestamp()
FROM dual
WHERE NOT EXISTS( SELECT count(*) AS num_week,
COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))),0) as num_day,
COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 hour))),0) as num_hour,
COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 minute))),0) as num_1min
FROM resend_pass
WHERE user_id = ?
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK))
HAVING num_week > 11 OR num_day > 5 OR num_hour > 3 OR num_1min > 0 );");
$stm->execute(array($user_id, $token, $user_id));
// no row inserted (either there is lots of reuqests or duplicate token (this one has very low possibility))
if ( !$stm->rowCount() ) { throw new Exception('something is wrong'); }
$stmt = $dbh_conn->prepare("UPDATE resend_pass SET active = 0 WHERE user_id = ? AND {all rows except the last one}");
$stmt->execute($user_id);
$dbh_conn->commit();
/* sending $token for that email here */
$_SESSION["TopMSG"] = "<div class='msg_success'>
ایمیل با موفقیت ارسال شد
<span>
- جهت انتخاب رمز عبور جدید
</span>
</div>";
header('location: ../login');
exit;
} catch(Exception $e) {
$dbh_conn->rollBack();
$_SESSION["TopMSG"] = "<div class='msg_success'>$e</div>";
header('location: ../login');
exit;
}
请关注这一行:
$stmt = $dbh_conn->prepare("UPDATE resend_pass SET active = 0 WHERE user_id = ? AND {all rows except the last one}");
我如何告诉它设置除了刚才插入的最后一行之外的所有行?
【问题讨论】:
-
该表是否有一个 auto_increment 主键列?
INSERT操作是否总是导致插入一行? -
表格没有“最后”的概念,这里的真正标准是什么?
-
如果您要排除的 ID 是您插入的最后一行的自动增量,您可以在查询中直接使用 MySQL 函数 LAST_INSERT_ID() 例如
AND xxx != LAST_INSERT_ID()。无需使用PHP即可获取。