【发布时间】:2016-11-16 15:12:50
【问题描述】:
这是我的脚本:
try{
$dbh_conn->beginTransaction();
$user_id = $_POST['iuser_id'];
$token = hash('sha512', bin2hex(openssl_random_pseudo_bytes(16)).$user_id);
$stmt = $dbh_conn->prepare("UPDATE resend_pass SET active = 0 WHERE user_id = ?");
$stmt->execute(array($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,
FROM resend_pass
WHERE user_id = ?
AND date_time > unix_timestamp() - 604800
HAVING num_week > 11 ;");
$stm->execute(array($user_id, $token, $user_id));
// no row inserted (either there is lots of reuqests or duplicate token)
if ( !$stm->rowCount() ) { throw new Exception('something is wrong'); }
$dbh_conn->commit();
/* sending an email contains reset_password_token here */
$_SESSION["TopMSG"] = "<div class='msg_success'>has been sent</div>";
header('location: ../login');
exit;
} catch(Exception $e) {
$dbh_conn->rollBack();
$_SESSION["TopMSG"] = "<div class='msg_success'>$e</div>";
header('location: ../login');
exit;
}
如您所见,commit() 之前有一个 throw。可以吗?实际上,当我运行它时,它不起作用并抛出此错误:
致命错误: 在 C:\xampp\htdocs\myweb\others\login.php:341 堆栈跟踪:#0 C:\xampp\htdocs\myweb\application 中未捕获的异常“异常” \other.php(35): login->resend_password_check() #1 C:\xampp\htdocs\myweb\index.php(150): require_once('C:\xampp\htdocs...') #2 {main } 在 C:\xampp\htdocs\myweb\others\login.php 中抛出
if ( !$stm->rowCount() ) { throw new Exception('something is wrong'); }
我该如何解决?
【问题讨论】:
-
你在使用命名空间吗?似乎您的代码没有找到您的 Exception 类。顺便说一句:在提交之前抛出异常是可以的。 PS.:我知道这不是上下文,但是在代码中退出并不好。让请求流优雅地结束
标签: php mysql pdo transactions throws