Use of Lastinsertid() more than once

Asked

Viewed 292 times

0

I need to use lastInsertId() more than once in my application. Follow 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); ?>

By doing so, I can only capture the first value of lastInsertId(). Would someone like to tell me how I manage to capture the values of both?

  • Just turn the command $pdo->execute()pra cada operação e recuperar o id atraves de$Pdo->lastInsertId()`

  • I’m already doing this, I’ll edit my code to make it clearer.

1 answer

0

It looks like you’re not performing on $insertUsuario and yes two executions in $insertEndereco.

I mean, you do the first run on $insertEndereco and then you’re doing it again giving a bindValue em ":celular" e ":usuario" that do not exist for the address, so is generating error in the Insert and Pdo is returning the id of the first successful Insert.

The part where:

//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 guess it had 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();
  • Oh god, it’s vdd, that moleee! Thank you!!!

  • Glad it worked out, abrass

  • Funny that even though I give an echo in the cod_address and throw it in the user table Insert, it’s not working...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.