[Livro PHP e MySQL] Dúvidas em geral

Você tem mais de um arquivo de template ou o index? Me parece que você está acessando a aplicação por uma versão diferente da que você está mostrando. Pois colocar essa linha antes do include do template faz com que a variável exista.

O código de separação entre HTML e PHP retorna erro quando carrego o arquivo template.php…

Erro :
Notice: Undefined variable: lista_tarefas in C:\xampp\htdocs\tarefas\template.php on line 48

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\tarefas\template.php on line 48

    <?php

session_start();

if (isset($_GET['nome']) && $_GET['nome'] != '') {
	$tarefa = array();
	
	$tarefa['nome'] = $_GET['nome'];
	
	if (isset($_GET['descricao'])) {
		$tarefa['descricao'] = $_GET['descricao'];
	}else{
		$tarefa['descricao'] = '';
	}
	
	if (isset($_GET['prazo'])) {
		$tarefa['prazo'] = $_GET['prazo'];
	}else{
		$tarefa['prazo'] = '';
	}
	
	$tarefa['prioridade'] = $_GET['prioridade'];
	
	if (isset($_GET['concluida'])) {
		 $tarefa['concluida'] = $_GET['concluida'];
	}else{
		$tarefa['concluida'] = '';
	}
	
	$_SESSION['lista_tarefas'][] = $tarefa;

}

if (isset($_SESSION['lista_tarefas'])) {
	$lista_tarefas = $_SESSION['lista_tarefas'];
}else{
	$lista_tarefas = array();
}

include "template.php";

?>

Então, no diretório tenho a seguinte estrutura.

/casa_codigo/php_mysql/cap06

No diretório só tenho os arquivos template.php e tarefas.php

Ainda no diretório tenho a subpasta CSS/ que contem o arquivo com o código CSS

Ok, vamos fazer assim:

Crie um arquivo chamado teste_tarefas.php e um teste_template.php. O conteúdo de teste_tarefas.php deve ser o seguinte:

<?php
$lista_tarefas = array("a", "b", "c");
include "teste_template.php";

Já em teste_template.php:

<html>
    <?php foreach ($lista_tarefas as $tarefa): ?>
        <h2><?php echo $tarefa; ?>
    <? endforeach; ?>
</html>

Me passa o resultado depois.

Acontece o mesmo erro

Notice: Undefined variable: lista_tarefas in c:\xampp\htdocs\casa_codigo\php_mysql\cap06\teste_template.php on line 3

Warning: Invalid argument supplied for foreach() in: c:\xampp\htdocs\casa_codigo\php_mysql\cap06\teste_template.php

Acho que vou testar em um ambiente diferente para ver o que acontece.

Oi, Ricardo.

Como você está chamando o script na URL? Chamando template.php ou
tarefas.php?

Evaldo Junior
http://evaldojunior.com
@InFog9 https://twitter.com/InFog9

Então, estou chamando o teste_template.php
localhost/estudo_php/casa_codigo/cap06/teste_template.php

E também tentei direto na raiz do webserver
localhost/teste_template.php

Esse teste eu realizei no novo ambiente, neste caso com o Linux e PHP 5.6

Entendi!

Você precisa chamar o arquivo “tarefas.php” ou o “teste_tarefas.php” no caso deste último teste, não o template :slight_smile:
O tarefas vai fazer a inclusão do arquivo de template.

Abraços

Wowww, funcionou @evaldojuniorbento, achei que deveria chamar o arquivo com HTML, já que geralmente é isso que fazemos, ao invés do código PHP.

Agora vou continuar a leitura do livro.

Muito obrigado!!!

@evaldojuniorbento Estou tendo problemas para passar o ID entre tarefas.php->editar.php. Ele só está passando o ID que é posto no array antes do require “template.php”.

Não entendi a sua dúvida. @jhow.

referente ao cap. 9 (editar), o arquivo editar.php tem que receber por parâmetro (GET) o ID da tarefa, mas quando ele ele é chamado só vai com id=0. Se eu manualmente digitar o ID na página editar.php, ele funciona normalmente.

Ah, sim. Como está o seu código para exibir o link de editar tarefas?

Never mind já resolvi, digitei a variável errada no foreach() pra aparecer a tabela.

Legal! que bom que você conseguiu resolver :slight_smile:

@evaldojuniorbento Boa noite Evaldo, poderia me ajudar com o capitulo 14? Está dando um erro em que não declarei a variável mysqli, devo trocar por $conexao? ou é outra coisa:

.

