Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.