Php 在事务中的不同查询上多次使用lastInsertId()

Php 在事务中的不同查询上多次使用lastInsertId(),php,mysql,pdo,Php,Mysql,Pdo,所以我一直在努力寻找答案,但我不认为有一个答案是我要做的。我将从我的代码示例开始 file.php $q = "INSERT INTO ".PORTAL_DB.".resource_file (company__id, rf_category__id, title, file_name, description, path, upload_by, has_quiz) SELECT ?, ?, ?, CONCAT(MAX(id)+1, '.', '$extension'), ?, ?, ?, ?

所以我一直在努力寻找答案,但我不认为有一个答案是我要做的。我将从我的代码示例开始

file.php

$q = "INSERT INTO ".PORTAL_DB.".resource_file (company__id, rf_category__id, title, file_name, description, path, upload_by, has_quiz)
SELECT ?, ?, ?, CONCAT(MAX(id)+1, '.', '$extension'), ?, ?, ?, ? FROM ".PORTAL_DB.".resource_file";
$stmt = $CONN->prepare($q);
$filename = 0;
$resource_file__id = 0;
if($stmt->execute(array($company__id, $rf_category__id, $title, $description, "assets/$uploadFolder/", USER, $has_quiz))){
    $filename = $CONN->lastInsertId();
    $resource_file__id = $filename;
}

if(!empty($quiz)){
    $passing_score = $quiz->passing_score;
    if(!is_numeric($passing_score) or ($passing_score < 0) or $passing_score > 100){
        $CONN->rollback();
        throw new Exception("Invalid passing score value for quiz, please fix");
    }
    $q = "INSERT INTO ".PORTAL_DB.".rf_quiz (resource_file__id, passing_score)
    VALUES(?, ?)";
    $stmt = $CONN->prepare($q);
    $rf_quiz__id = 0;
    $stmt->execute(array($resource_file__id, $passing_score));
    print_r($CONN->lastInsertId);
    exit;
    $question_ids = array();
    foreach($quiz as $qz){
        $question = $qz->question;
        //print_r($qz);
        $q = "INSERT INTO ".PORTAL_DB.".rf_quiz_question (rf_quiz__id, question)
        VALUES(?, ?)";
        $stmt = $CONN->prepare($q);
        if($stmt->execute(array($rf_quiz__id, $question))){
            array_push($question_ids, $CONN->lastInsertId);
        }
    }
    //print_r($question_ids);
    exit; // using this for testing only
}
$q=“插入到“.PORTAL\u DB.”.resource\u文件(公司id、rf\u类别id、标题、文件名、描述、路径、上传人、has\u测验)
从.PORTAL\u DB..resource\u文件中选择?、?、?、CONCAT(最大(id)+1、'.'、'$extension')、?、?、?、;
$stmt=$CONN->prepare($q);
$filename=0;
$resource\u file\u id=0;
如果($stmt->execute(数组($company\uu id、$rf\u category\uu id、$title、$description,“assets/$uploadFolder/”,USER,$has\u quick))){
$filename=$CONN->lastInsertId();
$resource\u file\u id=$filename;
}
如果(!空($QUICK)){
$passing_score=$quick->passing_score;
如果(!是数值($passing_score)或($passing_score<0)或$passing_score>100){
$CONN->rollback();
抛出新异常(“测验的及格分数值无效,请修复”);
}
$q=“插入“.PORTAL\u DB.”.rf\u测验(资源\u文件\u id,及格分数)
数值(?,)“;
$stmt=$CONN->prepare($q);
$rf\u quick\u id=0;
$stmt->execute(数组($resource\u file\u id,$passing\u score));
打印($CONN->lastInsertId);
出口
$question_ids=array();
foreach($qz){
$question=$qz->question;
//印刷费($qz);
$q=“插入到“.PORTAL\u DB.”.rf\u测验问题(rf\u测验id,问题)
数值(?,)“;
$stmt=$CONN->prepare($q);
if($stmt->execute(数组($rf\u quick\u id,$question))){
数组\u推送($question\u id,$CONN->lastInsertId);
}
}
//打印(问题ID);
exit;//仅将其用于测试
}
解释

上面的代码是在
$CONN->beginTransaction()
之后调用的,这样我可以更容易地管理错误。据我所知,您可以多次调用statement
$CONN->lastInsertId()
,但我可以获得存储在变量
$resource\u fild\u id
下的第一个id,然后当我们转到
$rf\u quick\u id
变量时,即使调用成功,我也不会得到任何结果,这会导致错误。我希望能够在一个事务中完成所有这些,以便于编码过程和组织

我希望有人能给我指出正确的方向,或者至少能告诉我我做错了什么,这样我就能找到一个快速的解决方案


提前谢谢你的帮助

$rf\u quick\u id
始终为0。可以吗?也许你忘记了这样的事情:
$rf\u quick\u id=$CONN->lastInsertId
?@mnv如果你看
$rf\u quick\u id
后面的代码,我有一个
print\r($CONN->lastinertid())然后我放置了一个
出口调用最近的编辑。这就是它没有显示任何内容的地方:记住,如果使用事务,在提交之前应该使用lastInsertId,否则它将返回0@Barmar但这不可能完全正确,因为在顶部,当我得到一个非零的id值时,
$filename
。我通过该id上传的所有文件都是正确的。顺便说一句,您的
$CONN->commit()
在哪里?