[Livro PHP e MySQL] Dúvidas em geral

Olá!

Este é o tópico principal para o livro de PHP e MySQL da Casa do Código. Mande suas dúvidas :smile:

Estamos juntos :wave: (Clape)

1 curtida

é isso ai …

Estamos juntos nesse novo Forum

1 curtida

Implementei o seguinte código para remover anexos. Queria saber se é a melhor forma de fazer.

<?php include "banco.php"; $anexo = buscar_anexo($conexao, $_GET['id']); unlink("anexos/" . $anexo['arquivo']); remover_anexo($conexao, $anexo['id']); header('Location: contato.php?id=' . $anexo['contato_id']);

É uma boa forma sim, @allexandrejr. Talvez seja bom verificar se o arquivo existe antes de usar a função unlink() :slight_smile:

Assim?

<?php include "banco.php"; $anexo = buscar_anexo($conexao, $_GET['id']); if (file_exists("anexos/" . $anexo['arquivo'])) { unlink("anexos/" . $anexo['arquivo']); } remover_anexo($conexao, $anexo['id']); header('Location: contato.php?id=' . $anexo['contato_id']);

Isso! Talvez a is_file() seja mais indicada, pois verifica se o arquivo é mesmo um arquivo, enquanto a file_exists() também retorna verdadeiro caso um diretório com o mesmo nome exista.

esta dando erro no foreach
este código encontra se na pagina 49 no livro Desenvolvimento web com PHP e MySQL.
identar texto pre-formatado em 4 espaços

<?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; } ?> <?php foreach ($lista_tarefas as $tarefa) : ?> <?php endforeach; ?>
Tarefa Descricao Prazo Prioridade Concluída
<?php echo $tarefa['nome']; ?> <?php echo $tarefa['descricao']; ?> <?php echo $tarefa['prazo']; ?> <?php echo $tarefa['prioridade']; ?> <?php echo $tarefa['concluida']; ?>

Estou com o mesmo erro do Lucas Henrique. O código de separação entre HTML e PHP retorna erro quando carrego o arquivo template.php. Obs: no arquivo tarefas.php eu coloquei o include de template.php.

Erro :
Notice: Undefined variable: lista_tarefas in C:\xampp\htdocs\Cap5\template.php on line 52

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\Cap5\template.php on line 52

Gerenciador de Tarefas

Gerenciador de Tarefas

Nova tarefa Tarefa: Prazo (Opcional): Descrição (Opcional): Prioridade: Baixa Média Alta Tarefa concluída:
		<table>
			<tr>
				<th>Tarefa</th>
				<th>Descricao</th>
				<th>Prazo</th>
				<th>Prioridade</th>
				<th>Concluída</th>
			</tr>
	
			<?php foreach ($lista_tarefas as $tarefa) : ?>
			<tr>
				<td>
					<?php echo $tarefa['nome']; ?>
				</td>
				<td>
					<?php echo $tarefa['descricao']; ?>
				</td>
				<td>
					<?php echo $tarefa['prazo']; ?>
				</td>
				<td>
					<?php echo $tarefa['prioridade']; ?>
				</td>
				<td>
					<?php echo $tarefa['concluida']; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</table>
	</body>	
</html>

Olá, @fabiomrjr.

Parece que a variável não foi definida. Como está o seu arquivo tarefas.php?

Evaldo, foi isso mesmo. Analisando melhor o código percebi que estava faltando a seguinte parte no arquivo tarefas.php :

$lista_tarefas = array();

if (isset($_SESSION[‘lista_tarefas’])) {
$lista_tarefas = $_SESSION[‘lista_tarefas’];
}

Att,

não sei pq mais quando cadastro uma tarefa ela não é exibida.

arquivo tarefa:

<?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"; ?>

arquivo template

    <meta charset="utf-8" />
    <title>Gerenciador de Tarefas</title>
    <link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
    <h1>Gerenciador de Tarefas</h1>
    <form>
        <fieldset>
            <legend>Nova tarefa</legend>
            <label>
                Tarefa:
                <input type="text" name="nome" />
            </label>
            <label>
                Descrição (Opcional):
                <textarea name="descricao"></textarea>
            </label>
            <label>
                Prazo (Opcional):
                <input type="text" name="prazo" />
            </label>
            <fieldset>
                <legend>Prioridade:</legend>
                <label>
                    <input type="radio" name="prioridade" value="baixa" checked /> Baixa
                    <input type="radio" name="prioridade" value="media" /> Média
                    <input type="radio" name="prioridade" value="alta" /> Alta
                </label>
            </fieldset>
            <label>
                Tarefa concluída:
                <input type="checkbox" name="concluida" value="sim" />
            </label>
            <input type="submit" value="Cadastrar" />
        </fieldset>
    </form>
    <table>
        <tr>
            <th>Tarefa</th>
            <th>Descricao</th>
            <th>Prazo</th>
            <th>Prioridade</th>
            <th>Concluída</th>
        </tr>
        <?php foreach ($lista_tarefas as $tarefa) : ?>
            <tr>
                <td><?php echo $tarefa['nome']; ?></td>
                <td><?php echo $tarefa['descricao']; ?></td>
                <td><?php echo $tarefa['prazo']; ?></td>
                <td><?php echo $tarefa['prioridade']; ?></td>
                <td><?php echo $tarefa['concluida']; ?></td>
            </tr>
        <?php endforeach; ?>
    </table>
</body>

estou iniciando no php então sou meio leigo ainda, se alguém puder me dizer onde estou errando gradeço.

Algum erro aparece? Ou apenas a falta da lista?

Não recebo nem um erro, quando preencho os campos e clico em cadastra não aparece nada.

Percebi que algumas chamadas ao $_GET e $_SESSION estão sem os underlines, estão apenas como $GET e $SESSION.

