22
respostas

Erro na função DAO

Boa tarde,

Criei a classe e a função "ProdutoDao" e "produtoDao", respectivamente. Ao adicionar um produto, ocorre o seguinte "bug":

Parse error: syntax error, unexpected 'function__construct' (T_STRING), expecting function (T_FUNCTION) in C:\wamp\www\loja\class\ProdutoDao.php on line 7

Seguem abaixo os código dos seguintes arquivos, para análise e correção:

1) ProdutoDao.php:

<?php

class ProdutoDao {

    private $conexao;

    function__construct($conexao) {
        $this->conexao = $conexao;

    }

    function listaProdutos() {

    $produtos = array();
    $resultado = mysqli_query("select p.*,c.nome as categoria_nome 
        from produtos as p join categorias as c on c.id=p.categoria_id");

    while($produto_array = mysqli_fetch_assoc($resultado)) {

        $categoria = new Categoria();
        $categoria->setNome($produto_array['categoria_nome']);

        $nome = $produto_array['nome'];
        $descricao = $produto_array['descricao'];
        $preco = $produto_array['preco'];
        $usado = $produto_array['usado'];

        $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
        $produto->setId($produto_array['id']);

        array_push($produtos, $produto);
    }

    return $produtos;
}

function insereProduto(Produto $produto) {

    $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) 
        values ('{$produto->getNome()}', {$produto->getPreco()}, 
            '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, 
                {$produto->isUsado()})";

    return mysqli_query($this, $query);
}

function alteraProduto(Produto $produto) {

    $query = "update produtos set nome = '{$produto->getNome()}', 
        preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', 
            categoria_id= {$produto->getCategoria()->getId()}, 
                usado = {$produto->isUsado()} where id = '{$produto->getId()}'";

    return mysqli_query( $query);
}
function buscaProduto($id) {

    $query = "select * from produtos where id = {$id}";
    $resultado = mysqli_query($this, $query);
    $produto_buscado = mysqli_fetch_assoc($resultado);

    $categoria = new Categoria();
    $categoria->setId($produto_buscado['categoria_id']);

    $nome = $produto_buscado['nome'];
    $descricao = $produto_buscado['descricao'];
    $preco = $produto_buscado['preco'];
    $usado = $produto_buscado['usado'];

    $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
    $produto->setId($produto_buscado['id']);

    return $produto;
}

function removeProduto($id) {

    $query = "delete from produtos where id = {$id}";

    return mysqli_query($this, $query);
    }
  }
?>

2) adicionaProduto.php:

<?php 
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");

verificaUsuario();

$categoria = new Categoria();
$categoria->setId($_POST['categoria_id']);

$nome = $_POST['nome'];
$preco = $_POST['preco'];
$descricao = $_POST['descricao'];

if(array_key_exists('usado', $_POST)) {
    $usado = "true";
} else {
    $usado = "false";
}

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado);

$produtoDao = new ProdutoDao($conexao);

if($produtoDao->insereProduto($produto)) { ?>
    <p class="text-success">O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi adicionado.</p>
<?php 
} else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $produto->getNome() ?> não foi adicionado: <?= $msg?></p>
<?php
}
?>

<?php include("rodape.php"); ?>

3) cabexalho.php:

<?php

function carregaClasse($nomeDaClasse) {
    require_once("class/".$nomeDaClasse.".php");
}

spl_autoload_register("carregaClasse");

error_reporting(E_ALL ^ E_NOTICE);
require_once("mostra-alerta.php"); 
require_once("conecta.php"); 
?>
<html>
<head>
    <meta charset="utf-8">
    <title>Minha Loja</title>
    <link href="css/bootstrap.css" rel="stylesheet">
    <link href="css/loja.css" rel="stylesheet">
