[Livro PHP e MySQL] Dúvidas em geral

Evaldo, não estou conseguindo cadastrar uma nova linha na tabela do banco de dados, segue código baseado em seu livro, apenas alterei o nome das variáveis e funções:

Arquivo que conecta ao Banco de Dados (phpmysqlconnect.php):

<?php
require_once 'user.php';
 
if ($conn = mysqli_connect($host, $bdUsuario, $bdSenha, $bdBanco)) {
	echo "Connectado ao $bdBanco em $host com sucesso.";
}
if (mysqli_connect_errno($conn)) { 
	echo "Problemas para conectar no banco. Verifique os dados!"; 
	die(); 
}

function buscar_contas($conn) 
{ 
	$sqlBusca = 'SELECT * FROM conta_bancaria'; 
	$resultado = mysqli_query($conn, $sqlBusca);
	
	$contas_bancarias = array();
	
	while ($conta_bancaria = mysqli_fetch_assoc($resultado)) { 
		$contas_bancarias[] = $conta_bancaria; 
		}
	return $contas_bancarias;
}

function gravar_contas($conn, $conta_bancaria) 
{ 
	$sqlGravar = "INSERT INTO conta_bancaria(descricao_conta, saldo_inicial) VALUES (´{$conta_bancaria['descricao_conta']}´, ´{$conta_bancaria['saldo_inicial']}´)";
	mysqli_query($conn, $sqlGravar);
}

Arquivo semelhante ao Tarefas:

<?php
    session_start();
	
	include "phpmysqlconnect.php";
	
    if (isset($_GET['descricao_conta']) && $_GET['descricao_conta'] != '') {
        $conta_bancaria = array();
        $conta_bancaria['descricao_conta'] = $_GET['descricao_conta'];
        $conta_bancaria['saldo_inicial'] = $_GET['saldo_inicial'];

        gravar_contas($conn, $conta_bancaria);             
    }

    $lista_contas = buscar_contas($conn);
	
	include "template.php";
?>

Se alguém puder me ajudar, agradeço!

Consegui resolver, era só colocar ’ (aspas simples) dentro do INSERT INTO.

Isso mesmo, @souzalm. É necessário usar aspas para strings.

Tô com o problema abaixo para a transformação da Data vinda no formulário para o BD. Estou usando tipo Date no formulário:

Notice : Undefined offset: 2 in C:\xampp\htdocs\bisaweb\ajudantes.php on line 10

Notice : Undefined offset: 1 in C:\xampp\htdocs\bisaweb\ajudantes.php on line 10

Arquivo ajudantes.php:

/* Função que traduz Data inserida no formulário para o BD. */
function traduz_data_para_banco($data) {
	if ($data == "") { 
	return ""; 
	}
	
$dados = explode("/", $data);

$data_mysql = "{$dados[2]}-{$dados[1]}-{$dados[0]}";

return $data_mysql;
}

Se alguém puder ajudar, agradeço!

Evaldo, onde devo inserir a função traduz_data_para_exibir($data)?

Segue ela no meu arquivo ajudantes.php:

/* Função que traduz Data do BD para exibição na lista de movimentações financeiras. */
function traduz_data_para_exibir($data) { 
	if ($data == "" OR $data == "0000-00-00") { 
	return ""; }

$dados = explode("-", $data);

$data_exibir = "{$dados[2]}/{$dados[1]}/{$dados[0]}";

return $data_exibir;
}

Se alguém puder ajudar, agradeço!

Evaldo, estou com o seguinte erro:

Notice : Undefined index: id_movimentacao in C:\xampp\htdocs\bisaweb\formulario.php on line 4

