Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

junaooaks

[Resolvido] php pdo LAST_INSERT_ID()

Recommended Posts

ola pessoal estou usando pdo como uso o last_insert_id()

o insert e esse

$sql = 'INSERT INTO produto (custo_idcusto,produto, ipi, frete, fretePorcentagen, precoCusto, piscofins, irCsll, Lucro, precoVenda, percentualComissao)
               VALUES (?,?,?,?,?,?,?,?,?,?,?)';

       $stmt = $this->conex->prepare($sql);
       $stmt->bindParam(1, $peca->getUnitario(), PDO::PARAM_STR);
       $stmt->bindParam(2, $peca->getSt(), PDO::PARAM_STR);
       $stmt->bindParam(3, $peca->getIpi(), PDO::PARAM_STR);
       $stmt->bindParam(4, $peca->getFrete(), PDO::PARAM_STR);
       $stmt->bindParam(5, $peca->getFretep(), PDO::PARAM_STR);
       $stmt->bindParam(6, $peca->getPrecocusto(), PDO::PARAM_STR);
       $stmt->bindParam(7, $peca->getPisconfins(), PDO::PARAM_STR);
       $stmt->bindParam(8, $peca->getIrcs(), PDO::PARAM_STR);
       $stmt->bindParam(9, $peca->getLucro(), PDO::PARAM_STR);
       $stmt->bindParam(10, $peca->getPrecovenda(), PDO::PARAM_STR);
       $stmt->bindParam(11, $peca->getComissao(), PDO::PARAM_STR);

       $stmt->execute();

 

como pego o ultimo registro "last_insert" e uso para inserir no outro registro

 

onde coloco no outro insert

 

$sql = 'INSERT INTO produto (custo_idcusto,produto)
               VALUES (?,?)';

       $stmt = $this->conex->prepare($sql);
       $stmt->bindParam(1, LAST_INSERT_ID(), PDO::PARAM_INT);
       $stmt->bindParam(2, $peca->getProduto(), PDO::PARAM_STR);

       $stmt->execute();

 

como consigo usa este LAST_INSERT_ID() com PDO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhando no manual, você verá que o método lastInsertId() (não tem esses underscores) pertence à classe PDO, então, depois do statement ter sido executado, no seu caso, você obtém tal valor a partir da propriedade $conex:

 

// ...

$stmt -> execute();

$lastId = $this -> conex -> lastInsertId();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sugiro utilizar o nextval, existente no postgre. Ao invés de pegar o id depois de cadastrar, você reserva o ID, realiza o cadastro com o ID reservado. É sem falhas, diferente de "selecionar o último" no mysql, que pode dar algum problema.

 

Como o mysql não possui nextval, aqui há como emular ele:

Emulating nextval() function to get sequence in MySQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno Augusto

 

nao consigo usar o last_id sem passar ele por uma variavel ?

 

Bruno Augusto

obrigado pela resposta eu vou pesquisa este tambem

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sugiro utilizar o nextval, existente no postgre. Ao invés de pegar o id depois de cadastrar, você reserva o ID, realiza o cadastro com o ID reservado. É sem falhas, diferente de "selecionar o último" no mysql, que pode dar algum problema.

 

Como o mysql não possui nextval, aqui há como emular ele:

Emulating nextval() function to get sequence in MySQL

O problema disso Gabriel é que você acaba amarrando tua aplicação à um recurso que não é comum à todos os SGBD's ou à todos os suportados.

 

O PostgreeSQL faz isso, é possível emular no MySQL mas e se de repente a aplicação precisar rodar com NoSQL ou com Firebird e nãohpuver possibilidade de emulação?

 

Bruno Augusto

 

nao consigo usar o last_id sem passar ele por uma variavel ?

Depende o que você quer fazer.

 

Se você quiser apenas perpetuar esse ID para algum lugar, você não precisa armazenar numa variável:

 

function showLastId( $lastId ) {
   printf( 'Last inserted ID: %d', $lastId );
}

// ...

$stmt -> execute();

showLastId( $this -> conex -> lastInsertId() );

Vai funcionar tranquilamente.

 

Agora se você precisar alterar esse valor, em alguns casos, daí sim precisa, senão é bemp´rovável que o PHP fique enchendo as paciências com relação à somente variáveis poderem ser passadas como referência.

 

Quem nunca se irritou com esses erros que atire a primeira pedra. :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites
se de repente a aplicação precisar rodar com NoSQL

Nesse caso, não existiria ID.... Ou você salva ID em um SGBD NoSQL?

 

um recurso que não é comum à todos os SGBD's ou à todos os suportados.

