首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有事务时抛出异常

当有事务时抛出异常
EN

Stack Overflow用户
提问于 2016-07-13 21:07:01
回答 1查看 498关注 0票数 0

这是我的剧本:

代码语言:javascript
复制
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;

}

正如您所看到的,在throw之前有一个commit()。这样行吗?实际上,当我运行它时,它将无法工作并抛出以下错误:

致命错误:堆栈跟踪中的未命名异常“exception”:#0 C:\xampp\htdocs\myweb\others\login.php:341登录->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'); }

我怎么才能修好它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-13 21:28:24

php的致命错误是不可捕捉的。

使用pdo时,不要写抛出新异常(‘出了问题’);因为PDO已经有了这个表达式PDOException

用于轴心:

代码语言:javascript
复制
try{
    $dbh_conn->beginTransaction();
    .......
    .......
    $stm->execute(array($user_id, $token, $user_id));
    ......
    $dbh_conn->commit();

}catch(PDOException $e) {
    print_r($e->getMessage());//Show excption message
    $dbh_conn->rollBack();
    $_SESSION["TopMSG"] = "<div class='msg_success'>$e</div>";

    //header('location: ../login');
    exit;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38361718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档