Segue o arquivo formulario.php:

    <form>
		    <input type="hidden" name="id_movimentacao" 
			value="<?php echo $movimentacao_financeira['id_movimentacao']; ?>" />
            <fieldset>
                <legend>Nova Movimentação Financeira</legend>
                <label>
                    Descrição da Movimentação Financeira:
                    <input type="text" name="descricao_movimentacao" 
					value="<?php echo $movimentacao_financeira['descricao_movimentacao']; ?>" />
                </label><br />
                <label>
                    Tipo de Movimentação Financeira:
                    <input type="text" name="tipo_movimentacao"
					value="<?php echo $movimentacao_financeira['tipo_movimentacao']; ?>" />                
                </label><br />
				<label>
                    Data:
                    <input type="text" name="data_movimentacao"
					value="<?php echo traduz_data_para_exibir($movimentacao_financeira['data_movimentacao']); ?>" />					
                </label><br />
				<label>
                    Valor:
                    <input type="text" name="valor"
					value="<?php echo $movimentacao_financeira['valor']; ?>" />					
                </label><br />
				<label>
                    Conta Bancária:
                    <input type="text" name="conta_bancaria"
					value="<?php echo $movimentacao_financeira['conta_bancaria']; ?>" />					
                </label><br />
				<input type="submit" value="
				<?php 
				if ($movimentacao_financeira['id_movimentacao'] > 0) {
					echo 'Atualizar'; 
				} else {
				echo 'Cadastrar'; } ?> " />
            <fieldset> 
        </form>

Segue meu arquivo editar.php:

<?php

session_start();

include "bd/phpmysqlconnect.php"; 
include "ajudantes.php";

/* Se a variável for falsa não se exibe a tabela com as movimentações financeiras. */
$exibir_tabela = false;

/* Dentro desse If temos verificações isset e os valores são capturados da URL para a variável array $movimentacao_financeira. No fim, os valores são usados por meio de uma função
para atualizar o BD. */
if (isset($_GET['descricao_movimentacao']) && $_GET['descricao_movimentacao'] != '') { 
	
	$movimentacao_financeira = array();
	
	$movimentacao_financeira['id_movimentacao'] = $_GET['id_movimentacao'];
	$movimentacao_financeira['descricao_movimentacao'] = $_GET['descricao_movimentacao'];
	$movimentacao_financeira['tipo_movimentacao'] = $_GET['tipo_movimentacao']; 
	if (isset($_GET['data_movimentacao'])) { 
		$movimentacao_financeira['data_movimentacao'] = traduz_data_para_banco($_GET['data_movimentacao']); 
	} else { 
		$movimentacao_financeira['data_movimentacao'] = ''; 
	}
	$movimentacao_financeira['valor'] = $_GET['valor'];
	$movimentacao_financeira['conta_bancaria'] = $_GET['conta_bancaria'];
	
	editar_tarefa($conn, $movimentacao_financeira);
}
	
	$movimentacao_financeira = buscar_movimentacao($conn, $_GET['id_movimentacao']);
	
	$movimentacao_financeira = array( 
	'descricao_movimentacao' => '',
	'tipo_movimentacao' => '', 
	'data_movimentacao' => '', 
	'valor' => '', 
	'conta_bancaria' => ''
);

	include "template_movimentacao.php";

Se alguém puder ajudar, agradeço!

Olá!

Tente verificar o valor de $data antes de usar explode(). Me parece $data está vazia.

Olá, é no arquivo ajudantes.php mesmo :slight_smile:

Me parece que id_movimentacao não foi definido como os demais dados.

Evaldo, consegui resolver o problema com Data, eu coloquei a formato em html como text, como Date ele não puxa.

E sobre o id_movimentacao, onde eu devo defini-lo e como?

Obrigado!

Olá, pode ser logo após $movimentacao_financeira = array();

Como devo escrever?

Para mim, isso movimentacao_financeira['id_movimentacao'] = _GET[‘id_movimentacao’]; já definia.

E esse erro:

Notice : Undefined index: id_movimentacao in C:\xampp\htdocs\bisaweb\formulario.php on line 4

Como devo resolve-lo?

Segue meu arquivo formulario.php:

<!-- Formulário para cadastramento de Movimentação Financeira: -->
        <form>
			<input type="hidden" id="id_movimentacao" name="id_movimentacao" 
			value="<?php echo $movimentacao_financeira['id_movimentacao']; ?>" /> 
            <fieldset>
                <legend>Nova Movimentação Financeira</legend>
                <label>
                    Descrição da Movimentação Financeira:
                    <input type="text" name="descricao_movimentacao" 
					value="<?php echo $movimentacao_financeira['descricao_movimentacao']; ?>" />
                </label><br />
                <label>
                    Tipo de Movimentação Financeira:
                    <input type="text" name="tipo_movimentacao"
					value="<?php echo $movimentacao_financeira['tipo_movimentacao']; ?>" />                
                </label><br />
				<label>
                    Data:
                    <input type="text" name="data_movimentacao"
					value="<?php echo traduz_data_para_exibir($movimentacao_financeira['data_movimentacao']); ?>" />					
                </label><br />
				<label>
                    Valor:
                    <input type="text" name="valor"
					value="<?php echo $movimentacao_financeira['valor']; ?>" />					
                </label><br />
				<label>
                    Conta Bancária:
                    <input type="text" name="conta_bancaria"
					value="<?php echo $movimentacao_financeira['conta_bancaria']; ?>" />					
                </label><br />
				<input type="submit" value="
				<?php 
				if ($movimentacao_financeira['id_movimentacao'] > 0) {
					echo 'Atualizar'; 
				} else {
				echo 'Cadastrar'; } ?> " />
            <fieldset> 
        </form>