Segue os arquivos abaixo:

tarefas.php
<?php

session_start();
require_once "config.php";
require_once "banco.php";
require_once "helper.php";
require_once "classes/Tarefa.php";
require_once "classes/RepositorioTarefas.php";

$repositorio_tarefas = new RepositorioTarefas($mysqli);

$exibir_tabela = true;
$tem_erros = false;
$erros_validacao = [];

$tarefa = new Tarefa();
$tarefa->setPrioridade(1);

if (tem_post()) {

    $tarefa = [];

    if(array_key_exists('nome', $_POST) && strlen($_POST['nome'])>0){
        $tarefa['nome'] = $_POST['nome'];
    }else{
        $tem_erros = true;
        $erros_validacao['nome'] = 'O nome da tarefa é obrigatório!';
    }

        if (array_key_exists('descricao', $_POST)) {
            $tarefa['descricao'] = $_POST['descricao'];
        }else {
            $tarefa['descricao'] = '';
        }

        if (array_key_exists('prazo', $_POST) && strlen($_POST['prazo'])>0) {
            if(validar_data($_POST['prazo'])){
                $tarefa['prazo'] = traduz_data_para_banco($_POST['prazo']);
            } else{
                $tem_erros = true;
                $erros_validacao['prazo'] = 'A data inserida não é válida! Padrão - DD/MM/AAAA';
            }
        }else{
            $tarefa['prazo'] = '';
        }

            $tarefa['prioridade'] = $_POST['prioridade'];

        if (array_key_exists('concluida', $_POST)) {
            $tarefa['concluida'] = 1;
        } else {
            $tarefa['concluida'] = 0;
        }
    
    if(! $tem_erros){
        gravar_tarefa($conexao, $tarefa);

        if(array_key_exists('lembrete', $_POST) && $_POST['lembrete']=='1'){
            enviar_email($tarefa);
        }
        
            header('Location:tarefas.php');
            die();    
       
    }       
}

    $tarefas = $repositorio_tarefas->buscar();

include “template.php”;
?>

<?php
class RepositorioTarefas{
    private $conexao;

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

    public function salvar(Tarefa $tarefa)
   {
       $nome = $tarefa->getNome();
       $descricao = $tarefa->getDescricao();
       $prioridade = $tarefa->getPrioridade();
       $prazo = $tarefa->getPrazo();
       $concluida = ($tarefa->getConcluida()) ? 1 : 0;

       if(is_object($prazo)){
           $prazo = $prazo->format('Y-m-d');
       }

       $sqlGravar = "
        INSERT INTO tarefas
        (nome, descricao, prioriodade, prazo, concluida)
        VALUES
        ('{$nome}', '{$descricao}', {$prioridade}, '{$prazo}', {$concluida})
       ";

       $this->conexao->query($sqlGravar);
   }

   public function atualizar(Tarefa $tarefa)
   {
       $id = $tarefa->getId();
       $nome = $tarefa->getNome();
       $descricao = $tarefa->getDescricao();
       $prioridade = $tarefa->getPrioridade();
       $prazo = $tarefa->getPrazo();
       $concluida = ($tarefa->getConcluida()) ? 1 : 0;

       if(is_object($prazo)){
           $prazo = $prazo->format('Y-m-d');
       }

       $sqlEditar = "
        UPDATE tarefas SET
            nome = '{$nome}', descricao = '{$descricao}', prioridade = {$prioridade},
            prazo = '{$prazo}', concluida = {$concluida}
            WHERE id = {$id}
       ";

       $this->conexao->query($sqlEditar);
   }

   public function buscar($tarefa_id = 0)
   {
       if($tarefa_id > 0){
           return $this->buscar_tarefa($tarefa_id);
       }else{
           return $this->buscar_tarefas();
       }
   }

   private function buscar_tarefas()
   {
       $sqlBusca = 'SELECT *  FROM tarefas';
       $resultado = $this->conexao->query($sqlBusca);

       $tarefas = [];

       while($tarefa = $resultado->fetch_object('Tarefa')){
           $tarefas[] = $tarefa;
       }

       return $tarefas;
   }

   private function buscar_tarefa($tarefa_id)
   {
        $sqlBusca = 'SELECT * FROM tarefas WHERE id = {$tarefa_id}';
        $resultado = $this->conexao->query($sqlBusca);
        $tarefa = $resultado->fetch_object('Tarefa');

        return $tarefa;
   }

