Using LastInsertId () more than once

0

I need to use lastInsertId () more than once in my application. Here is an example of such an event:

<?php
//CONEXÃO COM O BANCO DE DADOS
$pdo=new PDO("mysql:host=localhost;dbname=xxx","xxx","xxx");

//VARIÁVEIS COM DADOS DO FORMULÁRIO
$nome = $_POST["nome"];
$email = $_POST["email"];
$senha = $_POST["senha"];
$senhaConfirm = $_POST["senhaConfirm"];
$telefone = $_POST["telefone"];
$celular = $_POST["celular"];
$rua = $_POST["rua"];
$bairro = $_POST["bairro"];
$numero = $_POST["numero"];
$cidade = $_POST["cidade"];
$estado = $_POST["estado"];
$cep = $_POST["cep"];
$complemento = $_POST["complemento"];
$usuario = $_POST["usuario"];
$nomeMercado = $_POST["nomeMercado"];
$cnpj = $_POST["cnpj"];
$telefoneMercado = $_POST["telefoneMercado"];
$celularMercado = $_POST["celularMercado"];
$expedienteInicio = $_POST["expedienteInicio"];
$expedienteFim = $_POST["expedienteFim"];
$arquivo = $_POST["arquivo"];

//INICIO DA TRANSAÇÃO
$pdo->beginTransaction();

//INSERÇÃO DE DADOS NA TABELA ENDEREÇO
$insertEndereco = $pdo->prepare("INSERT INTO ENDERECO(BAIRRO, CEP, CIDADE, COMPLEMENTO, ESTADO, NUMERO, RUA) VALUES(:bairro, :cep, :cidade, :complemento, :estado, :numero, :rua)");  
$insertEndereco->bindValue(":bairro",$bairro);
$insertEndereco->bindValue(":cep",$cep);
$insertEndereco->bindValue(":cidade",$cidade);
$insertEndereco->bindValue(":complemento",$complemento);
$insertEndereco->bindValue(":estado",$estado);
$insertEndereco->bindValue(":numero",$numero);
$insertEndereco->bindValue(":rua",$rua);
$insertEndereco->execute();
//VERIFICA SE A INSERÇÃO DE DADOS DE ENDEREÇO RETORNA TRUE(FOI REALIZADA)
if (!$insertEndereco) {
    die("Oops, houve um erro no cadastro de seu endereço, tente novamente ou contacte a adaministração.");
}
$cod_endereco = $pdo->lastInsertId();//O LAST_

//INSERÇÃO DE DADOS NA TABELA USUARIO
$insertUsuario = $pdo->prepare("INSERT INTO USUARIOS(COD_ENDERECO, NOME_USUARIO, E-MAIL_USUARIO, SENHA_USUARIO, TELEFONE, CELULAR,  TIPO_USUARIO,) VALUES(:cod_endereco,:nome,:email, :senha, :telefone, :celular, :usuario)"); 
$insertUsuario->bindValue(":cod_endereco",$cod_endereco); 
$insertUsuario->bindValue(":nome",$nome);
$insertUsuario->bindValue(":email",$email);
$insertUsuario->bindValue(":senha",$senha);
$insertUsuario->bindValue(":telefone",$telefone);
$insertEndereco->bindValue(":celular",$celular);
$insertEndereco->bindValue(":usuario",$usuario);
$insertEndereco->execute();
if (!$insertUsuario) {
    die("Oops, houve um erro no cadastro de seus dados pessoais, tente novamente ou contacte a adaministração.");
}
$cod_usuario = $pdo->lastInsertId();

//INSERÇÃO DE DADOS NA TABELA SUPERMERCADO
$insertMercado = $pdo->prepare("INSERT INTO SUPERMERCADO (CNPJ, NOME, FOTO_SUPERMERCADO, INICIO_EXPEDIENTE,                 
    FIM_EXPEDIENTE, TELEFONE) VALUES (:cod_endereco_mercado, :cod_usuario, :cnpj, :nomeMercado, :arquivo, :expedienteInicio, :expedienteFim, :$telefoneMercado)");
    $insertMercado->bindValue(":cod_endereco_mercado",$pdo->lastInsertId());
    $insertMercado->bindValue(":cod_usuario",$cod_usuario);  
