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

Bom, amigo, vou te pedir o seguinte:

 

  • Poste a classe DAO completa
  • Poste a classe Noticias completa
  • Poste o código onde você chama a classe Noticia e executa o método onde você espera buscar o último id inserido
  • Leia o tópico de orientações para uma boa participação e siga as orientações ali contidas.

 

Tenho 99% de certeza de que sei onde está o problema, mas antes de postar, quero ver o código completo para poder indicar onde você está errando.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo. Irei postar os códígos hoje anoite, quando chegar em casa. Aguarde!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como prometido, veja abaixo os links para as classes solicitadas.

 

DAO.php

 

 

<?

class DAO{

### atributos / objetos para encapsulamento ###
private $id;
protected $ultimoId;

### atributos / objetos usar no CRUD ###
protected $tabela;
protected $campos;
protected $valores;
protected $where;
protected $like;
protected $asc;
protected $desc;
public $start;
public $limit;
public $total;

### atributos / objetos para conexão ###
private static $conn;

const DB_HOST = 'localhost';
const DB_NOME = 'painel';
const DB_PORT = '3306';
const DB_USER = 'root';
const DB_PASS = '';
const TIPO_CON = 'mysql';


### atributos / objetos para manipular a sessão ###
protected $session = true;
public $dados;

public static function getDAO(){
	if(self::$conn instanceof PDO){
		return self::$conn;
	}else{
		self::$conn = new PDO(strtolower(self::TIPO_CON).":host=".self::DB_HOST.";port=".self::DB_PORT.";dbname=".
				self::DB_NOME, self::DB_USER, self::DB_PASS);
		return self::$conn;
	}
}

public function getResultado($sql='', $stm_arr=array()){
	if(!empty($sql)){
		$conn = DAO::getDAO();
		$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
		$stm = $conn->prepare($sql);
		$stm->execute($stm_arr);
		$stm->debugDumpParams();
		$result = $stm->fetchAll(PDO::FETCH_ASSOC);
		$this->total = $stm->rowCount();

		#print_r($this->total);
		if(!empty($result)){
			return $result;
		}
		return array();

	}else{
		return array();
	}
}

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();

		$this->ultimoId = (int)DAO::$conn->lastInsertId();

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

protected function select(){
	$padrao = (!empty($this->desc)  ? "ORDER BY {$this->desc} DESC" : "ORDER BY {$this->asc} ASC");
	$where  = (!empty($this->where) ? "WHERE {$this->where}" : "" );
	$limit  = (!empty($this->limit) ? "LIMIT {$this->limit}" : "" );
	$like   = (!empty($this->like)  ? "LIKE '%{$this->like}%'" : "" );

	return self::getResultado("SELECT {$this->campos} FROM {$this->tabela} {$like} {$where} {$padrao} {$limit}");
}

protected function insert(){	
	return self::ExecutaSQL("INSERT INTO {$this->tabela} ({$this->campos}) VALUES ({$this->valores})");
}

protected function update(){
	return self::ExecutaSQL("UPDATE {$this->tabela} SET {$this->campos} WHERE id = ".self::getId()."");
}

protected function delete(){
	return self::ExecutaSQL("DELETE FROM {$this->tabela} WHERE id = ".self::getId()."");
}

/*protected function sessionUser($array){
	if(!empty($this->session)){
		if($this->session != false){
			session_start();
			$_SESSION[$array] = $this->dados;
		}else{
			unset($_SESSION[$array]);
			session_destroy();		
		}
	}	
}*/

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

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

protected function setId($id){
	$this->id = (int)$id;
}

protected function getId(){
	return intval($this->id);
}

public function getData($data){
	return implode('/', array_reverse(explode('-',$data)));	
}

public function getMoney($valor){
	return 'R$' . number_format($valor, 2, ',', '.');	
}

}

?>

 

 

 

Noticia.php

 

 

<?

require_once("DAO.php");
require_once("Funcoes.php");
require_once("Upload.php");