Tenta mudar isso e cadastrar a tarefa novamente.

Boa tarde Evaldo.

Estou encontrando um erro no momento de cadastrar as tarefas no formulário e exibi-las na tabela. Aparece o seguinto no navegador, abaixo do formulário:

Notice: Array to string conversion in /opt/lampp/htdocs/PHP/tarefas.php on line 61
Array

O código está da seguinte forma:

Gerenciador de tarefas

        <!-- Formulário de entrada de dados -->            
        <form>
            <fieldset>
                <legend>Nova tarefa</legend>
                <label>
                    Tarefa: <input type="text" name="nome" />
                </label>
                <input type="submit" value="Cadastar"/>
            </fieldset>
        </form>
        
        <!-- Captura as entradas do formulário e as insere em um array, para guarda de múltiplos registros -->
        <?php
                            
            
            if(isset ($_GET['nome']))
                $_SESSION['lista_tarefas'][] = $_GET['nome'];
                
            $lista_tarefas = array();                                    
                
            if(isset($_SESSION['lista_tarefas'])){
                $lista_tarefas[] = $_SESSION['lista_tarefas'];    
            }
            
        ?>
        
        <!-- Tabela de saída dos registros -->
        <table>
            <tr>
                <th>Tarefas</th>                
            </tr>
            
            <!-- Lista todos os registros contidos no array -->
            <?php foreach ($lista_tarefas as $tarefa) : ?>
                <tr>
                    <td><?php echo $tarefa; ?></td>    
                </tr>
            <?php endforeach; ?>
            
        </table>
    
    </body>

A linha 61 é a que cria as linhas da tabela por meio da instrução echo $tarefa.

Agradeço a ajuda!

Na hora de criar o array com as tarefas faça sem os colchetes:

$lista_tarefas = $_SESSION[‘lista_tarefas’];

Usando os colchetes você terá arrays no lugar de strings na hora de fazer o foreach :slight_smile:

Boa tarde, estou tendo os seguintes erros. Igual dois colegas aí em cima. Mas não consegui resolver…

Undefined variable: lista_tarefas in C:\wamp\www\DesenvolvimentoWebComPHPeMySQL\capitulo5\template.php on line 63

Warning: Invalid argument supplied for foreach() in C:\wamp\www\DesenvolvimentoWebComPHPeMySQL\capitulo5\template.php on line 63

Meus arquivos seguem:

-------> tarefas.php

   <?php
session_start();

if(isset($_GET['nome']) && $_GET['nome'] != ''){//se tenho um valor(qualquer que seja) no get entro no if.
	$tarefa = array();//cria um array chamado tarefa.
	
	$tarefa['nome'] = $_GET['nome'];//tarefa recebe o nome pego pelo get.
	
	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;

}

include "template.php";//incluo em meu programa outra página php.

?>

------> template.php

<head>
	<meta charset="utf-8" />	
	<title>Gerenciador de Tarefas</title>
	<link rel="stylesheet" href="tarefas.css" type="text/css" />
</head>

<body>

	<h1>Gerenciador de Tarefas</h1>
	
	<form><!-- Aqui eu abro a tag do formulário. -->
		<!-- Quando não defino o action, parece que manda para a mesma página. -->
	
		<fieldset><!-- Crio um fieldset. Como se fosse uma moldura. -->
			<legend>Nova Tarefa</legend><!-- legenda do meu fieldset. Aparecerá na parte superior do field. -->
			
			<label>
				Tarefa:
				<input type="text" name="nome" />
			</label>
			
			<label>
				Descrição(Opcional):
				<textarea name="descricao"></textarea>
			</label>
			
			<label>
				Prazo(Opcional):
				<input type="text" name="prazo" />
			</label>
			
			<fieldset>
				<legend>Prioridade</legend><!-- legenda do meu fieldset. Aparecerá na parte superior do field. -->
				
				<label>
					<input type="radio" name="prioridade" value="baixa" checked /> Baixa
					<input type="radio" name="prioridade" value="media" /> Média
					<input type="radio" name="prioridade" value="alta" /> Alta
				</label>
				
			</fieldset>
			
			<label>
				Tarefa Concluída:
				<input type="checkbox" name="concluida" value="sim" />		
			</label>
			
			<input type="submit" value="Cadastrar" />
		</fieldset>
		
	</form>
	
	<table><!-- Início da tabela. -->
		<tr>
			<th>Tarefas</th><!-- Aqui é criada uma linha para conter o título dos dasdos que aparecerão na linha logo abaixo na tabela. -->
			<th>Descrição</th>
			<th>Prazo</th>
			<th>Prioridade</th>
			<th>Concluída</th>
		</tr>
		<?php foreach ($lista_tarefas as $tarefa) : ?><!-- Uso um foreach para poder pegar todos os dados existentes dentro da																	minha variável $lista_tarefas. -->				
			<tr>
				<td><?php echo $tarefa['nome']; ?></td>
				<td><?php echo $tarefa['descricao']; ?></td>
				<td><?php echo $tarefa['prazo']; ?></td>
				<td><?php echo $tarefa['prioridade']; ?></td>
				<td><?php echo $tarefa['concluida']; ?></td>
			</tr>
		 <?php endforeach; ?><!-- Para facilitar a visualização. Dessa maneira consigo enxergar melhor onde abro e onde fehco meu foreach. -->
	</table>
	
</body>

Olá, @Thiago2

Parece que faltou iniciar a variável $lista_tarefas, antes de incluir o template:

if (isset($SESSION[‘listatarefas’])) {
$lista_tarefas = $SESSION[‘listatarefas’];
} else {
$lista_tarefas = array();
}

1 curtida

Meu amigo @fabiomrjr, você informou esse código em qual parte?