$insertMercado->bindValue(":cnpj",$cnpj);
$insertMercado->bindValue(":nomeMercado",$nomeMercado);
$insertMercado->bindValue(":arquivo",$arquivo);
$insertMercado->bindValue(":expedienteInicio",$expedienteInicio);
$insertMercado->bindValue(":expedienteFim",$expedienteFim);
$insertMercado->bindValue(":telefoneMercado",$telefoneMercado);
$insertMercado->execute();
//CASO TENHA DADO ALGUM ERRO NA TRANSAÇÃO rollBack IRÁ CANCELAR TODAS ELAS
if (!$insertMercado) {
        $pdo->rollBack();
        die("Oops, houve um erro no cadastro de seu mercado, tente novamente ou contacte a adaministração.");
}
//FINALIZANDO TRANSAÇÃO
$pdo->commit(); 
echo($cod_endereco);
echo($cod_usuario);
echo($usuario); ?>

Doing this, I can only catch the first value of lastInsertId (). Could anyone tell me how I can capture the values of both?

    
asked by anonymous 20.05.2017 / 03:23

1 answer

0

It seems that you are not giving a run in $insertUsuario but rather two executes in $insertEndereco .

That is, you do the first execute in $insertEndereco and then you are doing it again giving a bindValue em ":celular" e ":usuario" that does not exist for the address, so it is generating error in the insert and the pdo is returning the id of the first insert that was successful.

In the part where it is:

//INSERÇÃO DE DADOS NA TABELA USUARIO
$insertUsuario = $pdo->prepare("INSERT INTO USUARIOS(COD_ENDERECO, NOME_USUARIO, E-MAIL_USUARIO, SENHA_USUARIO, TELEFONE, CELULAR,  TIPO_USUARIO,) VALUES(:cod_endereco,:nome,:email, :senha, :telefone, :celular, :usuario)"); 
$insertUsuario->bindValue(":cod_endereco",$cod_endereco); 
$insertUsuario->bindValue(":nome",$nome);
$insertUsuario->bindValue(":email",$email);
$insertUsuario->bindValue(":senha",$senha);
$insertUsuario->bindValue(":telefone",$telefone);
$insertEndereco->bindValue(":celular",$celular);
$insertEndereco->bindValue(":usuario",$usuario);
$insertEndereco->execute();
if (!$insertUsuario) {
    die("Oops, houve um erro no cadastro de seus dados pessoais, tente novamente ou contacte a adaministração.");
}
$cod_usuario = $pdo->lastInsertId();

I think it would have to be:

//INSERÇÃO DE DADOS NA TABELA USUARIO
$insertUsuario = $pdo->prepare("INSERT INTO USUARIOS(COD_ENDERECO, NOME_USUARIO, E-MAIL_USUARIO, SENHA_USUARIO, TELEFONE, CELULAR,  TIPO_USUARIO,) VALUES(:cod_endereco,:nome,:email, :senha, :telefone, :celular, :usuario)"); 
$insertUsuario->bindValue(":cod_endereco",$cod_endereco); 
$insertUsuario->bindValue(":nome",$nome);
$insertUsuario->bindValue(":email",$email);
$insertUsuario->bindValue(":senha",$senha);
$insertUsuario->bindValue(":telefone",$telefone);
$insertUsuario->bindValue(":celular",$celular);
$insertUsuario->bindValue(":usuario",$usuario);
$insertUsuario->execute();
if (!$insertUsuario) {
    die("Oops, houve um erro no cadastro de seus dados pessoais, tente novamente ou contacte a adaministração.");
}
$cod_usuario = $pdo->lastInsertId();
    
20.05.2017 / 03:51