PDO::lastInsertID 有时不起作用

Posted

技术标签:

【中文标题】PDO::lastInsertID 有时不起作用【英文标题】:PDO::lastInsertID sometimes doesnt work 【发布时间】:2013-05-17 00:07:19 【问题描述】:

当我获得 lastInsertId() 时,我的 pdo 连接发生了一些奇怪的事情:在 90% 的情况下它运行良好,但在 10% 的情况下它返回 0(我不知道是真的 0 还是 FALSE) . 但在 100% 的情况下,我的记录已成功插入。

这是我的代码:

function execute_insert($sql, $values) 
    try 
        $dbConnection = new PDO('mysql:dbname=mydb;host=localhost;charset=utf8', 'username', 'mypass');

        $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $dbConnection->beginTransaction();
        $stmt = $dbConnection->prepare($sql);

        $stmt->execute($values);

        $i = $dbConnection->lastInsertId();

        $dbConnection->commit();
        return $i;

     catch (PDOException $e) 
        echo "erro :S - " . $e->getMessage();
        die();
    



//blablabla

$sql = "INSERT INTO ai_pessoas(nome, tipo, cpf, orgao_emissor_id,
    rg_uf, rg, telefone1, telefone2, celular1, cidade_id, cep, endereco,
    numero,complemento,bairro, email_principal, email_secundario, email_principal_confirmado,
    dt_nascimento, oferta_id) "; 

$sql .= "VALUES(:nome,1,:cpf,:orgaorg,:ufrg,:rg,:telefone,:outroTelefone,:celular,:cidade,:cep,:endereco,:numero,:complemento,:bairro,:email,:emailAlternativo,FALSE,:datanasc,:idOfertaAtual);";

$idPessoa = execute_insert($sql,
        array(
            ':nome' => $nome,
            ':cpf' => $cpf,
            ':orgaorg' => $orgaorg,
            ':ufrg' => $ufrg,
            ':rg' => $rg,
            ':telefone' => $telefone,
            ':outroTelefone' => $outroTelefone,
            ':celular' => $celular,
            ':cidade' => $cidade,
            ':cep' => $cep,
            ':endereco' => $endereco,
            ':numero' => $numero,
            ':complemento' => $complemento,
            ':bairro' => $bairro,
            ':email' => $email,
            ':emailAlternativo' => $emailAlternativo,
            ':datanasc' => $datanasc,
            ':idOfertaAtual' => $idOfertaAtual
));

if ($idPessoa > 0)
   //sometimes enters here, sometimes not

我的记录已插入,但“if ($idPessoa > 0)”有时不起作用,这意味着 $idPessoa 为 0 或 FALSE。

有什么线索吗?

非常感谢!

【问题讨论】:

【参考方案1】:

您可以为此尝试LAST_INSERT_ID()。

附:您的函数每次都会连接。

附言我还看到您不处理错误和回滚。我认为在您的 10% 插入中失败了。探索有关双重调用此函数的信息,因为您在某些字段上有 UNIQUE 索引。并添加检查result of execute和errorInfo。

【讨论】:

您好,感谢您的回答。我会试试这个,如果它有效,我会告诉你。 PS:这是一个简单的网页,所以我只在两个地方使用这个连接,在不同的场合,但我会在未来修复它。 PPS:我相信这不会失败,因为这个脚本在if ($idPessoa > 0)... 结束后有更多行并且它们被执行。即:die() 命令永远不会执行...(至少这段代码从未引发任何PDOException)。

以上是关于PDO::lastInsertID 有时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PDO 的 Oracle 驱动程序不实现 lastInsertId()?

PDO LastInsertId 不返回任何内容

PDO:lastInsertId 返回啥值? [复制]

PDO::lastInsertID 返回 0

多线程单连接中的 PDO::lastInsertId() 是不是安全?

MySQL 和 PDO:理论上 PDO::lastInsertId 会失败吗?