Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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();
}
}Carlos,
Ele retornou isso:
object(PDO)#7 (0) {
}
NULL
Mais veja bem... como ele conseguiu inserir o registro 1 e o 2 ele deu o erro? vlw pela força amigo!
Aí tem que olhar o quem neste método get da classe Transacao.
Carlos Eduardo
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);
}
}
}
?>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
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:
$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