[Livro PHP e MySQL] Dúvidas em geral

Você pode tentar analisar o conteúdo da variável $mysqli antes de passá-la para o construtor da classe RepositorioTarefas. Faça isso usando um print_r(), por exemplo.

require_once "banco.php";

print_r($mysqli); die();

Se o resultado for uma página em branco significa que a conexão com o banco não está funcionando.

Fiz isso antes de criar o construtor e está dando a mesma coisa.

Notice : Undefined variable: mysqli in C:\xampp\htdocs\www\livro1CC\tarefas\classes\RepositorioTarefas.php on line 2

E também depois que a função mysqli_connect é usada no banco.php:

Notice : Undefined variable: mysqli in C:\xampp\htdocs\www\livro1CC\tarefas\banco.php on line 11

Aí está a resposta. A variável $mysqli não foi definida. Verifique se o arquivo banco.php está definindo a variável corretamente.

Revi o capitulo 12.2 para ver se faltou algo, inclui algumas declarações e agora está dizendo que as funções buscar já estão sendo declaradas: Conflito com as novas funções do cap. 14?

Fatal error : Cannot redeclare buscar_tarefas() (previously declared in C:\xampp\htdocs\www\livro1CC\tarefas\banco.php:11) in C:\xampp\htdocs\www\livro1CC\tarefas\banco.php on line 21

<?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);
}
?>

Você está incluindo o arquivo duas vezes?

Resolvi isso e voltou o de novo o problema hauahuah sad

Notice : Undefined variable: mysqli in C:\xampp\htdocs\www\livro1CC\tarefas\tarefas.php on line 10

Fatal error : Uncaught ArgumentCountError: Too few arguments to function RepositorioTarefas::buscar(), 0 passed in C:\xampp\htdocs\www\livro1CC\tarefas\tarefas.php on line 68 and exactly 1 expected in C:\xampp\htdocs\www\livro1CC\tarefas\classes\RepositorioTarefas.php:58 Stack trace: #0 C:\xampp\htdocs\www\livro1CC\tarefas\tarefas.php(68): RepositorioTarefas->buscar() #1 {main} thrown in C:\xampp\htdocs\www\livro1CC\tarefas\classes\RepositorioTarefas.php on line 58

Você pode criar um zip do seu código e me mandar tudo?

Encontrou o problema? Eu ia te mandar privado mas não sei onde fazer isso.

Oi @coder só agora eu consegui olhar o código.

No arquivo banco.php você define uma variável chamada $conexao, mas no arquivo tarefas.php você tenta iniciar o objeto da classe RepositorioTarefas passando uma variável chamada $mysqli.

Duas soluções são possíveis aqui: Renomear a variável $conexao para $mysqli ou usar a variável $conexao quando for iniciar o objeto da classe RepositorioTarefas.

Após a parte sobre sessões, tentei fazer o desafio que seria uma lista de contatos, com o nome o telefone, só que o array sempre limpa e fica somente o ultimo cadastrado, porém, não consegui achar o erro.

<?php session_start();?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Lista de Contatos</title>
</head>
<body>
<form action="">
        <fieldset>
            <legend>Novo Contato</legend>
            <label>
                Nome: 
                <input type="text"name="nome" />
            </label>
            <label>
                Telefone:
                <input type="text" name="telefone"> 
            </label>
            <input type="submit" value="Cadastrar">
        </fieldset>
    </form>
    <?php 
        if(isset($_GET['nome'])){
            $_SESSION['listaContatos']['nome'] = $_GET['nome'];
            $_SESSION['listaContatos']['telefone'] = $_GET['telefone'];
           
        }
        $listaContatos = array();

        if(isset($_SESSION['listaContatos'])){
            $listaContatos = $_SESSION['listaContatos'];
        }
        var_dump($_SESSION['listaContatos']);
    ?>

    <table>
        <tr>
            <tr>Contatos</tr>
        </tr>
        <?php foreach ($listaContatos as $contatos) :?>
            <tr>
                <td><?php echo $listaContatos['nome']; ?></td>
            
                <td><?php echo $listaContatos['telefone']; ?></td>
            </tr> 
        <?php endforeach?>
    </table>
