Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Duvidas declarações de variaveis e objetos

Vamos lá,

Na seleção dos dados do banco: Qual a diferença entre a query e o fetch_assoc?

Na aplicação destas funções que retornaram do banco:

A função editaProduto e logo abaixo definiu uma variavel para o resultado dela... Faz super sentido, mas funcionaria sem essa nova definição?

Pq até então tratamos o como $produto os detalhes do produto, inclusive no banco, a partir daqui terei que usar $produtoCarregado?

Falo isso pq no exemplo da aula 2, para o produto-lista.php o professor utiliza na função do banco como $produto ($produto->id... etc) veja:

//função de listar produtos
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 p.categoria_id = c.id");
    while($produto_atual = mysqli_fetch_assoc($resultado)) {
        $produto = new Produto;
        $categoria = new Categoria;
        $categoria->nome = $produto_atual['categoria_nome'];
        $produto->id = $produto_atual['id'];
        $produto->nome = $produto_atual['nome'];
        $produto->preco = $produto_atual['preco'];
        $produto->descricao = $produto_atual['descricao'];
        $produto->categoria = $categoria;
        $produto->usado = $produto_atual['usado'];
        $produto->concluido = $produto_atual['concluido'];
        $produto->data_criacao = $produto_atual['data_criacao'];
        $produto->data_modificado = $produto_atual['data_modificado'];

        array_push($produtos, $produto);
    }

    return $produtos;
}

E para lista-los, ele print usando o termo : <?= $produto->nome ?>

Eu estou levantando essa questão pq neste exemplo funcionou chamar a variavel que imprime do mesmo nome do que chamamos no banco, mas na hora do edita-produto acabou que não funcionou...

Tenho outra questão ainda sobre o que preciso declarar entre parenteses () na hora de chamar uma função:

Veja que neste exemplo agente criou um novo objeto Produto e falamos que ele chama $produto, e lá no banco fizemos isso de novo... Testei aqui e vi que também funcionaria chamando o termo que recebemos do $_GET de somente $id na função do banco:

O codigo do edita-produto ficou assim:

$produto = new Produto;
$id = $_GET['id'];
$produtoCarregado = editaProduto($conexao, $produto);
echo $produtoCarregado->id ."</br>";
echo $produtoCarregado->nome ."</br>";
echo $produtoCarregado->preco ."</br>";
echo $produtoCarregado->descricao ."</br>";
echo $produtoCarregado->data_criacao ."</br>";
Mas assim também funciona: Pagina

$id = $_GET['id'];
$produtoCarregado = editaProduto($conexao, $id);
echo $produtoCarregado->id ."</br>";
echo $produtoCarregado->nome ."</br>";

Banco

function editaProduto($conexao, $id) { 
$query = "select * from produtos where id = {$id}";

Levando em consideração que também funciona, qual comportamento você indica?

3 respostas
solução!

Oi Igor,

Nossa, quantas dúvidas junto. Vou tentar responder todas:

  • Na seleção dos dados do banco: Qual a diferença entre a query e o fetch_assoc?

Não entendi bem o que é a query que se refere, porém o fetch_assoc tem a vantagem de retornar um array associativo, onde o nome da coluna no banco de dados é o nome da chave do array. Assim fica mais fácil obter os valores do array, do que posicional.

$nome = $resultado['nome'];
// O modo acima é mais fácil de entender do que assim:
$nome = $resultado[0];

Seria essa a dúvida?

  • A função editaProduto e logo abaixo definiu uma variavel para o resultado dela... Faz super sentido, mas funcionaria sem essa nova definição?

Também não entendi bem a que se refere, poderia ser mais específico?

  • Pq até então tratamos o como $produto os detalhes do produto, inclusive no banco, a partir daqui terei que usar $produtoCarregado?

Tanto $produto como $produtoCarregado são apenas variável, você pode usar qualquer uma das duas onde desejar. Mudamos o nome da variável apenas para dar mais semântica.

Perceba que a diferença do $produto para a variável $produto_atual no código que você colocou acima, é que $produto é o objeto que você está criando, lembre-se para que serve o new. Já o $produto_atual é o array com resultados do banco de dados que você está utilizando. Usando objetos, agora temos que usar a variável, que no caso é $produto para chegar aos atributos do objeto produto, que é o id, por isso o código fica assim: $produto->id.

  • Levando em consideração que também funciona, qual comportamento você indica?

Sempre que estamos usando objetos, é sempre melhor trabalhar com os objetos e não com com atributos soltos. Por exemplo, se para fazer o select do produto você precisasse também do preço, o que seria necessário mudar para que seu código funcionasse?

function editaProduto($conexao, $id) {
  ...
}

Seu código ficaria assim:

function editaProduto($conexao, $id, $preco) {
  ...
}

Já quando usamos objetos, podemos usar todos os valores dos objetos sem precisar mudar, o que chamamos de assinatura do método. Os dois casos acima seriam atendidos por:

function editaProduto($conexao, $produto) {
  ...
}

Uma vez que dentro do objeto $produto já temos tudo o que precisamos referente ao produto, não precisamos mudar o nome do método, nem os parâmetros que ele recebe.

Espero que tenho ajudado.

Abraço.

Oi Igor,

referente a diferença entre mysqli_query e mysqli_fetch_assoc:

O mysqli_query executa o SQL e returna um objeto do tipo mysqli_result que representa um conjunto de resultados que vem do banco de dados. só que esses resultados não são tão facil de pegar. por isso usamos o mysqli_fetch_assoc que retorno aquele array associativo que o paulo mencionou, ok?

abs

Opa Paulo e Nico!

Obrigado pelo retorno galera e desculpa o atraso!

Eu acabei descobrindo a resposta de algumas dessas perguntas ao longos desses dias quando fui alterando meu codigo e fui percebendo a aplicação dessas declarações...

E Paulo, é justamente isso, trabalhar com objeto é realmente mais semantico, e quando você diz semântico acredito que não é somente para o sistema do google ler nosso site, como vi no curso de css, mas também para quem for dar manutenção e usar o código conseguir entender melhor o que está sendo declarado e tals...

Apesar dessa técnica ser um pouquinho mais complicada para mim neste momento... Mas eu chego lá! hehe

O que estava embananando na minha cabeça é que até então para mim só existia uma forma de fazer as coisas, e como a didática do curso passa por varias técnicas para o mesmo objetivo eu fiquei meio confuso... Sobre o que usar e etc.

Mas depois de brincar com os códigos passados e aplica-los em outros exemplos percebi que essa frase cabe muito bem na programação:

"...no php existe pelo menos três formas de conseguir o mesmo objetivo..."

Muito obrigado pela atenção galera!