How to present the name of the customer of a particular sale? I can not get the name with the get

8

sales list code I'm having problem to present the customer name of each sale and product name of each sale tbm! I do not know what I'm doing wrong

<?php
  include_once("Sessao.php");
  include_once("Valida.php");
  include_once("Cabecalho.php");

 include_once './Classes/Singleton.php';

 include_once './Classes/Venda.php';
 include_once './Classes/VendaDao.php';

 // include_once 'Classes/Cliente.php';
 // include_once 'Classes/ClienteDao.php';
// include_once 'Classes/Produto.php';
// include_once 'Classes/ProdutoDao.php';?>

<?php 
    if($_GET && $_GET["msg"] && $_GET["tpMsg"]){
 ?>
    <div class="alert alert-<?php echo $_GET["tpMsg"] ?>" role="alert">
        <strong>Atenção: </strong><?php echo $_GET["msg"]?>
    </div>
<?php 
    }
 ?>

<div>   
   <a class="btn btn-success" href="FormVenda.php"> Novo Venda </a>
</div>

   <hr>

 <div>
   <table class="table table-striped table-hover">
    <thead>
        <tr>
            <th> Código </th>
            <th> Data </th>
            <th> Cliente </th>
            <th> Produto </th>
            <th> Quantidade </th>                
            <th> Preço </th>                
            <th> Total </th>                
            <th> Ações </th>
        </tr>
    </thead>
    <tbody>
        <?php

        $vendaDao = new VendaDao();
        $lista = $vendaDao->listar();

        foreach ($lista as $venda) {

            //$urlAlterar = "FormVenda.php?comando=U&codigo={$venda->getCodigo()}";
            $urlExcluir = "FormVenda.php?comando=D&codigo={$venda->getCodigo()}";
            $urlExcluir = "JavaScript:if(confirm('Deseja realmente excluir o venda?')) { document.location.href='{$urlExcluir}' }";

            echo
            "<tr>
                <td> {$venda->getCodigo()} </td>
                <td> {$venda->getData()} </td>
                <td> {$venda->getCliente()->getNome()} </td>
                <td> {$venda->getProduto()->getNome()} </td>
                <td> {$venda->getQuantidade()} </td>

                <td>
                    <a class='btn btn-danger' href=\"{$urlExcluir}\"> Excluir </a>
                </td>
            </tr>";
        }

        ?>

    </tbody>
</table>

 </div>
    <!-- <td> R$ {$venda->getProduto()->getPreco()} </td>
   <td> R$ " . ($venda->getPreco() * $venda->getQuantidade()) . " </td> -->
   
<?php

class VendaDao {

    private $pdo = null;

    public function __construct(){
        //pegar instancia e atribuir $pdo

        $this->pdo = Singleton::getInstance()->getPDO();
    }


    public function salvar(Venda $venda){
        //aqui dentro sempre vira um objeto

        if( !$venda->getCodigo() ){

            $sql = "INSERT INTO venda(data, quantidade, cliente, produto)
            VALUES(:data, :quantidade, :cliente, :produto)";

             $resultado = $this->pdo->prepare($sql);

        } else {

             $sql = "UPDATE venda SET data=:data, quantidade=:quantidade, cliente=:cliente,
                 produto=:produto WHERE codigo=:codigo";

             $resultado = $this->pdo->prepare($sql);
             $resultado->bindValue(":codigo",$venda->getCodigo(),PDO::PARAM_INT);
        }

            $resultado->bindValue(":data",$venda->getData(),PDO::PARAM_STR);
            $resultado->bindValue(":quantidade",$venda->getQuantidade(),PDO::PARAM_INT);
            $resultado->bindValue(":cliente",$venda->getCliente(),PDO::PARAM_INT);
            $resultado->bindValue(":produto",$venda->getProduto(),PDO::PARAM_INT);

                 $resultado->execute();
    }


    public function excluir($codigo){
        $sql = "DELETE FROM venda WHERE codigo=:codigo";
        $resultado = $this->pdo->prepare($sql);
        $resultado->bindValue(":codigo",$codigo,PDO::PARAM_INT);
        $resultado->execute();

        return $resultado->rowCount() ==1;

    }