</body>
</html>

Olá @br.ananias.

Eu encontrei alguns erros no seu script. O primeiro é que você sempre coloca os dados do contato no mesmo índice do array, assim ele não cria um novo índice.
O outro é no laço foreach que deve usar a variável $contato internamente e não o $listaContatos.

Eu fiz alguns ajustes no script:

<?php session_start();?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Lista de Contatos</title>
</head>
<body>
<form action="">
        <fieldset>
            <legend>Novo Contato</legend>
            <label>
                Nome:
                <input type="text"name="nome" />
            </label>
            <label>
                Telefone:
                <input type="text" name="telefone">
            </label>
            <input type="submit" value="Cadastrar">
        </fieldset>
    </form>
    <?php
        $listaContatos = array();

        if(isset($_SESSION['listaContatos'])){
            $listaContatos = $_SESSION['listaContatos'];
        }

        if(isset($_GET['nome'])){
            $contato = array();
            $contato['nome'] = $_GET['nome'];
            $contato['telefone'] = $_GET['telefone'];

            $listaContatos[] = $contato;
        }

        $_SESSION['listaContatos'] = $listaContatos;
    ?>

    <table>
        <tr>
            <tr>Contatos</tr>
        </tr>
        <?php foreach ($listaContatos as $contatos) :?>
            <tr>
                <td><?php echo $contatos['nome']; ?></td>

                <td><?php echo $contatos['telefone']; ?></td>
            </tr>
        <?php endforeach?>
    </table>
</body>
</html>

Abraços

Obrigado por esclarecer!!!

Ola,

Na pagina 49 do livro de php com mysql está com o seguinte erro:

Parse error : syntax error, unexpected ‘as’ (T_AS), expecting ‘,’ or ‘)’ in C:\xampp\htdocs\tarefas\tarefas.php on line 34

cujo código esta escrito assim no livro:

<?php foreach ($lista_tarefas as $tarefa) : ?> <?php endforeach; ?>
Tarefas
<?php echo $tarefa; ?>

como posso resolver?

Olá, @dener.

Você já conseguiu resolver este problema?
Eu não consigo ver um erro neste código.

Att.

@evaldojuniorbento voltei a ter problemas com o cap. 14.3, onde fala que se testar já é possível visualizar mas não adicionar, porém não mostra a tabela, apenas o nome. Quando você testou meu código, estava mostrando normalmente? Não consigo encontrar o erro, ta foda :confused:

err

Você habilitou os erros no PHP? Assim fica mais fácil entender o que está acontecendo.

Boa tarde, cara não estou conseguindo realizar o exercício 4.7 que seria um cadastro de contato (nome, número e email), o php me retorna um índice ão definido porem eu estou passando o name no input e $_get para jogá-los dentro do array, se puder me ajudar ou enviar algum link explicando o que está faltando no meio do caminho, segue o código:
<?php
session_start();
?>

<html>
<head>
    <title>Gerenciador de Tarefas</title>
</head>
<body>
    <h1>Gerenciador de Tarefas</h1><!-- Aqui irá o restante do código -->
    <form>
        <fieldset>
            <label>Nome:<input type="text" name="nome" /></label>
            <label>telefone:<input type="text" name="numero" /></label>
            <label>E-mail:<input type="text" name="email" /></label>
            
            <input type="submit" value="Cadastrar" />
        </fieldset>
    </form>
    <?php
    $lista_contato = array();
    
    if (isset($_GET['nome'])) {$_SESSION['lista_contato'][]= $_GET['nome'];
                              }
    if (isset($_GET['numero'])) {$_SESSION['lista_contato'][]=$_GET['numero'];
                              }
    if (isset($_GET['email'])) {$_SESSION['lista_contato'][]= $_GET['email'];
                              }
    if (isset($_SESSION['lista_contato'])) {
        $lista_contato[]= $_SESSION['lista_contato'];
    }   
    ?>
    <table>
        <tr>
            <th>Tarefas</th>
        </tr>
        <?php foreach($lista_contato as $contato):
        ?>
        <tr>
            <td>