</head>
<body>

    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a class="navbar-brand" href="index.php">Minha Loja</a>
            </div>
            <div>
                <ul class="nav navbar-nav">
                    <li><a href="produto-formulario.php">Adiciona Produto</a></li>
                    <li><a href="produto-lista.php">Produtos</a></li>
                    <li><a href="contato.php">Contato</a></li>
                </ul>
            </div>
        </div>
    </div>

    <div class="container">
        <div class="principal">
            <?php  mostraAlerta("success"); ?>
            <?php mostraAlerta("danger"); ?>

Fico no aguardo da solução, obrigado!

22 respostas

Boa tarde, em complemento ao post acima (Erro na função DAO), segue o meu código fonte do arquivo "produto-lista,php", em virtude do bug abaixo:

Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in C:\wamp\www\loja\produto-lista.php on line 9

1) arquivo "produto-lista.php":

<?php
require_once("cabecalho.php");
require_once("logica-usuario.php");
?>

<table class="table table-striped table-bordered">
    <?php
    $produtoDao = new ProdutoDao($conexao);
    $produtos = produtoDao->listaProdutos($conexao);
    foreach($produtos as $produto) :
    ?>
        <tr>
            <td><?= $produto->getNome() ?></td>
            <td><?= $produto->getPreco() ?></td>
            <td><?= $produto->precoComDesconto(0.1) ?></td>
            <td><?= substr($produto->getDescricao(), 0, 40) ?></td>
            <td><?= $produto->getCategoria()->getNome() ?></td>
            <td>
                <a class="btn btn-primary" 
                    href="produto-altera-formulario.php?id=<?=$produto->getId()?>">
                    alterar
                </a>
            </td>
            <td>
                <form action="remove-produto.php" method="post">
                    <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    <button class="btn btn-danger">remover</button>
                </form>
            </td>
        </tr>
    <?php
    endforeach
    ?>    
</table>

<?php include("rodape.php"); ?>

2) arquivo "cabecalho.php":

<?php

function carregaClasse($nomeDaClasse) {
    require_once("class/".$nomeDaClasse.".php");
}

spl_autoload_register("carregaClasse");

error_reporting(E_ALL ^ E_NOTICE);
require_once("mostra-alerta.php"); 
require_once("conecta.php"); 
?>
<html>
<head>
    <meta charset="utf-8">
    <title>Minha Loja</title>
    <link href="css/bootstrap.css" rel="stylesheet">
    <link href="css/loja.css" rel="stylesheet">
</head>
<body>

    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a class="navbar-brand" href="index.php">Minha Loja</a>
            </div>
            <div>
                <ul class="nav navbar-nav">
                    <li><a href="produto-formulario.php">Adiciona Produto</a></li>
                    <li><a href="produto-lista.php">Produtos</a></li>
                    <li><a href="contato.php">Contato</a></li>
                </ul>
            </div>
        </div>
    </div>

    <div class="container">
        <div class="principal">
            <?php  mostraAlerta("success"); ?>
            <?php mostraAlerta("danger"); ?>

Aguardo a análise e correção do código, a fim de seguir em frente no presente curso. Obrigado!

Boa tarde,

Ainda em complemento aos posts anteriores sobre a função DAO, seguem os meus códigos fontes dos arquivos: produto-lista.php; produto-altera-formulario.php e altera-produto.php, em decorrência do bug abaixo:

Parse error: syntax error, unexpected 'function__construct' (T_STRING), expecting function (T_FUNCTION) in C:\wamp\www\loja\class\ProdutoDao.php on line 7
Call Stack
#    Time    Memory    Function    Location
1    0.0015    137648    {main}( )    ...\adiciona-produto.php:0
2    0.0225    165264    spl_autoload_call ( )    ...\adiciona-produto.php:22
3    0.0225    165288    carregaClasse( )    ...\adiciona-produto.php:22

1) Arquivo "produto-lista.php":

<?php
require_once("cabecalho.php");
require_once("logica-usuario.php");
?>