class Noticia extends DAO{

private $funcoes;
private $upload;
private static $titulo;
private static $texto;
private static $autor;

################ seters ################
private static function setTitulo($titulo){ self::$titulo = $titulo; }
private static function setTexto($texto){   self::$texto = $texto; }
private static function setAutor($autor){   self::$autor = $autor; }

################ geters ################
private static function getTitulo(){ return self::$titulo; }
private static function getTexto(){  return self::$texto; }
private static function getAutor(){  return self::$autor; }


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


################ metodos ################
public function actionCadastrar(){
	self::setTitulo($_POST['titulo']);
	self::setTexto($_POST['texto']);
	self::setAutor($_POST['autor']);

	$this->campos = "titulo, texto, autor, dataPublicacao, publicar";
	$this->valores = "
		'".self::getTitulo()."', 
		'".self::getTexto()."',
		'".self::getAutor()."', 
		NOW(),{$_POST['publicar']}
	";

	if($this->upload->uploaded){
		$this->upload->file_new_name_body = "imagem".$this->ultimoId;
		$this->upload->image_resize = true;
		$this->upload->image_ratio_y = true;
		$this->upload->image_x = 80;
		$this->upload->image_convert = 'jpg';
		$this->upload->jpeg_quality = 100;
		$this->upload->image_watermark = '../imagens/marca_dagua.png';
		$this->upload->image_watermark_position = "BR";
		$this->upload->image_watermark_x = -15;
		$this->upload->process("../imagens/album".$this->ultimoId."/pequenas/");

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

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

	if($this->upload->uploaded){
		$this->upload->file_new_name_body = "imagem".$this->ultimoId;
		$this->upload->image_resize = true;
		$this->upload->image_ratio_y = true;
		$this->upload->image_x = 800;
		$this->upload->image_convert = 'jpg';
		$this->upload->jpeg_quality = 100;
		$this->upload->image_watermark = '../imagens/marca_dagua.png';
		$this->upload->image_watermark_position = "BR";
		$this->upload->image_watermark_x = -15;
		$this->upload->process("../imagens/album".$this->ultimoId."/grandes/");

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

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

	return parent::insert();

}

}

?>

 

 

 

Aguardo por respostas, porém irei continuar tentando. Muito obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltou postar um código, que seria o mais importante de todos.

 

Poste o código onde você chama a classe Noticia e executa o método onde você espera buscar o último id inserido

 

Para pegar o id utilizando o código que você postou, faça algo assim:

 

$noticia = new Noticia();
$noticia->actionCadastrar();
$ultimoId = $noticia->getUltimoId();

 

Se não for assim, você está fazendo errado. Achei o seu método insert estranho. Normalmente o método insert já retorna o id do registro inserido. Aí você faria algo assim:

 

$noticia = new Noticia();
$ultimoId = $noticia->actionCadastrar();

 

Só que para isto você precisa modificar o seu método insert na classe DAO para que ele retorne o id inserido e não um boolean.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei de cabeça aqui agora, então é assim que fiz:

 

actionNoticias.php

require_onde ("../classes/Noticia.php");
$noticia = new Noticia();

if(isset($_POST['cadastrar'])){
   $noticia->actionCadastrar();
}

Na página HTML, eu to usando ajaxForm, que eu passo como parametro no data, a página actionNoticias.php. Não sei se reparou, mas eu quero inserir o nome do album + nome das imagens com o id. Então, neste caso, eu tenho que chamar o atributo $ultimoId na classe Noticia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tinha reparado. O problema está justamente aí. Veja que você tenta pegar o id ANTES de fazer o insert. Ou seja, não existe ID ainda, já que a notícia ainda não foi inserida no banco. Faça o insert ANTES de tentar usar o id.

 

Sugiro fortemente que você leia o link que eu passei antes, sobre orientações para uma boa participação, principalmente com relação a exibição de erros e sobre a forma de responder, evitando fazer citação a todo o post de forma desnecessária.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está justamente aí. Veja que você tenta pegar o id ANTES de fazer o insert. Ou seja, não existe ID ainda, já que a notícia ainda não foi inserida no banco. Faça o insert ANTES de tentar usar o id.

Em linhas gerais, foi o que disse no Post #19

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matias Rezende

Vou fazer isso quando chegar em casa anoite. Sobre a exibição de erros, está habilitada deste do começo do desenvolvimento.

 

Bruno Augusto

Ok, desculpe qualquer coisa, e obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal, consegui resolver o problema depois de dias tentando!

O código ficou assim:

 

<?

public function actionCadastrar(){
	self::setTitulo($_POST['titulo']);
	self::setTexto($_POST['texto']);
	self::setAutor($_POST['autor']);

	$this->campos = "titulo, texto, autor, dataPublicacao, publicar";
	$this->valores = "
		'".self::getTitulo()."', 
		'".self::getTexto()."',
		'".self::getAutor()."', 
		NOW(),{$_POST['publicar']}
	";

	$retorno = parent::insert();
               # Criei uma variavel fazendo o insert, depois que ele insere
               # aí sim eu faço o retorno no final do código, fazendo: return $retorno, 
               # que aí ele já inseriu então pego o id e faço upload da imagem.

	if($this->upload->uploaded){
		$this->upload->file_new_name_body = "imagem".$this->ultimoId;
		$this->upload->image_resize = true;
		$this->upload->image_ratio_y = true;
		$this->upload->image_x = 80;
		$this->upload->image_convert = 'jpg';
		$this->upload->jpeg_quality = 80;
		$this->upload->image_watermark = '../imagens/marca_dagua.png';
		$this->upload->image_watermark_position = "BR";
		$this->upload->image_watermark_x = -15;
		$this->upload->process("../imagens/album".$this->ultimoId."/pequenas/");

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

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

	if($this->upload->uploaded){
		$this->upload->file_new_name_body = "imagem".$this->ultimoId;
		$this->upload->image_resize = true;
		$this->upload->image_ratio_y = true;
		$this->upload->image_x = 800;
		$this->upload->image_convert = 'jpg';
		$this->upload->jpeg_quality = 80;
		$this->upload->image_watermark = '../imagens/marca_dagua.png';
		$this->upload->image_watermark_position = "BR";
		$this->upload->image_watermark_x = -15;
		$this->upload->process("../imagens/album".$this->ultimoId."/grandes/");

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

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

	return $retorno; # aqui eu retorno a variavel depois que o registro foi inserido, assim pego o id.
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas o mais importante, você entendeu o porquê que não estava funcionando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, por que eu estava colocando "return parent::insert()" no final, ou seja, ele nunca iria me retornar o ID, por que iria fazer a inserção dos dados no banco somente no final do método, e já que eu estava chamando o $this->ultimoId antes do return, não iria achar mesmo, por que ainda não tinha feito o insert na tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase isso.

 

Você, na realidade, resgatava o valor de uma propriedade que, por padrão, ao definí-la é NULL, esperando receber um inteiro, representado pelo ID do último registro, que era atribuído à tal propriedade DEPOIS de PDO::exec() (no seu caso, via DAO) fosse executado, antes mesmo de executar o dito método.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço a paciência e ajuda de todos que tentaram me ajudar.

Pelo menos, terá uma solução para muitos que passarão pelo mesmo 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.