    public function listar(){
        $vendas = array();



        $sql = "SELECT codigo, data, quantidade, cliente, produto, 'c.nome', 'p.nome' FROM venda as v 
        INNER JOIN cliente c ON 'c.codigoCli' = 'v.cliente' 
        INNER JOIN produto p ON 'p.codigoPro' = 'v.produto' 
        ORDER BY data";
        $resultado = $this->pdo->prepare($sql);
        $resultado->execute();

        while( $vendaBD = $resultado->fetch(PDO::FETCH_OBJ) ){

            $venda = new Venda();
            $venda->setCodigo($vendaBD->codigo);
            $venda->setData($vendaBD->data);
            $venda->setQuantidade($vendaBD->quantidade);

            $c = new Cliente();
            $c->setCodigoCli($vendaBD->codigoCli);
            $c->setNome($vendaBD->nome);
            $venda->setCliente($c);

            $p = new Produto();
            $p->setCodigoPro($vendaBD->codigoPro);
            $p->setNome($vendaBD->nome);
            $venda->setProduto($p);


        $vendas[] = $venda;
        print_r($vendas);

   }

        return $vendas;


        }
  }


 ?>
    
asked by anonymous 16.09.2015 / 20:30

2 answers

1

The problem seems to be your table venda the fields cliente and produto are not descriptions like joão and café, they are ids so when calling getCliente() a number is displayed.

To fix this you need to make two joins one for client and one for joins product to get their descriptions. If the fields have the same names in different tables use an alias to avoid overwriting of values in php.

This simply creates the client and product objects and sets their respective values.

Your query should look something like this, match the field names.

SELECT codigo, data, quantidade, cliente, produto,
       c.nome as nome_cliente, p.nome as nome_produto
    FROM venda as v 
    INNER JOIN cliente c ON c.codigoCli = v.cliente
    INNER JOIN produto p ON p.codigoPro = v.produto 
ORDER BY dat

Now while creating the client and product object

while( $vendaBD = $resultado->fetch(PDO::FETCH_OBJ) ){

    $venda = new venda();
    $venda->setCodigo($vendaBD->codigo);
    $venda->setData($vendaBD->data);
    $venda->setQuantidade($vendaBD->quantidade);

    $c = new Cliente();
    $c->setId($vendaBD->cliente);
    $c->setNome($vendaBD->nome_cliente);

    $venda->setCliente($c);

    $p = new Produto();
    $p->setId($vendaBD->produto);
    $p->setNomeProduto($vendaBD->nome_produto);
    $venda->setProduto($p);


    $vendas[] = $venda;
}
return $vendas;
    
16.09.2015 / 21:37
1

From what I can see the error is more banal than it seems. You're putting quotation marks around and you do not have to put that in your query query and try using the same product name and name, in which case create an alias . Do as below:

 $sql = "SELECT 
          codigo,
          data,
          quantidade,
          cliente,
          produto,
          IF(c.nome == NULL,'Nome não informado',c.nome) as nome,
          IF(p.nome == NULL,'Nome do produto não informado',c.nome) as nome_produto
        FROM venda as v 
        INNER JOIN cliente c ON (c.codigoCli = v.cliente) 
        INNER JOIN produto p ON (p.codigoPro = v.produto) 
        ORDER BY data";

Change the data field to data_reg , so you avoid SQL errors, since the word date is reserved for MySQL. >

OBS: When you put quotation marks in the type field: 'c.name', it's the same as saying that you built a string value "c.name", not that your field call the name. However you can put quotation marks in your alias because it is a name association, and especially when the alias requires a space. Something like Select c.nome AS 'Nome de Usuário' from tabela . You could also create a dummy field in this way by placing a value of type: SELECT 0 as Zero from tabela , or SELECT 'Amanda' as Nome from tabela , which would create the Zero column with value 0 and would create the Name column with Amanda value.

And where you arrow the product name, you have to change with the alias call:

$p->setNome($vendaBD->nome_produto);
    
17.09.2015 / 20:55