<table class="table table-striped table-bordered">
    <?php
    $produtoDao = new ProdutoDao($conexao);
    $produtos = produtoDao->listaProdutos($conexao);
    foreach($produtos as $produto) :
    ?>
        <tr>
            <td><?= $produto->getNome() ?></td>
            <td><?= $produto->getPreco() ?></td>
            <td><?= $produto->precoComDesconto(0.1) ?></td>
            <td><?= substr($produto->getDescricao(), 0, 40) ?></td>
            <td><?= $produto->getCategoria()->getNome() ?></td>
            <td>
                <a class="btn btn-primary" 
                    href="produto-altera-formulario.php?id=<?=$produto->getId()?>">
                    alterar
                </a>
            </td>
            <td>
                <form action="remove-produto.php" method="post">
                    <input type="hidden" name="id" value="<?=$produto->getId()?>">
                    <button class="btn btn-danger">remover</button>
                </form>
            </td>
        </tr>
    <?php
    endforeach
    ?>    
</table>

<?php include("rodape.php"); ?>

2) Arquivo "produto-altera-formulario.php":

<?php
require_once("cabecalho.php");
require_once("banco-categoria.php");


$id = $_GET['id'];
$produtos = produtoDao->listaProdutos($conexao);
$produto = $produtoDao->buscaProduto($id);
$categorias = listaCategorias($conexao);

$selecao_usado = $produto->isUsado() ? "checked='checked'" : "";
$produto->setUsado($selecao_usado);

?>

<h1>Alterando produto</h1>
<form action="altera-produto.php" method="post">
    <input type="hidden" name="id" value="<?=$produto->getId()?>">
    <table class="table">
        <?php include("produto-formulario-base.php"); ?>
        <tr>
            <td>
                <button class="btn btn-primary" type="submit">Alterar</button>
            </td>
        </tr>
    </table>
</form>

<?php include("rodape.php"); ?>

3) Arquivo "altera-produto.php":

<?php
require_once("cabecalho.php");

$categoria = new Categoria();
$categoria->setId($_POST['categoria_id']);

$nome = $_POST['nome'];
$preco = $_POST['preco'];
$descricao = $_POST['descricao'];

if(array_key_exists('usado', $_POST)) {
    $usado = "true";
} else {
    $usado = "false";
}

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
$produto->setId($_POST['id']);

$produtoDao = new produtoDao ($conexao);

if($produtoDao->alteraProduto($produto)) { ?>
    <p class="text-success">O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi alterado.</p>
<?php 
} else {
    $msg = mysqli_error($conexao);
?>
    <p class="text-danger">O produto <?= $produto->getNome() ?> não foi alterado: <?= $msg?></p>
<?php
}
?>

<?php include("rodape.php"); ?>

Aguardo a análise e a correção dos códigos fontes supra, a fim de poder prosseguir para a etapa e módulo seguinte do presente curso EaD. Obrigado pela atenção e apoio!

Parece que você escreveu function__constructquando deveria escrever function __construct

Bom dia,

Vou corrigir por aqui. Muito obrigado pela análise e correção. Abs,

Marcello

Sobre o erro: Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in C:\wamp\www\loja\produto-lista.php on line 9 no arquivo produto-lista.php

Altere o trecho abaixo:

$produtos = produtoDao->listaProdutos($conexao);

Para

$produtos = $produtoDao->listaProdutos($conexao);

Bom dia,

Acabei de corrigir o método "construct" do arquivo "ProdutoDao,php", conforme se demonstra abaixo:

