【问题标题】:PDO stop execution of transaction on duplicate PKPDO 停止在重复 PK 上执行事务
【发布时间】:2013-05-18 17:28:14
【问题描述】:

我正在将数据插入到这样的表中:

$queryUpdatePosts = "UPDATE posts SET likes = likes + 1 WHERE id = $id";
error_log('user: '.$_SESSION['userid'].' post '.$id);
$userId = $_SESSION['userid'];
$queryInsertUserLike = "INSERT INTO likes (user_id, post_id) VALUES ($userId, $id)";
try {
    $db -> beginTransaction();
    $statement1 = $db -> prepare($queryInsertUserLike);
    $statement1 -> execute();
    $statement2 = $db -> prepare($queryUpdatePosts);
    $statement2 -> execute();
    $row  = $statement -> fetch();
    $db -> commit();
} catch (Exception $e) {
    $db -> rollback();
}

在“LIKES”表中,user_id 和 post_id 被定义为主键,像这样

ALTER TABLE likes
ADD PRIMARY KEY (`post_id`, `user_id`)

现在我希望我的语句表现出来的是,当 $statement1 由于 PK 失败时退出执行。

我希望很清楚我想要什么,并且任何人都可以提供帮助。谢谢!

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

    我要引用你的话-

    " 现在我希望我的语句表现的是,当 $statement1 因为 PK 而失败。”

    在这种情况下,如果:

    if($statement1->rowCount() < 1){
       //quite execution 
    
    }
    

    顺便说一句:您在使用 PDO 时正在执行类似 mysql 的查询。所以,这一行:

    $queryInsertUserLike = "INSERT INTO likes (user_id, post_id) VALUES ($userId, $id)";
    

    应该参数化,比如:

    $queryInsertUserLike = "INSERT INTO likes (user_id, post_id) VALUES (?, ?)";
    

    然后execute 使用..

    execute(array($_SESSION['userid'], $id))

    【讨论】:

    • 我知道这些值,这是要更改的,谢谢!我如何真正“退出”执行?抛出异常?
    • 什么都没有,如果行数为0,跳过执行,并评估另一个代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2015-06-01
    • 2015-11-15
    • 2022-01-26
    • 2016-04-20
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多