PDO nem suporta um banco NoSQL... Como você pode utilizar isso como comparação?

 

é que você acaba amarrando

Errado. É um recurso implementável e utilizável em qualquer SGBD. Assim como qualquer classe, que pode trabalhar com um tipo de SGBD, você abstrai a sua interface para suportar vários SGBD, bastar realizar a implementação.

 

Segundo seu próprio argumento, é muito mais útil, utilizar nextval, implementado sua funcionalidade, ao invés de last_insert_id. Pois o último, é, sim, um recurso de SGBD, o que deixará sua aplicação amarrada a SGBD relacionais. Enquanto um método implementado, pode ser implementado em qualquer SGBD.

 

Do manual do PHP:

PDO::lastInsertId

This method may not return a meaningful or consistent result across different PDO drivers, because the underlying database may not even support the notion of auto-increment fields or sequences.

 

Significa que, mesmo em SGBD's relacionais, essa função pode não funcionar... Mais uma vez, utilizar lastInsertId, deixa AMARRADO ao SGBD...

 

Não me importo que me falem que não é funcional, ao menos, utilize argumentos válidos e sem contradição. Conhecimento é bom para todos. Conhecimento errado, entretanto, é pior que conhecimento algum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso, não existiria ID.... Ou você salva ID em um SGBD NoSQL?

Não vou mentir dizendo que sei como funciona o NoSQL porque, de fato, não sei.

 

Foi um comentário infeliz de minha parte. Ilustra o caso, mas não vem ao caso. ;)

 

Errado. É um recurso implementável e utilizável em qualquer SGBD. Assim como qualquer classe, que pode trabalhar com um tipo de SGBD, você abstrai a sua interface para suportar vários SGBD, bastar realizar a implementação.

Aí que está. Nativamente a PDO nãopermite tal implementação pois elaé uma biblioteca fechada.

 

Segundo seu próprio argumento, é muito mais útil, utilizar nextval, implementado sua funcionalidade, ao invés de last_insert_id. Pois o último, é, sim, um recurso de SGBD, o que deixará sua aplicação amarrada a SGBD relacionais. Enquanto um método implementado, pode ser implementado em qualquer SGBD.

Quando se trabalhando com um framework, third-party ou não, sim, seria bem viável pois independente da camada de abstração utilizada, independente do Driver/Adapter utilizado, toda sua implementação respeitaria a mesma interface e assim, podería-se extender a funcionalidade sem amarrar sua aplicação, nem com a PDO e nem com o banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites
É um recurso implementável e utilizável em qualquer SGBD

Você implementa a PDO no SGBD? Não foi isso que eu quis dizer, você deve implementar a função no SGBD, não na PDO.

Entretanto, isso é discussão para fórum de SGBD. Aos movimentos NoSQL e MoreSQL, e também abstração de SGBD ou utilização de recursos de um SGBD.

 

Voltando ao assunto:

Outro detalhe da PDO, a função lastInsertId pode retornar um valor errado. É raro, mas pode acontecer. Como é um recurso de banco de dados, o valor retornado é pelo banco, e não pela instância da classe. Se possuir muitas transações simultâneas, pode entrar em condição de corrida. Como não existem processos realmente simultâneos, pode ocorrer o seguinte:

 

- instancia da classe de conexão do Usuário 1, realiza inserção;

- Acaba contagem do quantum (S.O.);

- instancia da classe de conexão do Usuário 2, realiza inserção;

- Acaba contagem do quantum;

- instancia da classe de conexão do Usuário 1 recupera o último ID inserido;

- Acaba contagem do quantum;

- instancia da classe de conexão do Usuário 2 recupera o último ID inserido.

 

- ID do usuário 1 errado.

- ID do usuário 2 correto.

 

Não vou entrar em detalhes do escalonador de processos mais do que é necessário. Mas é pelo motivo acima que, desde mysql_insert_id(), essa função não é recomendada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, me diz uma coisa. Pra que essa edição em cima da hora com uma alfinetada desnecessária?

 

Eu não o mestre dos bancos de dados, longe disso. Estou apenas discutindo amigavelmente.

 

Se você entende melhor do assunto, defenda seus pontos e demonstre também.

 

Eu não trabalho com programação, nunca tiver sequer a curiosidade de usar outros bancos de dados que não o MySQL e o SQLite. Até tentei o NoSQL para um manipulador de sessões, mas ainda assim foi um contato muito superficial.

 

Posso sim estar falando besteira, mas dizer que outra alternativa que nem todo mundo conhece é melhor é vago demais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

isto ai galera obrigado pelo post foi 10 :clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.