class ProdutoDao {

private $conexao;

function __construct($conexao) { $this->conexao = $conexao;

}

Todavia, agora está então ocorrendo o seguinte bug, na linha 44, do arquivo "ProdutoDao":

( ! ) Warning: mysqli_query() expects parameter 1 to be mysqli, object given in C:\wamp\www\loja\class\ProdutoDao.php on line 44 Call Stack

Time Memory Function Location

1 0.0036 137648 {main}( ) ...\adiciona-produto.php:0 2 0.0303 181160 ProdutoDao->insereProduto( ) ...\adiciona-produto.php:24 3 0.0304 181488 mysqli_query ( ) ...\ProdutoDao.php:44

Igualmente, ao se adicionar um novo produto, está também ocorrendo um novo bug, na linha 9, do arquivo "produto-lista.php":

Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in C:\wamp\www\loja\produto-lista.php on line 9

Sendo assim, fico no aguardo quanto à análise e à correção, a fim de poder prosseguir para o próximo módulo do curso. Grato,

Marcello.

Bom dia, Alex!

Fiz a alteração do meu código fonte no arquivo "produto-altera-formulário.php", conforme você me orientou:

<?php require_once("cabecalho.php"); require_once("banco-categoria.php");

$id = $_GET['id']; $produtos = $produtoDao->listaProdutos($conexao); $produto = $produtoDao->buscaProduto($id); $categorias = listaCategorias($conexao);

Todavia, ainda continuam os problemas acima relatados:

1) Bug na linha 44, do arquivo "ProdutoDao":

( ! ) Warning: mysqli_query() expects parameter 1 to be mysqli, object given in C:\wamp\www\loja\class\ProdutoDao.php on line 44 Call Stack

Time Memory Function Location 1 0.0036 137648 {main}( ) ...\adiciona-produto.php:0 2 0.0303 181160 ProdutoDao->insereProduto( ) ...\adiciona-produto.php:24 3 0.0304 181488 mysqli_query ( ) ...\ProdutoDao.php:44

2) Igualmente, ao se adicionar um novo produto, está também ocorrendo um novo bug, na linha 9, do arquivo "produto-lista.php":

Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in C:\wamp\www\loja\produto-lista.php on line 9

Sendo assim, fico no aguardo quanto à análise e à correção, a fim de poder prosseguir para o próximo módulo do curso. Grato,

Marcello.

A função mysqli_query (http://php.net/mysqli_query) recebe dois parâmetros, o primeiro é a conexão que no seu caso é o atributo $conexão da classe ProdutoDao, o segundo parâmetro é o comando sql.

Você tem que revisar as chamadas da função mysqli_query no seu código, em alguns lugares falta informar a conexão.

Exemplo:

mysqli_query($this->conexao, $seuComandoSQL);

Ok, Alex Moreno,

Vou checar por aqui e fazer as seguintes alterações. Obrigado! Abs,

Marcello

Boa tarde,

Segue abaixo o meu código fonte do arquivo "ProdutoDao.php", pois quando vou adicionar um produto na loja, ocorre o seguinte problema:

setNome($produto_array['categoria_nome']); $nome = $produto_array['nome']; $descricao = $produto_array['descricao']; $preco = $produto_array['preco']; $usado = $produto_array['usado']; $produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_array['id']); array_push($produtos, $produto); } return $produtos; } function insereProduto($conexao, Produto $produto) { $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto->getNome()}', {$produto->getPreco()}, '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, {$produto->isUsado()})"; return mysqli_query($conexao, $query); } function alteraProduto($conexao, Produto $produto) { $query = "update produtos set nome = '{$produto->getNome()}', preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', categoria_id= {$produto->getCategoria()->getId()}, usado = {$produto->isUsado()} where id = '{$produto->getId()}'"; return mysqli_query($conexao, $query); } function buscaProduto($conexao, $id) { $query = "select * from produtos where id = {$id}"; $resultado = mysqli_query($conexao, $query); $produto_buscado = mysqli_fetch_assoc($resultado); $categoria = new Categoria(); $categoria->setId($produto_buscado['categoria_id']); $nome = $produto_buscado['nome']; $descricao = $produto_buscado['descricao']; $preco = $produto_buscado['preco']; $usado = $produto_buscado['usado']; $produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_buscado['id']); return $produto; } function removeProduto($conexao, $id) { $query = "delete from produtos where id = {$id}"; return mysqli_query($conexao, $query); } } ?>

1) código fonte do arquivo "ProdutoDao.php":

<?

class ProdutoDao {

