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

Mesmo sem criar as variáveis, sistema funciona!

Mesmo eu não criando as variáveis $produto e $usado no arquivo produto-formulario.php, o sistema funciona normalmente. Ou seja, o formulário para adicionar produtos carrega normalmente, sem erros e com os campos vazios. Não deveria apresentar erros neste ponto?

8 respostas

É possível usar variáveis não declaradas. Isto depende da configuração do servidor, mas normalmente erros são apresentados. Fica mais fácil de checar se vc compartilhar o código.

Neste formulário, o include("produto-formulario-base.php"); chama as duas variáveis mencionadas. E como explicado no curso, elas deveriam ser criadas para a tela abrir normalmente e com os campos vazios, como nas duas linhas comentadas no código abaixo:

<?php 
    include("cabecalho.php");
    include("conecta.php");
    include("banco-categoria.php");
    include("logica-usuario.php");

        verificaUsuario();
        #$produto = array("nome" => "", "descricao" => "", "preco" => "", "categoria_id" => "1");
        #$usado = "";
        $categorias = listaCategorias($conexao);
?>            
        <h1>Formulário de Produto</h1>
        <form action="adiciona-produto.php" method="POST">
              <table class="table">
             <?php include("produto-formulario-base.php"); ?>
                <tr>
                   <td><input class="btn btn-primary" type="submit" value="Cadastrar"/></td>
                </tr>
              </table>
            </form>
<?php include("rodape.php");?>

produto-formulario-base.php:

<tr>
    <td>Produto:</td>
    <td><input class="form-control" type="text" name="nome" value="<?=$produto['nome']?>"/></td>
</tr>
<tr>
    <td>Preço:</td>
    <td><input class="form-control" type="number" name="preco" value="<?=$produto['preco']?>"/></td>
</tr>
<tr>
    <td>Descrição:</td>
    <td><textarea class="form-control" name="descricao"/><?=$produto['descricao']?></textarea></td>
</tr>
<tr>
    <td></td>
    <td><input type="checkbox" name="usado" <?=$usado?> value="true">Usado</td>
</tr>
<tr>
    <td>Categoria:</td>
    <td>
        <select name="categoria_id" class="form-control">
        <?php
            #$categorias = listaCategorias($conexao);
            foreach($categorias as $categoria) : 
                $essaEhACategoria = $produto['categoria_id'] == $categoria['id'];
                $selecao = $essaEhACategoria ? "selected" : "";
        ?>
                <option value="<?=$categoria['id']?>" <?=$selecao?>>
                    <?=$categoria['nome']?>
                </option>    
        <?php endforeach ?>
    </select>
    </td>
</tr>

Se no teu arquivo php.ini tiver a linha abaixo, os avisos, sobre variáveis não declaradas, não serão exibidos.

error_reporting = E_ALL & ~ E_NOTICE

Então, altere o php.ini para que fique assim:

error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT

Isto fará com que os avisos de variáveis não declaradas sejam exibidos.

Eu tenho a seguinte linha no código de meu cabecalho.php:

error_reporting(E_ALL ^ E_NOTICE);

Comentei esta linha e realmente apareceu vários erros na página.

Mas então quer dizer que não chega acontecer um problema? Pois, com as notificações desabilitadas e sem usar as linhas de atribuição nas variáveis, eu consigo inserir dados no formulário normalmente. Não é só uma questão de aparecer ou não os erros do php.

Você consegue inserir dados normalmente, porque neste caso os dados não dependem dos valores das variáveis. Os valores serão informados pelo usuário.

Problemas podem aparecer no caso das "categorias" porque dependem dos valores lidos anteriormente do banco e armazenados na variável "categorias".

Mas, no momento de alterar dados será um problema, pois a alteração depende dos valores das variáveis.

É uma boa prática inicializar (atribuir valores) às variáveis antes de usá-las.

Mas é aí que está a questão, estes campos dependem de valores lidos anteriormente, assim como o de categorias. Eles são um include do formulário base que é utilizado no formulário de alteração de produtos, ou seja, o código carregado nos campos: "nome", "valor", "descricao" e "usado", chamam essas variáveis que previamente o banco deveria ter fornecido. Dê uma olhada no segundo código que enviei acima para ficar mais claro. É por isso que não estou entendendo.

solução!

Entendi, Marcelo.

O correto é que as variáveis sejam inicializadas com os valores que vem do banco.

Mas, a depender da configuração de exibição de alertas/erros o PHP executará o código de forma "incorreta" e não apresentará o problema ao usuário.

No caso de inclusão de novos valores isto não será percebido, mas na alteração de valores isto gerará problemas.

O correto é inicializar as variáveis da linha que você comentou. Sem estas linhas os valores não serão carregados, apesar do script não apresentar erro.

Não sei se consegui explicar.

Conseguiu sim Gabriel. Existe um problema ali mas ele não é perceptível, e dependendo da circunstância, poderá gerar problemas maiores.

Mas a minha intenção era mesmo deixar aquelas duas linhas gerando valores em branco para as variáveis. Eu só queria era entender o porquê de continuar funcionando sem elas.

Muito obrigado pela atenção Gabriel. Grande abraço.