   public function remover($tarefa_id)
   {
        $sqlRemover = 'DELETE FROM tarefas WHERE id = {$tarefa_id}';

        $this->conexao->query($sqlRemover);
   }
}
?>

Oi, @coder. De onde vem a variável $mysqli usada no construtor da classe RepositorioTarefas? Confere se no nome da variável está correto.

@evaldojuniorbento Aí que surgiu a dúvida, no livro ela não foi declarada assim antes (pelo menos não lembro). O único lugar que aparece essa “variável” é no banco.php. Será que tenho que trocar por $conexao?

<?php

$conexao = mysqli_connect(BD_SERVIDOR, BD_USUARIO, BD_SENHA, BD_BANCO);

if(mysqli_connect_errno($conexao)){
        echo "Problemas ao conectar no banco. Erro: ";
        echo mysqli_connect_error();
die();
}

function buscar_tarefas($conexao){
        $sqlBusca = 'SELECT * FROM tarefas ORDER BY `tarefas`.`prioridade` DESC'; $resultado = mysqli_query($conexao, $sqlBusca);

        $tarefas = [];

        while($tarefa = mysqli_fetch_assoc($resultado)){
                $tarefas[] = $tarefa;
        }

        return $tarefas;
}

function buscar_tarefa_byId($conexao, $id) {
        $sqlBusca = 'SELECT * FROM tarefas WHERE id = ' . $id;
        $resultado = mysqli_query($conexao, $sqlBusca);
        return mysqli_fetch_assoc($resultado);
        }

function gravar_tarefa($conexao, $tarefa)
        {
                $sqlGravar = "
                        INSERT INTO tarefas
                        (nome, descricao, prioridade, prazo, concluida)
                        VALUES
                        (
                        '{$tarefa['nome']}',
                        '{$tarefa['descricao']}',
                         {$tarefa['prioridade']},
                        '{$tarefa['prazo']}',
                         {$tarefa['concluida']}
                 )";

        mysqli_query($conexao, $sqlGravar);
}

function editar_tarefa($conexao, $tarefa){
        $sqlEditar = "
                UPDATE tarefas SET
                nome = '{$tarefa['nome']}',
                descricao = '{$tarefa['descricao']}',
                prioridade = {$tarefa['prioridade']},
                prazo = '{$tarefa['prazo']}',
                concluida = {$tarefa['concluida']}
                WHERE id = {$tarefa['id']}
        ";

        mysqli_query($conexao, $sqlEditar);
}

function remover_tarefa($conexao, $id){
        $sqlRemover = "DELETE from tarefas WHERE id = ".$id;

        mysqli_query($conexao, $sqlRemover);
}

function gravar_anexo($conexao, $anexo){
        $sqlGravar = "INSERT INTO anexos
                (tarefa_id, nome, arquivo)
                VALUES
                (
                        {$anexo['tarefa_id']},
                        '{$anexo['nome']}',
                        '{$anexo['arquivo']}'
                )
        ";

        mysqli_query($conexao, $sqlGravar);
}

function buscar_anexos($conexao, $tarefa_id){
        $sqlBusca = "SELECT * FROM anexos WHERE tarefa_id = {$tarefa_id}";
        $resultado = mysqli_query($conexao, $sqlBusca);

        $anexos = [];

        while ($anexo = mysqli_fetch_assoc($resultado)){
                $anexos[] = $anexo;
        }
        return $anexos;
}

function buscar_anexo($conexao, $id){
        $sqlBusca = "SELECT * FROM anexos WHERE id = ".$id;
        $resultado = mysqli_query($conexao, $sqlBusca);

        return mysqli_fetch_assoc($resultado);
}

function remover_anexo($conexao, $id){
        $sqlRemover = "DELETE FROM anexos WHERE id = ".$id;
        mysqli_query($conexao, $sqlRemover);
}

?>

Oi, @coder, o nome da variável no arquivo banco.php deve continuar como $mysqli, assim como é passado na criação do objeto da classe RepositorioTarefas. Dentro da classe a váriável pode ter outro nome.

O fluxo de deve ser assim:

  • Arquivo banco.php define a variável $mysqli.
  • Arquivo tarefas.php inclui banco.php e classes/RepositorioTarefas.php.
  • Arquivo tarefas.php define um novo objeto $repositorio_tarefas passando a conexão $mysqli para a classe.

Pode ser que exista um problema na sua conexão com o banco, por isso a variável $mysqli está vazia.

Entendi, o que eu posso fazer então? Já revisei o capitulo até essa parte umas 6 vezes e não consigo visualizar onde errei.