lastInsertId在第一个记录后没有返回值。我该如何检查?

时间:2012-04-23 19:15:31

标签: php mysql transactions pdo

我有以下PHP脚本运行良好,并使用PDO事务正确地将所有数据插入MySQL,但仅在第一次运行时。在初始运行之后,我尝试再次插入相同的数据。然后,第一个lastInsertId开始返回0,因为unique key字段上的email属性正在停止通过userId创建的新auto_increment值。

在阅读了类似的答案后,我仍然坚持如何检查这种情况并解决问题。我写了$userCheck,以便查看$fromParsed的值是否与数据库中已存在的电子邮件地址的值相匹配。我不知道如何获取此查询的值,然后编辑脚本,以便如果用户已经在那里使用相同的电子邮件地址,那么它将获得userId $fromParsed,如果$fromParsed尚未在其中,请插入,然后继续使用lastInsertId();获取userId

我确实试图寻找答案,但我找不到任何能够为类似PDO交易的类似情况给出明确答案的内容。

很抱歉,如果答案是明显的。

try {

    $con = new PDO('mysql:host=localhost;dbname=db', 'root', 'password');

    $attachmentsQuery = $con->prepare('INSERT INTO attachments SET attachmentName = :attachmentName, content = :content, fileType = :fileType');
    $usersQuery = $con->prepare('INSERT INTO users SET email = :email');
    $emailsQuery = $con->prepare('INSERT INTO emails SET userId = :userId, subject = :subject, body = :body, attachmentId = :attachmentId');
    $userCheck = $con->prepare("SELECT userId FROM users WHERE email = '$fromParsed'");

    try {
        $con->beginTransaction();

        $userCheck->execute();
        //Something here?

        $usersQuery->bindParam(':email', $fromParsed, PDO::PARAM_STR);
        $usersQuery->execute();

        $userId = $con->lastInsertId();

        $attachmentsQuery->bindParam(':attachmentName', $filename, PDO::PARAM_STR);
        $attachmentsQuery->bindParam(':fileType', $fileType, PDO::PARAM_STR);
        $attachmentsQuery->bindParam(':content', $content, PDO::PARAM_LOB);
        $attachmentsQuery->execute();

        $attachmentId = $con->lastInsertId();

        $emailsQuery->bindParam(':userId', $userId, PDO::PARAM_INT);
        $emailsQuery->bindParam(':attachmentId', $attachmentId, PDO::PARAM_INT);
        $emailsQuery->bindParam(':subject', $subject, PDO::PARAM_STR);
        $emailsQuery->bindParam(':body', $text, PDO::PARAM_STR);
        $emailsQuery->execute();

        $con->commit();

        } catch(Exception $e) {
                $dbo->rollback();
                die();
        }
} catch(Exception $e) {
        error_log($e->getMessage());
}

1 个答案:

答案 0 :(得分:1)

尝试一下,

if($userCheck->execute() && $userCheck->rowCount() > 0){
    // we have a user.
    $data = $userCheck->fetch(PDO::FETCH_ASSOC);
    $userId = $data['userId'];
}
else {

    $usersQuery->bindParam(':email', $fromParsed, PDO::PARAM_STR);
    $usersQuery->execute();

    $userId = $con->lastInsertId();
}
//Something here?

简要说明,如果有一个由rowCount指定的记录,这将把$ userQuery的结果放入$ data。如果查询没有返回任何结果,它将继续执行$ userQuery并为新创建的条目返回userId。