Ir para conteúdo

POWERED BY:

Arquivado

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

Guilherme_90

[Resolvido] Obter último id inserido - PDO

Recommended Posts

Boa tarde a todos. Estou com um probleminha na qual a dias não consigo resolver, então venho pedir ajuda.

Eu preciso obter o último ID inserido numa tabela, porém não estou conseguindo. Mais eu já sei que muitos

irão me falar que precisa usar o PDO::lastInsetId(); mas mesmo assim não funciona. Segue o código abaixo:

 

DAO.php

<?

class DAO{

    public $ultimoId;

    public function ExecutaSQL($sql=''){
   if(!empty($sql)){
	$conn = DAO::getDAO();
	$result = $conn->exec($sql);
	$this->ultimoId = $conn->lastInsertId(); #essa linha aqui, não funciona.

	if(!$conn->errorCode()){
	      return true;
	}
	return false;
   }else{
	return false;
   }
   }

}

?>

 

Como resolvo isso? Mesmo eu chamando o atributo $ultimoId na classe herdeira, ele não herda os valores que são armazenados neste atributo.

Muito obrigado a todos, aguardo respostas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim cara? hehehe explique melhor, pois preciso de ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Henrique, tudo indica que é o PDO::exec(), mas vamos confirmar.

 

À parte disso, experimente fazer isso, ologo após a declaração de $conn:

 

$conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

Se PDO::lastInsertId() não funciona, você pode ter um erro sendo gerado pelo seu PDO::exec() (se este o for) e, dada a ausência de informações, sua instância da PDO está com os erros "silenciosos" padrão.

 

Essa modificações vai espetá-los para que gritem o problema aos quatro ventos. :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só vai funcionar se sua coluna no banco de dados for auto_increment

 

E é AUTO_INCREMMENT. Já estou a dias tentando resolver e não consigo.

Como resolver?

 

Henrique, tudo indica que é o PDO::exec(), mas vamos confirmar.

 

À parte disso, experimente fazer isso, ologo após a declaração de $conn:

 

$conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

Se PDO::lastInsertId() não funciona, você pode ter um erro sendo gerado pelo seu PDO::exec() (se este o for) e, dada a ausência de informações, sua instância da PDO está com os erros "silenciosos" padrão.

 

Essa modificações vai espetá-los para que gritem o problema aos quatro ventos. :lol:

 

Maravilha. Irei testar agora, aguarde.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno Augusto

 

Olha como está o código:

 

<?
public function ExecutaSQL($sql=''){
if(!empty($sql)){
	$conn = DAO::getDAO();
	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
	$stm = $conn->prepare($sql);
	$stm->debugDumpParams();
	$this->ultimoId = DAO::$conn->lastInsertId();
	$result = $conn->exec($sql);

	print_r($this->ultimoId);

	if(!$conn->errorCode()){
		return true;
	}
	return false;
}else{
	return false;
}
}
?>

 

Coloquei o prepare só pra eu poder ver o debug SQL do PDO. O ID não é retornado, aliás, sempre retorna 0. O que faço?

Além do mais, não apareceu erro algum, somente o debug que coloquei, e o print_r.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso aqui está errado

$conn = DAO::getDAO();
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$stm = $conn->prepare($sql);
$stm->debugDumpParams();
$this->ultimoId = DAO::$conn->lastInsertId(); 
$result = $conn->exec($sql);

o lastInsertId deve ser executado depois do exec .. você inverteu as posições.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, agora deu certo. Ele me retornou o último ID. Porém já tem outro problema.

 

Quando eu chamo o $this->ultimoId em outra classe que herda dessa, ele já não tem a informação armazenada no atributo ultimoId. O que faço?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ultimoID ta como public,private, proteceted?

 

usa um getter e setter nesse ultimoID c for o caso ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz isso e não deu certo, vejam:

 

<?

public function ExecutaSQL($sql=''){
if(!empty($sql)){
	$conn = DAO::getDAO();
	$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
	$stm = $conn->prepare($sql);
	$stm->debugDumpParams();
	$stm->execute();

	self::setUltimoId(DAO::$conn->lastInsertId());
	self::getUltimoId();

	if(!$conn->errorCode()){
		return true;
	}
	return false;
}else{
	return false;
}
}

protected function setUltimoId($ultimoId){
$this->ultimoId = (int)$ultimoId;
}

protected function getUltimoId(){
return intval($this->ultimoId);
}

?>

 

Aí, na minha outra classe que herdo dessa, eu faço assim:

<?

class Noticia extends DAO{

   private $funcoes;
   private $upload;

   function __construct(){
if($_FILES['imagem']['name'] != ""){
	$this->upload = new Upload($_FILES['imagem']);
}
$this->funcoes = new Funcoes();
$this->funcoes->proteger();	
$this->tabela = "noticias";
   }

    public function actionCadastrar(){
         if($this->upload->uploaded){
	$this->upload->file_new_name_body = "pequena".parent::getUltimoId();
	$this->upload->image_resize = true;
	$this->upload->image_ratio_y = true;
	$this->upload->image_x = 100;
	$this->upload->image_convert = 'jpg';
	$this->upload->jpeg_quality = 75;
	$this->upload->image_watermark = 'imagens/marca_dagua.png';
	$this->upload->image_watermark_x = 530;
	$this->upload->image_watermark_y = 390;
	$this->upload->process("../imagens/album".parent::getUltimoId()."/pequenas/");

	if($this->upload->processed){

	}else{
		echo 'Erro ao enviar imagem: '.$this->upload->error;
	}
}

   }

}