    function listaProdutos($conexao) {

        $produtos = array();
        $resultado = mysqli_query($conexao, "select p.*,c.nome as categoria_nome 
            from produtos as p join categorias as c on c.id=p.categoria_id");

        while($produto_array = mysqli_fetch_assoc($resultado)) {

            $categoria = new Categoria();
            $categoria->setNome($produto_array['categoria_nome']);

            $nome = $produto_array['nome'];
            $descricao = $produto_array['descricao'];
            $preco = $produto_array['preco'];
            $usado = $produto_array['usado'];

            $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
            $produto->setId($produto_array['id']);

            array_push($produtos, $produto);
        }

        return $produtos;
    }

    function insereProduto($conexao, Produto $produto) {

        $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) 
            values ('{$produto->getNome()}', {$produto->getPreco()}, 
                '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, 
                    {$produto->isUsado()})";

        return mysqli_query($conexao, $query);
    }

    function alteraProduto($conexao, Produto $produto) {

        $query = "update produtos set nome = '{$produto->getNome()}', 
            preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', 
                categoria_id= {$produto->getCategoria()->getId()}, 
                    usado = {$produto->isUsado()} where id = '{$produto->getId()}'";

        return mysqli_query($conexao, $query);
    }

    function buscaProduto($conexao, $id) {

        $query = "select * from produtos where id = {$id}";
        $resultado = mysqli_query($conexao, $query);
        $produto_buscado = mysqli_fetch_assoc($resultado);

        $categoria = new Categoria();
        $categoria->setId($produto_buscado['categoria_id']);

        $nome = $produto_buscado['nome'];
        $descricao = $produto_buscado['descricao'];
        $preco = $produto_buscado['preco'];
        $usado = $produto_buscado['usado'];

        $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
        $produto->setId($produto_buscado['id']);

        return $produto;
    }

    function removeProduto($conexao, $id) {

        $query = "delete from produtos where id = {$id}";

        return mysqli_query($conexao, $query);
    }
}

?>

Fico no aguardo da análise e correção, para poder avançar no conteúdo do curso.

Obrigado,

Marcello.

Boa Marcelo, já conseguimos resolver alguns problemas. Bora continuar debuggando =)

No seu código, como o Alex disse, a gente precisa passar a conexão. E em muitos casos estamos passando a instancia do produtoDao com o this. O correto seria passar $this->conexao:

<?php

class ProdutoDao {

    private $conexao;

    function__construct($conexao) {
        $this->conexao = $conexao;

    }

    function listaProdutos() {

    $produtos = array();
// aqui estava sem
    $resultado = mysqli_query($this->conexao,"select p.*,c.nome as categoria_nome 
        from produtos as p join categorias as c on c.id=p.categoria_id");

    while($produto_array = mysqli_fetch_assoc($resultado)) {

        $categoria = new Categoria();
        $categoria->setNome($produto_array['categoria_nome']);

        $nome = $produto_array['nome'];
        $descricao = $produto_array['descricao'];
        $preco = $produto_array['preco'];
        $usado = $produto_array['usado'];

        $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
        $produto->setId($produto_array['id']);

        array_push($produtos, $produto);
    }

    return $produtos;
}

function insereProduto(Produto $produto) {

    $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) 
        values ('{$produto->getNome()}', {$produto->getPreco()}, 
            '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, 
                {$produto->isUsado()})";
    // aqui estava só o this
    return mysqli_query($this->conexao, $query);
}

function alteraProduto(Produto $produto) {

    $query = "update produtos set nome = '{$produto->getNome()}', 
        preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', 
            categoria_id= {$produto->getCategoria()->getId()}, 
                usado = {$produto->isUsado()} where id = '{$produto->getId()}'";
    // aqui estava sem
    return mysqli_query( $this->conexao,$query);
}
function buscaProduto($id) {

    $query = "select * from produtos where id = {$id}";
// aqui estava só o this
    $resultado = mysqli_query($this->conexao, $query);
    $produto_buscado = mysqli_fetch_assoc($resultado);

    $categoria = new Categoria();
    $categoria->setId($produto_buscado['categoria_id']);

    $nome = $produto_buscado['nome'];
    $descricao = $produto_buscado['descricao'];
    $preco = $produto_buscado['preco'];
    $usado = $produto_buscado['usado'];

    $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
    $produto->setId($produto_buscado['id']);

    return $produto;
}

function removeProduto($id) {

    $query = "delete from produtos where id = {$id}";
// aqui estava só o this
    return mysqli_query($this->conexao, $query);
    }
  }