<?php echo $contato['nome']; ?>
<?php echo $contato['numero']; ?>
<?php echo $contato['email']; ?>
            </td>
        </tr>
        <?php endforeach; ?>
    </table>
</body>
</html>

evaldojuniorbento olhando agora a resposta que deu para o @br.ananias consegui entender como organizou o código e talvez resolver meu problema (ainda não mexi no meu e testei), mas ainda estou confuso sobre a lógica, pode me explicar por favor?

Olá, @telles.

Pelo que eu entendi você está criando um novo índice no array $_SESSION['lista_contato'] para cada campo do formulário.

Experimente usar a função print_r() no array $_SESSION['lista_contato'], assim:

print_r($_SESSION['lista_contato']);

Você verá algo como:

0 => "nome vindo do form",
1 => "numero ...",
2 => "email ... ",

Mas o correto seria algo como:

0 => array(
    "nome" => "nome vindo do form",
    "numero" => "numero ...",
    "email" => "email ... ",
)

Para que isso aconteça você precisa criar uma nova variável com o contato e depois colocar essa variável (array) dentro da lista:

$contato = array();
    
if (isset($_GET['nome'])) {
    $contato]['nome']= $_GET['nome'];
}
if (isset($_GET['numero'])) {
    $contato]['numero']= $_GET['numero'];
}
if (isset($_GET['email'])) {
    $contato]['email']= $_GET['email'];
}

$_SESSION['lista_contatos'][] = $contato;

Abraços e bons estudos.

Olá @evaldojuniorbento , tudo bem?

Estou começando meus estudos com PHP usando seu livro e já surgiu uma dúvida: No desafio 6 do capítulo 4 construir um calendário do ano todo eu não estou conseguindo fazer os meserçaes começarem no dia certo, por exemplo: 31 de março cai na terça mas primeiro de abril cai na quinta ao invés de cair na quarta. Segue meu código para você analizar:

Calendário .red{color:red;}
<?php

if (date("G") <= 12 ){
    echo "<h1>Bom dia</h1>";
} elseif (date("G") <= 18){
    echo "<h1>Boa tarde</h1>";

}else{
    echo "<h1>Boa noite</h1>";
}
$hoje = date('d/m/y');

echo "<h2><b>{$hoje}</b></h2>";


function linha ($semana){
    $linha = '<tr>';
    
    for($i = 0; $i <=6; $i++){
        if(array_key_exists($i,$semana) && $i == 0){
            $linha .= "<td class = red>{$semana[$i]}</td>";  
        }else if(array_key_exists($i,$semana) && $i == 6){
            $linha .= "<td><b>{$semana[$i]}</b></td>";  
        }else    
          if(array_key_exists($i,$semana)){
             $linha .= "<td>{$semana[$i]}</td>";}
             else{
             $linha .= "<td></td>";
        }
    }
    
    $linha .= '<tr>';
    
    return $linha;
}

$contador = 0;         

function calendario($total_dias){
    $calendario = "";
    $dia = 1;
    $semana = [];
    global $contador;

    
        for($y=0; $y <= $contador; $y++){
           array_push($semana, " ");
        }
    
        
   
        while($dia <= $total_dias){
            array_push($semana,$dia);

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

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

            return $calendario;     
    }

?>

<?php
  function criaMes(){ 
  Echo  "<table border='1'>

    <tr>
                    
        <th class = red>Dom</th>
        <th>Seg</th>
        <th>Ter</th>
        <th>Qua</th>
        <th>Qui</th>
        <th>Sex</th>
        <th><b>Sab</b></th>

    <tr>";
     
   
}
?>


<?php

 $mes = new DateTime('01-01-2018');

 for($x=0; $x <= 11 ; $x++){
     
     echo criaMes();
     if($x == 3 || $x == 5 || $x == 8 || $x == 10 ){
        echo calendario(30);
     }else if($x == 1) {
        echo calendario(28);
     }else{
         echo calendario(31);
     }
         
     echo $mes -> format('F');
     $mes -> modify('+ 1 month'); 
 }


?>

Consegue me dar uma ajuda? Muito obrigado!