[Livro PHP e MySQL] Dúvidas em geral

php-mysql

#127

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().


#128

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!


#130

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


#131

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


#132

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>


#133

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.


#134

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?


#135

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


#136

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?


#137

Aqui tem todos os codigos que trabalhei até agora.


#138

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.


#139

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?


#140

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


#141

@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ê!


#142

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