?>

Da uma olhada nos comentarios e no seu código =)

Abraço

Boa tarde,

Apesar de atualizar o código abaixo, conforme orientação do curso, o bug anteriormente demonstrado ainda continua, quando se adiciona um produto à loja:


1) código do arquivo "ProdutoDao.php":

<?php 

class ProdutoDao {

    private $conexao;

    function __construct($conexao) {
        $this->conexao = $conexao;
    }

    function listaProdutos() {

        $produtos = array();
        $resultado = mysqli_query($this->conexao, "select p.*,c.nome as categoria_nome 
            from produtos as p join categorias as c on c.id=p.categoria_id");

        while($produto_array = mysqli_fetch_assoc($resultado)) {

            $categoria = new Categoria();
            $categoria->setNome($produto_array['categoria_nome']);

            $nome = $produto_array['nome'];
            $descricao = $produto_array['descricao'];
            $preco = $produto_array['preco'];
            $usado = $produto_array['usado'];

            $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
            $produto->setId($produto_array['id']);

            array_push($produtos, $produto);
        }

        return $produtos;
    }

    function insereProduto(Produto $produto) {

        $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) 
            values ('{$produto->getNome()}', {$produto->getPreco()}, 
                '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, 
                    {$produto->isUsado()})";

        return mysqli_query($this->conexao, $query);
    }

    function alteraProduto(Produto $produto) {

        $query = "update produtos set nome = '{$produto->getNome()}', 
            preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', 
                categoria_id= {$produto->getCategoria()->getId()}, 
                    usado = {$produto->isUsado()} where id = '{$produto->getId()}'";

        return mysqli_query($this->conexao, $query);
    }

    function buscaProduto($id) {

        $query = "select * from produtos where id = {$id}";
        $resultado = mysqli_query($this->conexao, $query);
        $produto_buscado = mysqli_fetch_assoc($resultado);

        $categoria = new Categoria();
        $categoria->setId($produto_buscado['categoria_id']);

        $nome = $produto_buscado['nome'];
        $descricao = $produto_buscado['descricao'];
        $preco = $produto_buscado['preco'];
        $usado = $produto_buscado['usado'];

        $produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
        $produto->setId($produto_buscado['id']);

        return $produto;
    }

    function removeProduto($id) {

        $query = "delete from produtos where id = {$id}";

        return mysqli_query($this->conexao, $query);
    }
}

?>

Grato pela atenção, fico no aguardo da solução.

Marcello.

Olá, André Chaves.

Isso já foi feito, conforme código fonte acima. Mas o bug continua o mesmo, ok? No aguardo da solução e orientação técnica,

Abs,

Marcello.

class ProdutoDao {

    private $conexao;

    function __construct($conexao) {
        $this->conexao = $conexao;
    }

Oi Marcello, você pode postar como a conexão é criada e passado para a classe ProdutoDao no processo para criar um produto?

Opa, executa um dump na conexao que está sendo passada pro construtor do DAO e compartilha aqui com a gente:

<?php 
require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");

verificaUsuario();

$categoria = new Categoria();
$categoria->setId($_POST['categoria_id']);

$nome = $_POST['nome'];
$preco = $_POST['preco'];
$descricao = $_POST['descricao'];

if(array_key_exists('usado', $_POST)) {
    $usado = "true";
} else {
    $usado = "false";
}

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado);
var_dump($conexao);die();
$produtoDao = new ProdutoDao($conexao);

