[Livro PHP e MySQL] Dúvidas em geral

Olá, @Raul.

Me parece que o problema está na variável global $contador.
O ideal é não usar variáveis globais. Elas podem gerar diversos tipos de problemas.

Em vez de uma variável global, que tal se você passar algo como $comeca_em para a função calendario()? Algo como function calendario($total_dias, $comeca_em). Aí você pode manter o controle disso fora da função calendario().

1 curtida

Obrigado @evaldojuniorbento !

Acabei começando a correção no calendário de outra forma: transformei a $contador em variável estática e a usei para colocar espaços vazios no array $semana. Mas nos meses que devem começar na segunda feira não deu certo, nos outros meses deu. Olha como ficou minha função $calendario:

function calendario($total_dias){
        $calendario = "";
        $dia = 1;
        $semana = [];
        static $contador = 0;
               
             
            if ($contador > 1){
                for($y=0; $y <= ($contador - 1); $y++){
                array_push($semana, " ");
                }
            }
       
            while($dia <= $total_dias){
                array_push($semana,$dia);

                if(count ($semana) == 7){
                    $calendario .=linha($semana);
                    $semana = [];
                } else {
                    $contador = count($semana);
                    
                }

                $dia++;
            }
                
                $calendario .=linha($semana);  
                echo $contador;
                
               

                return $calendario;     
        }

Muito Obrigado!

Eu também estou com esse problema, você conseguiu resolver? Parece que a função tem post retorna false e não exibe nada na tela. A exibição de erros do PHP está habilitada mas não aparece nenhum erro
@evaldojuniorbento

Você também pode tentar exibir as variáveis para entender o que está acontecendo. Tipo fazer echo ou usar print_r().

A função tem_erros() retorna false e o array $_post fica vazio;
A variável $tarefas retorna todas as tarefas mas a variável $tarefa fica vazia e $tarefa_id retorna null. Comparei meus códigos com os do livro e não encontrei a diferença:

<?php
    class Tarefa{

        private $id;
        private $nome;
        private $descricao;
        private $prazo;
        private $prioridade;
        private $concluida;
        private $anexos = [];

        public function setId(int $id){
            $this -> id = (int) $id;
        }

        public function getId($id) : int {
            return $this -> $id;
        }

        
        public function setNome(string $nome){
            $this -> nome =  $nome;
        }

        public function getNome($nome) : string{
            return $this -> $nome;
        }

        
        public function setDescricao( string $descricao){
            $this -> descricao =  $descricao;
        }

        public function getDescricao($descricao) : string {
            return $this -> $descricao;
        }

        
        public function setPrazo( string $prazo){
            $this -> prazo =  $prazo;
        }

        public function getPrazo($prazo) : string {
            return $this -> $prazo;
        }

        
        public function setPrioridade( int $prioridade){
            $this -> prioridade =  $prioridade;
        }

        public function getPrioridade($prioridade) : int {
            return $this -> $prioridade;
        }


    public function setConcluida( bool $concluida){
        $this -> concluida =  $concluida;
    }

    public function getConcluida($concluida) : bool {
        return $this -> $concluida;
    }


    public function setAnexos( array $anexos){
        $this -> anexos =  [];

        foreach ($anexos as $anexo){
            $this->adicionarAnexo($anexo);
        }
    }

    public function adicionarAnexo(Anexo $anexo)
    {
        array_push($this->anexos, $anexo);
    }

    public function getAnexos() : array {
        return $this -> anexos;
    }


    }

    ?>

A RepositorioTarefas ficou assim:

<?php
//Arquivo classes/RepositorioTarefas.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, prioridade, 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;
        
    }

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

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

?>

tarefas.php

<?php session_start(); 

require 'config.php';
require 'banco.php';
require 'ajudantes.php';
require 'classes/Tarefa.php';
require 'classes/RepositorioTarefas.php';

$repositorio_tarefas = new RepositorioTarefas($conexao);

$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'] = 'O prazo não é uma data válida';} 
            
            }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";?>

E tabela.php:

<table>

<tr>

<th>Tarefas</th>

<th>Descriçao</th>

<th>Prazo</th>

<th>Prioridade</th>

<th>Concluída</th>

<th>Opções</th>

</tr>

<?php foreach($tarefas as $tarefa) : ?>

<tr>

<td>

<a href =“tarefa.php?id=<?php echo $tarefa->getId();?>”>

<?php echo $tarefa->getNome(); ?>

</a>

</td>

<td><?php echo $tarefa->getDescricao(); ?></td>

<td><?php echo traduz_data_para_exibir($tarefa->getPrazo()); ?></td>

