Ir para conteúdo

POWERED BY:

Arquivado

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

Jordan Pinheiro_147113

pdo lastInsertId

Recommended Posts

Olá amigos,

 

n estou conseguindo retorna o lastInsertId no PDO.. ele sempre retorna 0 e o insert é feito com sucesso na base

 

 

 $gravar = array(
            'status_id' => 1, //$ses[''],
            'categoria_id' => $ses['categoria_id'],
            'cliente_id' => $_SESSION['cliente_id']['id'],
            'pergunta' => $ses['pergunta']
        );
echo "<pre>";
        var_dump($gravar);
       
       $db->gravar("perguntas",$gravar);
       echo $db->pdo()->lastInsertId();

minha funnction que faz o insert, lembor que já tentei colocar dentro e fora da funcion mas o resultado foi o mesmo

 

 

public function gravar($tabela,$dados,$tipo = null) {


$keys = array();
$values = array();


foreach($dados as $key => $val) {
$keys[] = ':'.$key;
$values[] = $key;
}


$valuesSet = implode(", ",$values);
$valuesArray = implode(", ",$keys);
$finalQuery = "(".$valuesSet.") VALUES (".$valuesArray.")";


$tab = "INSERT INTO ".$tabela." ";


$bancoG = $this->pdo()->prepare($tab.$finalQuery);
return $bancoG->execute($dados);


}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja tentou chamar ela ligada direto a variavel de coneção com a pdo, ex.

 

 

 
class Crud{
...
    $this->pdo = new PDO("mysql:dbname=teste;host=localhost",'user','pass');//conexão com a PDO
...


//Ultimo id cadastrado
  public function lastId()
  {
      $this->pdo->lastInsertId();
  }
 
}
 
$crud = new Crud;
echo $crud->lastId;

Compartilhar este post


Link para o post
Compartilhar em outros sites

teste assim, insira o registro e na mesma função e chame lastInsertId. isso acontece em qual banco?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou te dar um exemplo de como eu utilizo na minha classe de manipulação de dados do banco:

 

$sql = sprintf( "INSERT INTO %s ( %s ) VALUES( %s )", $table, $collums, $tokens );
            
$this->pdo->prepare( $sql )->execute( $data );
return $this->pdo->lastInsertId();  

 

Vê se você consegue arrumar ou apenas usar como base na sua função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

vai ver a conexão não esta ativa quando vc lastInsertId(), tente assim:

 

qual banco vc esta usando?

 

 

public function gravar($tabela,$dados,$tipo = null) {


    $keys = array();
    $values = array();


    foreach($dados as $key => $val) {
        $keys[] = ':'.$key;
        $values[] = $key;
    }


    $valuesSet = implode(", ",$values);
    $valuesArray = implode(", ",$keys);
    $finalQuery = "(".$valuesSet.") VALUES (".$valuesArray.")";


    $tab = "INSERT INTO ".$tabela." ";


    $bancoG = $this->pdo()->prepare($tab.$finalQuery);
    $result = $bancoG->execute($dados);
    
    echo 'ultimo id: '. $this->pdo->lastInsertId();
    
    
    return $result;


}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

so isso aqui ja funciona, desde q tenha sido executado um insert

 

SELECT LAST_INSERT_ID();

 

vou tentar testar novamente sua classe.

 

 

testei aqui novamente sua classe com os ajuste para funcionar....

 

 

 

removi os () de pdo, pq acho q ele não é um metodo e sim uma propriedade...

 

   $bancoG = $this->pdo()->prepare($tab.$finalQuery);

 

 

       $db->gravar("perguntas",$gravar);
       echo $db->pdo()->lastInsertId();

Compartilhar este post


Link para o post
Compartilhar em outros sites

removi os () de pdo, pq acho q ele não é um metodo e sim uma propriedade...

 

Justamente o que eu ia comentar. No post #7 você, Jordan, disse ter "tentado da forma acima".

 

Mas o post #6 não considerava esse par de parênteses que distingue uma propriedade de um método.

 

Poste a declaração ("corpo") do método pdo(), se é que ele é um método mesmo pois, caso você esteja de alguma forma perdendo o vínculo entre a PDO e a PDOStatement, criado por PDOStatement::execute(), realmente não vai funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

iiiii ja era cara.... td vez vc ta criando uma conexão nova, pra pegar o ultimo id vc tem q estar na mesma conexão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

outra forma é vc criar uma propridade, q tenha o objeto PDO, e no tal metodo pdo verifica se ela é vazia/invalida(cria um PDO) se não retorna a conexão existente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Justamente por isso que pedi para que você postasse a declaração do método pdo().

Primeiro, entenda o porquê não funciona.

Tudo aquilo feito antes de executar uma ação é feito no objeto PDO e quase tudo aquilo que é feito depois da ação ter sido executada, no objeto PDOStatement.

Quase porque ao meu ver o método PDO::lastInsertId() não deveria pertencer à PDO e sim à PDOStatement pois ele retorna uma informação após a ação e não antes dela.

Enfim...

Cada novo objeto instanciado possui um identificador interno único, identificador este obtenível (tremendo chute gramatical esse :P) pela função spl_object_hash().

Como toda vez que você invoca o método pdo() você cria um novo objeto (crédito extra: experimenta usar spl_object_hash() logo após a instância) o vínculo criado entre a PDOStatement com a PDO por intermédio de PDOStatement:execute() não chega a ser desfeito pois pdo() retorna a nova instância, mas se torna inacessível pois agora refere-se à outro objeto.

Para solucionar esse problema:

  • Verifique a REAL necessidade dessa classe. Se você simplesmente usa a PDO para se conectar ao banco, injete-a como dependência onde for necessário. Abstrair uma abstração sem motivo lógico é jogar performance no lixo.
  • Se REALMENTE você precisar dessa classe, crie um método de conexão que instancie o objeto e invoque-o no construtor. Esse método atribuiria a instância à uma propriedade previamente criada.

    Feito isso, no método pdo() você verifica o valor dessa propriedade. Se for uma instância de PDO, você retorna a propriedade. Se não for você invoca o método de conexão novamente e só então retorna a propriedade.


Dessa forma, a propriedade SEMPRE terá um objeto PDO e, contanto que sua aplicação respeite o fluxo vertical e crescente de uma Requisição, você não terá mais esse problema.

Se vier a ter, um Singleton Registry resolve, apesar de mal visto por alguns programadores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se vier a ter, um Singleton Registry resolve, apesar de mal visto por alguns programadores.

 

flame começando em .... 3....2...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu fui direto no mysql admin e rodei essa consulta

 

 

SELECT LAST_INSERT_ID( ) 
FROM perguntas

 

ele retornou uns 30 registros tudo com 0

tela.png

pq n teve nenhum inser nessa sessão/conexão, roda um insert antes rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou rodar... minha estrutura ta assim

 

CREATE TABLE IF NOT EXISTS `perguntas` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status_id` int(11) DEFAULT NULL,
  `categoria_id` int(11) DEFAULT NULL,
  `cliente_id` int(11) DEFAULT NULL,
  `pergunta` text,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=43 ;

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.