Bom dia,

O código acima é para qual arquivo do projeto "loja"? Não está claro para mim. Abs.

Bom dia,

Quanto aos arquivos que fazem acesso direto aos métodos do "banco-produto.php" para que passem a instanciar e utilizar um objeto do "ProdutoDao.php", fiz as modificações abaixo nos códigos dos arquivos: "adiciona-produto.php", "altera-produto.php", "produto-altera-formulario.php", "produto-lista.php" e "remove-produto.php":

1) adiciona-produto.php:

<?

class ProdutoDao {

function listaProdutos($conexao) {

$produtos = array(); $resultado = mysqli_query($conexao, "select p.*,c.nome as categoria_nome from produtos as p join categorias as c on c.id=p.categoria_id");

while($produto_array = mysqli_fetch_assoc($resultado)) {

$categoria = new Categoria(); $categoria->setNome($produto_array['categoria_nome']);

$nome = $produto_array['nome']; $descricao = $produto_array['descricao']; $preco = $produto_array['preco']; $usado = $produto_array['usado'];

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_array['id']);

array_push($produtos, $produto); }

return $produtos; }

function insereProduto($conexao, Produto $produto) {

$query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto->getNome()}', {$produto->getPreco()}, '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, {$produto->isUsado()})";

return mysqli_query($conexao, $query); }

function alteraProduto($conexao, Produto $produto) {

$query = "update produtos set nome = '{$produto->getNome()}', preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', categoria_id= {$produto->getCategoria()->getId()}, usado = {$produto->isUsado()} where id = '{$produto->getId()}'";

return mysqli_query($conexao, $query); }

function buscaProduto($conexao, $id) {

$query = "select * from produtos where id = {$id}"; $resultado = mysqli_query($conexao, $query); $produto_buscado = mysqli_fetch_assoc($resultado);

$categoria = new Categoria(); $categoria->setId($produto_buscado['categoria_id']);

$nome = $produto_buscado['nome']; $descricao = $produto_buscado['descricao']; $preco = $produto_buscado['preco']; $usado = $produto_buscado['usado'];

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_buscado['id']);

return $produto; }

function removeProduto($conexao, $id) {

$query = "delete from produtos where id = {$id}";

return mysqli_query($conexao, $query); } }

?>

2) altera-produto.php:

<?php require_once("cabecalho.php"); require_once("banco-produto.php");

$categoria = new Categoria(); $categoria->setId($_POST['categoria_id']);

$nome = $_POST['nome']; $preco = $_POST['preco']; $descricao = $_POST['descricao'];

if(array_key_exists('usado', $_POST)) { $usado = "true"; } else { $usado = "false"; }

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($_POST['id']);

if(alteraProduto($conexao, $produto)) { ?>

O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi alterado.

<?php } else { $msg = mysqli_error($conexao); ?>

O produto <?= $produto->getNome() ?> não foi alterado: <?= $msg?>

<?php } ?>

<?php include("rodape.php"); ?>

3) produto-altera-formulario.php:

<?php require_once("cabecalho.php"); require_once("banco-categoria.php"); require_once("banco-produto.php");

$id = $_GET['id']; $produto = buscaProduto($conexao, $id); $categorias = listaCategorias($conexao);

$selecao_usado = $produto->isUsado() ? "checked='checked'" : ""; $produto->setUsado($selecao_usado);

?>

Alterando produto

<?php include("produto-formulario-base.php"); ?>

<?php include("rodape.php"); ?>

Continua...

Continua:

4) produto-lista.php:

<?php
require_once("cabecalho.php");
require_once("banco-produto.php");
?>

