Ir para conteúdo

POWERED BY:

Arquivado

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

Alisson Nunes da Rocha

[Resolvido] PDO - PHP

Recommended Posts

Boa tarde galera, estou parado nesse erro aqui oh:

Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\linelove\classes\app.dao\PedidoItensDAO.class.php on line 93

 

nessa linha tem o seguinte codigo:

$stmt = $conn->prepare("INSERT INTO pedido_itens (cod_pedido, cod_produto, qtde, valor) VALUES (?, ?, ?, ?)");

 

o que acontece?

Passo um array com 2 indice, sendo que o primeiro ele insere no banco, já o segundo ele dar o erro acima mencionado.

foreach($_SESSION['carrinho']['cesta'] as $produtos){
$itens['cod_pedido'] = $result;
$itens['cod_produto'] = $produtos['codigo'];
$itens['qtde'] = $produtos['qtde'];
$itens['valor'] = $produtos['preco'];
$itemDAO->InsereItemPedido($itens);	
}

insereItemPedido($itens)

public function InsereItemPedido($itens){

	try{

		//abre conexão com o banco
		$conn = Transacao::get();


		// preparo a query de inserçao - Prepare Statement
		// note que no logar dos valores eu nao estou passando ".$agenda->getValorx().", ...
		// isso ficaria uma porta aberta para um SQL Injection.
		$stmt = $conn->prepare("INSERT INTO pedido_itens (cod_pedido, cod_produto, qtde, valor) VALUES (?, ?, ?, ?)");

		// valores encapsulados nas variáveis da classe Produto.
		// sequencia de índices que representa cada valor de minha query
		$stmt->bindValue(1, $itens['cod_pedido']);
		$stmt->bindValue(2, $itens['cod_produto']);
		$stmt->bindValue(3, $itens['qtde']);
		$stmt->bindValue(4, $itens['valor']);
		// executo a query preparada
		$stmt->execute();

		//$id = $conn->lastInsertId();

		Transacao::close();

		//return $id;

	} catch (PDOException $e){
		echo "Error: ".$e->getMessage();
		Transacao::rollback();
	}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

$conn = Transacao::get();

$conn não está recebendo um objeto. Dê um var_dump em $conn logo abaixo desta linha e veja o que retorna. Provavelmente tem algo errado com a conexão ao banco.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue abaixo:

 

estranho, será q ele está perdendo a conexão apos q insere o primeiro registro? estranho :(

 

<?php
class Transacao{
private static $conn; //conexão ativa
private static $logger; //objeto de log

/*
 * Está declarado como private para impedir que se crie instâncias de Transação
 */
private function __construct(){}

/*
 * método open()
 * Abre uma transação e uma conexão ao BD
 * @param $database = nome do banco de dados
 */

public static function open($database){
	//abre uma conexão e armazena na propriedade estática $conn
	if(empty(self::$conn)){
		self::$conn = Conexao::open($database);
		//inicia a transação
		self::$conn->beginTransaction();
	}
}

/*
 * método get()
 * retorna a conexão ativa da transação
 */
public static function get(){
	//retorna a conexã ativa
	return self::$conn;
}

/*
 * método rollback()
 * desfaz todas operações realizadas na transação
 */
public static function rollback(){
	if(self::$conn){
		//desfaz as operações realizadas e durante a transação
		self::$conn->rollback();
		self::$conn = NULL;
	}
}

/*
 * método close()
 * Aplicas todas operações realizadas e fecha a transação
 */
public static function close(){
	if(self::$conn){
		//aplica as operações realizadas
		//durante a transação
		self::$conn->commit();
		self::$conn = NULL;
	}
}

/*
 * método setLogger()
 * define qual estratégia (algoritmo de log será usado)
 */
public static function setLogger(Logger $logger){
	self::$logger = $logger;
}


/*
 * método log()
 * armazena uma mensagem no arquivo log
 * baseada na estratégia ($logger) atual
 */
public static function log($message){
	//verifica existe um logger
	if(self::$logger){
		self::$logger->write($message);
	}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Transacao::close();

:seta:

       public static function close(){
               if(self::$conn){
                       //aplica as operações realizadas
                       //durante a transação
                       self::$conn->commit();
                       self::$conn = NULL;
               }
       }

Como são métodos e variáveis estáticas, você sempre está se referindo à classe.

 

No método get() você deve verificar se a conexão está ativa antes de retorná-la.

 

Obs.: Trabalhar com Singleton na classe de abstração do banco não é uma boa ideia. Tem alguns tópicos aqui no fórum falando sobre isto.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido... o problema estava abaixo:

 

$itemDAO = new PedidoItensDAO();

foreach($_SESSION['carrinho']['cesta'] as $produtos){

$itens['cod_pedido'] = $result;
$itens['cod_produto'] = $produtos['codigo'];
$itens['qtde'] = $produtos['qtde'];
$itens['valor'] = $produtos['preco'];
$itemDAO->InsereItemPedido($itens);	
}

 

Ele abria a conexão e fechava...


foreach($_SESSION['carrinho']['cesta'] as $produtos){
$itemDAO = new PedidoItensDAO();

$itens['cod_pedido'] = $result;
$itens['cod_produto'] = $produtos['codigo'];
$itens['qtde'] = $produtos['qtde'];
$itens['valor'] = $produtos['preco'];
$itemDAO->InsereItemPedido($itens);	
}

 

Ele criava e fechava, mais criava o objeto novamente! :D

então fiz assim:

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.