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
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”.
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
@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
incluibanco.php
eclasses/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.