<td><?php echo traduz_prioridade($tarefa->getPrioridade()); ?></td>

<td><?php echo traduz_concluida($tarefa-getConcluida()); ?></td>

<td>

<a href=“editar.php?id=<?php echo $tarefa->getId(); ?>”>Editar</a>

<a href=“remover.php?id=<?php echo $tarefa->getId(); ?>”>Remover</a>

</td>

</tr>

<?php endforeach; ?>

</table>

O código parece ok. Mas eu vi que você cria um objeto do tipo tarefa e depois, caso tenha POST, você usa um array para colocar os dados da tarefa. Aqui você poderia usar apenas o objeto mesmo.

Boa noite a todos.
Estou construindo o projeto tarefas.php e findando o capítulo 11. Até aqui meu código se comportou perfeitamente, porem quando implementei a inclusão de anexos… puff! deu ruim!
Os anexos não são salvos no diretório e também seus dados no banco não são salvos. Meu sistema é Linux Mint e fiz as permissões na pasta conforme orienta o livro e até pensei que poderia ser isto, então comecei a fazer alguns testes e após deixar o if(tem_post) do arquivo tarefa.php (no singular) em comentário, consegui salvar o arquivo no diretório porem nem um dado é enviado para o banco e o formulário no template_tarefa.php não carrega as informações do anexo… isso é bem obvio já que o banco não recebe qualquer informação dos arquivos. Em fim, o que fazer?

Oi, @acassio. Pode ser que o seu form para enviar o arquivo esteja como GET e não como POST.

Boa noite. Obrigado por responder tão rápido. Quanto a sua suspeita a resposta é não. O método do form esta “post”. A diferença é que estava minusculo então corrigi para maiúsculo mas não mudou nada.
Posso colocar o código aqui para melhor analisar?

Aqui tem todos os codigos que trabalhei até agora.

A melhor coisa a fazer, @acassio, é continuar fazendo o debug. Tente imprimir os valores das variáveis, arrays, etc usando print_r() ou var_dump() para entender cada etapa.
Algo interessante que você pode atacar logo de começo é entender o motivo de tem_post() não funcionar.

Otimo. Comecei a fazer isso mas minha duvida era se eu tinha errado o código do livro mas nao errei (pelo menos nao identifiquei). Vc ja deve ter feito este codigo né? Funcionou com codigo identico ao do livro? Teve alguma correção do codigo apos a publicação?

Eu fiz o código sim, @acassio. Os exemplos do livro estão em https://github.com/InFog/phpmysql/tree/master/edicao2

@evaldojuniorbento Bom dia!
Que dia maravillhoso!!! descobri o problema! Que m***a simples e danada de achar. Era só a atribuição do nome do label no template_tarefa… acredita??? hahahaha. Estou rinto atoa agora. Duas semanas sem avançar no livro por causa de um sinal de “=”… estava assim no meu código: <input type=“hidden” name"tarefa_id" value="…
Obrigado pelas dicas e foi no debug que descobri que o problema estava na $tarefa_id. Agora vou terminar de ler seu livro! Valeu! Bom final de semana para você!

Legal, @acassio!!! Bons estudos :slight_smile:

Bom Dia!.
Eu posso postar no forum os desafios realizados?

Oi, @Max. Eu não vejo problemas.

Bom dia, Evaldo. Cara, eu não estou conseguindo retornar a minha lista de tarefas, usando aquele código que está na página 36 do livro. Ele é exibido no navegador, mas quando eu submeto os dados ele não aparece abaixo do formulário. Segue o código:

Gerenciador de Tarefas


Grenciador de Tarefas




Nova Tarefa

Tarefa:





<?php
$lista_tarefas = array();
		if(isset($_GET['nome'])){
			$lista_tarefas[] = $_GET['nome'];
		}
	?>
<table>
	<tr>
		<th>Tarefas</th>
	</tr>

	<?php foreach ($lista_tarefas as $tarefa) : ?>
		<tr>
			<td><?php echo $tarefa; ?></td>
		</tr>
	<?php endforeach; ?>
</table>
</body>

Reenviando o código:

Olá, @yuri.

Pode ser que os dados não estejam na requisição.

Tente fazer o seguinte, verifique os dados dentro do array $_GET:

<?php print_r($_GET); ?>

Também pode ser um problema com o array $lista_tarefas, vale a pena verificar o seu conteúdo antes do foreach:

<?php

echo "O conteúdo do array lista_tarefas é: ";
print_r($lista_tarefas);
echo "O conteúdo acabou aqui."
?>