?>

Ele me retorna 0, não sei por que.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não acho que vá resolver, mas esse intval é desnecessário, se o seu campo é um inteiro no banco de dados, vai ser um inteiro no PHP...

protected function getUltimoId(){
       return $this->ultimoId;
}

 

Outra coisa, você está fazendo acesso estático a esse método, mas ele não é estático.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Henrique Barcelos

Não resolveu, ele não me retorna nada. To achando muito estranho, por que eu setei o valor do último ID dentro do método ExecutaSQL, depois é só eu chamar o getUltimoId, que no caso, o objeto contém o valor armazenado, mas eu não sei por que diabos não está!

 

Quanto ao acesso estático, vou usar o $this e ver o resultado.

 

EDIT:

Mesmo usando o $this, não funcionou. Alguma solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você está herdando os valores de DAO, acredito que não tenha sentido um método getUltimoId protected, visto que você nunca vai acessar ele de outro codigo se não de uma classe 'HERDADA', o correto nisso acredito eu, seria melhor deixar o atributo ultimoId protegido e acessar ele das classes filhas diretamente, afinal com o get e set o 'encapsulamento' já está um pouco comprometido.

 

Resumindo: Não faz sentido acessar um atributo herdado através de um getter e nem setar seu valor através de um setter, então, ao invés de usar um metodo para acessar o atributo acesse o DIRETO da classe filha, pois no seu contexto somente as classes filhas tem acesso ao ID.

 

dao

class DAO {

   protected $ultimoId;

   public function ExecutaSQL($sql=''){
        // Aqui seu metodo, define o valor de $ultimoId, aqui mesmo
        $this->ultimoId = (int)DAO::$conn->lastInsertId();        
   }

   // Pq chamar essa funcao, se você vai setar de dentro de um executa SQL ? E nao vai ter acesso publico,
   // apenas da classe que vai herdar ? 
   // Entao remova
   protected function setUltimoId($ultimoId){
       $this->ultimoId = (int)$ultimoId;
   }

   // A mesma descricao acima, não faz sentido.
   // Remova    
   protected function getUltimoId(){
       return intval($this->ultimoId);
   }
}

 

 

noticias

class Noticias extends DAO
{
  // Ao invés de usar parent::getUltimoId()
  $this->upload->file_new_name_body = "pequena".parent::getUltimoId();

  // Use
  $this->upload->file_new_name_body = "pequena".$this->ultimoId;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Irei testar hoje anoite, e dou uma resposta do problema. Aguarde!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara num tem erro não =X

 

E simples assim

 

 
class DAO ......   
protected $ultimoId;


protected function setUltimoId($ultimoId){
       $this->ultimoId = (int)$ultimoId;
   }


   protected function getUltimoId(){
       return $this->ultimoId;

   }

class file extends DAO.....

public  function __construct(){

   echo $this->ultimoId;
   echo $this->getUltimoId();

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa a sinceridade, julgando apenas pelo que você postou, claro, mas "leia" o seu código.

 

O valor do último ID é setado na propriedade no método ExecQuery(), mas você não o invoca :o

 

Como você espera que o NULL da propriedade seja substituído pelo inteiro que você espera?

 

Ou você esqueceu disso, ou suprimiu muito código na última resposta.

 

A propósito, use o botão Responder azul escuro ou a Resposta Rápida. Daí você não "quota" desnecessariamente e torna seus posts mais curtos e rápidos de se ler.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você está herdando os valores de DAO, acredito que não tenha sentido um método getUltimoId protected, visto que você nunca vai acessar ele de outro codigo se não de uma classe 'HERDADA', o correto nisso acredito eu, seria melhor deixar o atributo ultimoId protegido e acessar ele das classes filhas diretamente, afinal com o get e set o 'encapsulamento' já está um pouco comprometido.

 

Resumindo: Não faz sentido acessar um atributo herdado através de um getter e nem setar seu valor através de um setter, então, ao invés de usar um metodo para acessar o atributo acesse o DIRETO da classe filha, pois no seu contexto somente as classes filhas tem acesso ao ID.

 

dao

class DAO {

   protected $ultimoId;

   public function ExecutaSQL($sql=''){
        // Aqui seu metodo, define o valor de $ultimoId, aqui mesmo
        $this->ultimoId = (int)DAO::$conn->lastInsertId();        
   }

   // Pq chamar essa funcao, se você vai setar de dentro de um executa SQL ? E nao vai ter acesso publico,
   // apenas da classe que vai herdar ? 
   // Entao remova
   protected function setUltimoId($ultimoId){
       $this->ultimoId = (int)$ultimoId;
   }

   // A mesma descricao acima, não faz sentido.
   // Remova    
   protected function getUltimoId(){
       return intval($this->ultimoId);
   }
}

 

 

noticias

class Noticias extends DAO
{
  // Ao invés de usar parent::getUltimoId()
  $this->upload->file_new_name_body = "pequena".parent::getUltimoId();

  // Use
  $this->upload->file_new_name_body = "pequena".$this->ultimoId;
}

 

Acabei de testar cara, e o resultado continua o mesmo. Parece que quando eu chamo o $this->ultimoId na classe herdeira,o valor armazenado deste atributo se perde, sacou?

 

Eu sinceramente não sei como resolver este problema.

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.