<table class="table table-striped table-bordered">
    <?php
    $produtos = listaProdutos($conexao);
    foreach($produtos as $produto) :
    ?>
        <tr>
            <td><?= $produto->getNome() ?></td>
            <td><?= $produto->getPreco() ?></td>
            <td><?= $produto->precoComDesconto(0.1) ?></td>
            <td><?= substr($produto->getDescricao(), 0, 40) ?></td>
            <td><?= $produto->getCategoria()->getNome() ?></td>
            <td>
                <a class="btn btn-primary" 
                    href="produto-altera-formulario.php?id=<?=$produto->getId()?>">
                    alterar
                </a>
            </td>
            <td>

5) remove-produto:

<?php
require_once("cabecalho.php");
require_once("banco-produto.php"); 
require_once("logica-usuario.php");

$id = $_POST['id'];
removeProduto($conexao, $id);
$_SESSION["success"] = "Produto removido com sucesso.";
header("Location: produto-lista.php");
die();

?>

Porém, o bug abaixo ainda continua:

setNome($produto_array['categoria_nome']); $nome = $produto_array['nome']; $descricao = $produto_array['descricao']; $preco = $produto_array['preco']; $usado = $produto_array['usado']; $produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_array['id']); array_push($produtos, $produto); } return $produtos; } function insereProduto($conexao, Produto $produto) { $query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto->getNome()}', {$produto->getPreco()}, '{$produto->getDescricao()}', {$produto->getCategoria()->getId()}, {$produto->isUsado()})"; return mysqli_query($conexao, $query); } function alteraProduto($conexao, Produto $produto) { $query = "update produtos set nome = '{$produto->getNome()}', preco = {$produto->getPreco()}, descricao = '{$produto->getDescricao()}', categoria_id= {$produto->getCategoria()->getId()}, usado = {$produto->isUsado()} where id = '{$produto->getId()}'"; return mysqli_query($conexao, $query); } function buscaProduto($conexao, $id) { $query = "select * from produtos where id = {$id}"; $resultado = mysqli_query($conexao, $query); $produto_buscado = mysqli_fetch_assoc($resultado); $categoria = new Categoria(); $categoria->setId($produto_buscado['categoria_id']); $nome = $produto_buscado['nome']; $descricao = $produto_buscado['descricao']; $preco = $produto_buscado['preco']; $usado = $produto_buscado['usado']; $produto = new Produto($nome, $preco, $descricao, $categoria, $usado); $produto->setId($produto_buscado['id']); return $produto; } function removeProduto($conexao, $id) { $query = "delete from produtos where id = {$id}"; return mysqli_query($conexao, $query); } } ?>

Desculpa Marcello, ma eu não entendi o erro, esse código php é exibido no html? Se for isso tem que verificar se tem a tag <?php antes do código php.

O problema acontece no arquivo "adiciona-produto.php"?

Boa tarde,

Isto seria o bug que aparece na tela, qdo vc tenta inserir um novo produto no sistema "loja", entende? Os meus códigos são todos em php.

Abs,

Marcello.

O seu arquivo adiciona-produto.php continua desse jeito:

<?php

require_once("cabecalho.php");
require_once("banco-produto.php");
require_once("logica-usuario.php");

verificaUsuario();

$categoria = new Categoria();
$categoria->setId($_POST['categoria_id']);

$nome = $_POST['nome'];
$preco = $_POST['preco'];
$descricao = $_POST['descricao'];

if (array_key_exists('usado', $_POST)) {
    $usado = "true";
} else {
    $usado = "false";
}

$produto = new Produto($nome, $preco, $descricao, $categoria, $usado);

$produtoDao = new ProdutoDao($conexao);

if ($produtoDao->insereProduto($produto)) { ?>
    <p class="text-success">O produto <?= $produto->getNome() ?>, <?= $produto->getPreco() ?> foi adicionado.</p>
    <?php
} else {
    $msg = mysqli_error($conexao);
    ?>
    <p class="text-danger">O produto <?= $produto->getNome() ?> não foi adicionado: <?= $msg ?></p>
    <?php
}
?>

Boa tarde, Alex.

E o que tem que ainda ser alterado no código? No aguardo e obrigado.