Programação com Orientação a Objectos

Boa noite! @evaldojuniorbento Pessoal estou mais uma vez incomodando com mais um problema que estou a ter: Notice: Undefined variable: mysqli in C:\xampp\htdocs\tarefas\tarefas.php on line 12
Fatal error: Call to a member function query() on null in C:\xampp\htdocs\tarefas\classes\RepositorioTarefas.php on line 7

Apresento o código do arquivo tarefas.php

<?php

	session_start();

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

	// Passando a nossa conexao com MySQL que esta na variavel msqli
	$repositorio_tarefas = new RepositorioTarefas($mysqli);

	# Variavel de controlo para exibicao da tabela
	$exibir_tabela = true;
	
	# Esta variavel controla os erros de preenchimento dos campos do formulario
	# Ficara true conforme as validacoes acontecerem
	$tem_erros = false;
	# Guardara erros de validacao
	$erros_validacao = [];

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

	# Verifica se existe algum indice no metodo post
	if (tem_post()) {
		//$tarefa = array();

		# A funcao strlen() conta o tamanho de uma string
		if (array_key_exists('nome', $_POST) && strlen($_POST['nome']) > 0) {
			$tarefa->setNome($_POST['nome']);
		} else {
			$tem_erros = true;
			$erros_validacao['nome'] = 'O nome da tarefa é obrigatório!';
		}

		# Verifica se existe algum indice igual a descricao
		if (array_key_exists('descricao', $_POST)) {
			$tarefa->setDescricao($_POST['descricao']);
		} else {
			$tarefa->descricao('');
		}

		if (array_key_exists('prazo', $_POST) && strlen($_POST['prazo']) > 0) {
			if (validar_data($_POST['prazo'])) {
				$tarefa->setPrazo(traduz_data_para_objecto($_POST['prazo']));
			} else {
				$tem_erros = true;
				$erros_validacao['prazo'] = 'O prazo não é uma data válida!';
			}
		} else {
			$tarefa->setPrazo('');
		}

		$tarefa->setPrioridade($_POST['prioridade']);

		if (array_key_exists('concluida', $_POST)) {
			$tarefa->setConcluida(true);
		} else {
			$tarefa->setConcluida(false);
		}

		# Grava somente quando nao houver erro
		if (! $tem_erros) {
			$repositorio_tarefas->salvar($tarefa);

			if (array_key_exists('lembrete', $_POST) && $_POST['lembrete'] == '1') {
				enviar_email($tarefa);
			}

			header('Location: tarefas.php');
			die();
		}
	}

	# Busca as tarefas na base de dados e atribui o resultado ao array $lista_tarefas
	//$lista_tarefas = buscar_tarefas($conexao);
	$tarefas = $repositorio_tarefas->buscar();
	
	# Esta variavel vai ser exibida para evitar os erros de variavel nao definida
	# Para o caso de prenchimento invalido do formulario tambem
	/*$tarefa = [
		'id' => 0,
		'nome' => (array_key_exists('nome', $_POST)) ? $_POST['nome'] : '',
		'descricao' => (array_key_exists('descricao', $_POST)) ? $_POST['descricao'] : '',
		'prazo' => (array_key_exists('prazo', $_POST)) ? traduz_data_para_banco($_POST['prazo']) : '',
		'prioridade' => (array_key_exists('prioridade', $_POST)) ? $_POST['prioridade'] : 1,
		'concluida' => (array_key_exists('concluida', $_POST)) ? $_POST['concluida'] : ''
	];*/

	require "template.php";
?>

E agora apresento o código da classe RepositorioTarefas.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, 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); 
		}

		# $tarefa_id = 0 e um parametro opcional do metodo
		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);
		}
	}

?>

A variável $mysqli é criada no arquivo banco.php, certo? Ela existe lá?

Acho que ela não existe no banco.php

<?php 
	
	# Informacoes da base de dados necessarias para a criacao da conecao
	$bdServidor = '127.0.0.1';
	$bdUsuario = 'root';
	$bdSenha = '';
	$bdBanco = 'tarefas';

	# Criando a conexao com a base de daos
	$conexao = mysqli_connect(BD_SERVIDOR, BD_USUARIO, BD_SENHA, BD_BANCO);

	if (mysqli_connect_errno($conexao)) {
		echo "Problemas para conectar no banco. Erro: ";
		echo mysqli_connect_error();
		# Encerra o programa aqui sem ler o codigo que existe mais para frente
		# Caso exista algum erro na conexao
		die();
	}

	function buscar_tarefas($conexao) {
		$sqlBusca = 'SELECT * FROM tarefas';
		# Abre uma conecao com a base de dados, executa a busca e guarda os dados na variavel resultado
		$resultado = mysqli_query($conexao, $sqlBusca);

		$tarefas = [];

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

		return $tarefas;
	}

	function gravar_tarefas($conexao, $tarefa) {
		$sqlGravar = "
			INSERT INTO tarefas
			(nome, descricao, prioridade, prazo, concluida)
			VALUES 
			(
				'{$tarefa['nome']}',
				'{$tarefa['descricao']}',
				{$tarefa['prioridade']},
				'{$tarefa['prazo']}',
				{$tarefa['concluida']}
			)
		";
		# Grava os dados enviados pelo formulario
		mysqli_query($conexao, $sqlGravar);
	}

	# Busca uma tarefa de cada vez
	function buscar_tarefa($conexao, $id) {
		$sqlBusca = 'SELECT * FROM tarefas WHERE id = ' . $id;
		$resultado = mysqli_query($conexao, $sqlBusca);
		return mysqli_fetch_assoc($resultado);
	}

	# Metodo para edicao de uma determinada tarefa
	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);
	}

	# Remove tarefas 
	function remover_tarefa($conexao, $id) {
		$sqlRemover = "DELETE FROM tarefas WHERE id = {$id}";

		mysqli_query($conexao, $sqlRemover);
	}

	# Funcao responsavel por gravar anexos
	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);
	}

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

		$anexos = array();

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

		return $anexos;
	}

	# Busca um anexo de cada veez
	function buscar_anexo($conexao, $id) {
		$sqlBusca = "SELECT * FROM anexos WHERE id = " .$id;
		$resultado = mysqli_query($conexao, $sqlBusca);

		return mysqli_fetch_assoc($resultado);
	}

	# Remove um anexo de cada vez
	function remover_anexo($conexao, $id) {
		$sqlRemover = "DELETE FROM anexos WHERE id = {$id}";

		mysqli_query($conexao, $sqlRemover);
	}

?>

Pelo que ei vi o nome da variável é $conexao :slight_smile:

:man_facepalming: :grimacing: sim, é isso mesmo distracção minha. Obrigado pela atenção dispensada.