Olha no local onde $movimentacao_financeira é criada sem ser com dados da requisição.

Olá estou com um probleminha no capítulo 12 do livro, eles atualizaram a biblioteca e eu não sei mais incluir ela no código, não existe mais o arquivo PHPMailerAutoload.php.

Olá, @Uilton.

Na documentação oficial (https://github.com/PHPMailer/PHPMailer) eles indicam usar o composer para fazer o autoload das classes, ou adicionar manualmente como em:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

Abraços

Olá, estou com uma dúvida quanto ao uso de _COOKIES. No segundo exercício do capítulo 5 é pedido que se altere a aplicação para utilizar _COOKIES ao invés de $_SESSION. Tentei, mas não consegui. Alguém pode ajudar?

Implementação do exercício 01:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
    <head>
        <title>Contatos</title>
    </head>
    <body>
        <h1>Contatos</h1>
        <form>
            <fieldset>
                <legend>Novo Contato</legend>
                <label>
                    Contato:
                    <input type="text" name="nome">
                </label>
                <label>
                    Telefone:
                    <input type="number" name="telefone">
                </label>
                <label>
                    e-mail:
                    <input type="email" name="email">
                </label>
                <input type="submit" value="Cadastrar">
            </fieldset>
        </form>

        <?php
            $contatos = [];
            if (array_key_exists('nome', $_GET) && 
                array_key_exists('telefone', $_GET) &&
                array_key_exists('email', $_GET)) {
                $_SESSION['contatos'][] = [$_GET['nome'], $_GET['telefone'], $_GET['email']];
            }
            $contatos = [];
            if (array_key_exists('contatos', $_SESSION)) {
                $contatos = $_SESSION['contatos'];
            }
            function arrayToString($array) {
                $dados = '';
                foreach ($array as $item) {
                    $dados .= $item . '&nbsp;&nbsp;&nbsp;&nbsp;';
                }
                return $dados;
            }
        ?>

        <table>
            <tr>
                <th>Contatos</th>
            </tr>
            <?php foreach ($contatos as $contato) : ?>
                <tr>
                    <td><?= arrayToString($contato); ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    </body>
</html>

Implementação do exercício 02:
<?php session_start(); ?>



Contatos


Contatos




Novo Contato

Contato:



Telefone:



e-mail:




        <?php
            $contatos = [];

            if (array_key_exists('nome', $_GET) &&
                array_key_exists('telefone', $_GET) &&
                array_key_exists('email', $_GET)) {
                    setcookie('contatos', $_GET['nome'] . $_GET['telefone'] . $_GET['email']);
            }

            if (array_key_exists('contatos', $_COOKIE)) {
                $contatos[] = $_COOKIE['contatos'];
            }

            function arrayToString($array) {
                $dados = '';
                foreach ($array as $item) {
                    $dados .= $item . '&nbsp;&nbsp;&nbsp;&nbsp;';
                }

                return $dados;
            }
        ?>

        <table>
            <tr>
                <th>Contatos</th>
            </tr>
            <?php foreach ($contatos as $contato) : ?>
                <tr>
                    <td><?= $contato; ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    </body>
</html>

Olá, Lucas.

Seu post está um pouco confuso de ler pois o código não foi formatado corretamente pelo fórum :frowning:

Você pode colocar seu código dentro de tags ``` ?

Ok, desculpas :sweat_smile:

Implementação do exercício 01:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
    <head>
        <title>Contatos</title>
    </head>
    <body>
        <h1>Contatos</h1>
        <form>
            <fieldset>
                <legend>Novo Contato</legend>
                <label>
                    Contato:
                    <input type="text" name="nome">
                </label>
                <label>
                    Telefone:
                    <input type="number" name="telefone">
                </label>
                <label>
                    e-mail:
                    <input type="email" name="email">
                </label>
                <input type="submit" value="Cadastrar">
            </fieldset>
        </form>

        <?php
            $contatos = [];
            if (array_key_exists('nome', $_GET) && 
                array_key_exists('telefone', $_GET) &&
                array_key_exists('email', $_GET)) {
                $_SESSION['contatos'][] = [$_GET['nome'], $_GET['telefone'], $_GET['email']];
            }
            $contatos = [];
            if (array_key_exists('contatos', $_SESSION)) {
                $contatos = $_SESSION['contatos'];
            }
            function arrayToString($array) {
                $dados = '';
                foreach ($array as $item) {
                    $dados .= $item . '&nbsp;&nbsp;&nbsp;&nbsp;';
                }
                return $dados;
            }
        ?>

        <table>
            <tr>
                <th>Contatos</th>
            </tr>
            <?php foreach ($contatos as $contato) : ?>
                <tr>
                    <td><?= arrayToString($contato); ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    </body>
</html>

Implementação do exercício 02:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
    <head>
        <title>Contatos</title>
    </head>
    <body>
        <h1>Contatos</h1>

        <form>
            <fieldset>
                <legend>Novo Contato</legend>
                <label>
                    Contato:
                    <input type="text" name="nome">
                </label>
                <label>
                    Telefone:
                    <input type="number" name="telefone">
                </label>
                <label>
                    e-mail:
                    <input type="email" name="email">
                </label>
                <input type="submit" value="Cadastrar">
            </fieldset>
        </form>

        <?php
            $contatos = [];

            if (array_key_exists('nome', $_GET) &&
                array_key_exists('telefone', $_GET) &&
                array_key_exists('email', $_GET)) {
                    setcookie('contatos', $_GET['nome'] . $_GET['telefone'] . $_GET['email']);
            }


            if (array_key_exists('contatos', $_COOKIE)) {
                $contatos[] = $_COOKIE['contatos'];
            }

            function arrayToString($array) {
                $dados = '';

                foreach ($array as $item) {
                    $dados .= $item . '&nbsp;&nbsp;&nbsp;&nbsp;';
                }

                return $dados;
            }
        ?>

        <table>
            <tr>
                <th>Contatos</th>
            </tr>
            <?php foreach ($contatos as $contato) : ?>
                <tr>
                    <td><?= $contato; ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    </body>
</html>

Olá, @snlucas.

Demorei um pouco, mas trabalhei na sua solução para usar Cookies. Como os cookies são apenas texto eu usei a função serialize() do PHP para transformar o array $contatos em uma string. Depois faço o inverso, transformando a string de volta em um array:

<?php

session_start();

function exibir_contato($contato)
{
    return implode(' | ', $contato);
}

?>
<!DOCTYPE html>
<html>
    <head>
        <title>Contatos</title>
    </head>
    <body>
        <h1>Contatos</h1>

        <form>
            <fieldset>
                <legend>Novo Contato</legend>
                <label>
                    Contato:
                    <input type="text" name="nome">
                </label>
                <label>
                    Telefone:
                    <input type="number" name="telefone">
                </label>
                <label>
                    e-mail:
                    <input type="email" name="email">
                </label>
                <input type="submit" value="Cadastrar">
            </fieldset>
        </form>

        <?php
            $contatos = [];
            if (array_key_exists('contatos', $_COOKIE)) {
                $contatos = unserialize($_COOKIE['contatos']);
            }

            if (array_key_exists('nome', $_GET) &&
                array_key_exists('telefone', $_GET) &&
                array_key_exists('email', $_GET))
            {
                $contatos[] = [
                    'nome' => $_GET['nome'],
                    'telefone' => $_GET['telefone'],
                    'email' => $_GET['email'],
                ];
            }

            setcookie('contatos', serialize($contatos));
        ?>
        <table>
            <tr>
                <th>Contatos</th>
            </tr>
            <?php foreach ($contatos as $contato) : ?>
                <tr>
                    <td><?php echo exibir_contato($contato); ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    </body>
</html>

O que você acha?