Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Omar~

CRUD Introdução a PDO

Recommended Posts

A pouco mais de um ano desde a data dessa postagem venho frequentando aqui o iMasters, e vejo que um vasta soma de dúvidas das pessoas é como conectar acessar, editar etc... dados em um banco sql.

Então resolvi criar esse guia uma vez que até o momento não encontrei conteúdo similar aqui para dar uma introdução ao PDO. Voltado para quem está não tem noção alguma sobre pdo e quer fazer a manipulação de tabelas sql.

Será um guia bem básico voltado no procedural, pois o alvo não é ensinar a programar e sim introduzir o leitor na PDO.

 

  • Mas o que é PDO? Extensão orientada a objetos para manipulação de banco de dados

P : PHP

D : Data

O Object

E como saber se meu sistema suporta PDO?

Essa extensão foi introduzida no php a partir da versão 5.1, mas é possível saber se a mesma está instalada ou não:

Spoiler

<?php
if (extension_loaded('pdo')) {
    echo ('Sim podemos usar PDO!!!');
} else {
    echo ('Ops! Nosso PHP está faltando coisa porque será eim?');
}

 

 

  • Mas o que é CRUD? As 4 operações principais de manipulação de banco de dados

C : Create - criar dados

R : Read - ler dados

U : Update - alterar dados

D : Delete - apagar dados

 

  • Quais programas preciso para seguir esse guia?

Primeiramente você deve possuir um sistema apache + SQL ou mariaDB instalado (Sugiro é que busque pelo Xampp)

Um navegador de web (Sugiro Mozilla Firefox)

Um editor de texto ou IDE (Sugiro o NetBeans IDE só a versão PHP e HTML já é o suficiente para desenvolvimento web)

 

 

 

 

Então vamos botar a mão na maça!

 

Para nosso primeiro passo então vamos criar uma banco de dados e uma tabela para que possa-mos utilizar em nossos testes, uma bem genérica e simples mesmo.
Abra um editor de texto aí (sugiro que tenha o notepad++) e crie um novo arquivo assim: tabela.sql, colando o texto abaixo no arquivo.
Não se esqueça que o nome do arquivo deve se terminado em .SQL

CREATE DATABASE crudpdo DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; -- Cria o banco de dados

USE crudpdo; -- Acessa o banco de dados para criar a tabela

CREATE TABLE `usuarios` (
  `usuario_id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50),
  `sobre_nome` varchar(50),
  `login` varchar(50),
  `senha` text,
  PRIMARY KEY (`usuario_id`)
);
Citar

*Nota: Com PDO é possível criar/editar/apagar banco de dados também, mas isso é outra história que não se aplica ao nosso CRUD aqui.

 

Criado o arquivo abra importe esse arquivo, se você usa o PhpMyAdmim(localhost/phpmyadmim), ao abri-lo procure por um input (IMPORTAR)
Feito o processo corretamente você pode perceber que um novo banco de dados apareceu "crudpdo" e dentro dele uma tabela "usuarios", não se preocupe por nossa tabela está vazia iremos povoá-la com o decorrer desse guia.
 

Simples não? Agora que temos nossa tabela, vamos enfim estabelecer a conexão com ela pois para podemos fazer as manipulações temos que conectar.
Criamos então algumas variáveis que vão nos ajudar a modificar o acesso de forma mais rápida no futuro caso queiramos fazer isso.
 

$host = '127.0.0.1'; // Endereço do banco de dados (Nosso exemplo é o ambiente local)
$db = 'crudpdo'; // Banco de dados que criamos em nosso arquivo SQL
$usuario = 'root'; // Nome do usuário de acesso ao banco de dados
$senha = ''; // Se você intalou o xampp por exemplo ele possui um usuário global (root) sem senha

 

Vamos lançar um exceção para descobrir se a conexão foi realizada, para isso usaremos o bloco try. E caso houver erro armazenamos o erro na variável $erro

 

try {
} catch (PDOException $erro) {
echo ('Erro na conexão: ' . $erro->getMessage());
}

 

Então criamos um objeto da PDO esse objeto será $con
Nesse objeto instanciamos a classe pdo

$con = new PDO($dsn, $user, $pass, $options);

 

Perceba como funciona a PDO:

  • $dsn > Contém as informações do drive que será usado na conexão e o banco de dados usado para conectar
  • $user > Contém a informação do login do usuário que pode acessar a tabela
  • $pass > Contém a informação da senha do usuário
  • $options >Pode comportar uma série de fatores, por isso usamos uma array para definir essa entrada, aqui eu só vou tratar a codificação de caracteres, talvez em um post futuro possa a vim falar sobre silenciar o console, modelador de acesso etc...

 

Veja como fica nossa conexão:

Spoiler

<?php
$host = '127.0.0.1';
$db = 'crudpdo';
$usuario = 'root';
$senha = '';

try {
    $dsn = "mysql:host={$host}; dbname={$db}";
    $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];

    $con = new PDO($dsn, $usuario, $senha, $options);

    } catch (PDOException $erro) {
        echo ('Erro na conexão: ' . $erro->getMessage());
}

 

 

 

E como sabemos se deu certo?

Primeiramente se não conseguir conectar nossa exceção será lançada como erro e mostrará os motivos do erro assim como expliquei acima pelo uso do bloco try
Mas se quiser-mos depurar usamos isso:
var_dump($con);
deve aparecer algo parecido a isso se acessarmos o arquivo pelo navegador
object(PDO)#1 (0) { }

 

 

 

  • C - Create/INSERT


- Certo, certo que tal agora tentar-mos inserir algo em nossa tabela? Vamos?!
Já que vamos inserir um registro criaremos uma nova intância da pdo reaproveitando o objeto da conexão
$insert = $con->prepare
 

Nesse momento começamos o prepared statements
Então devo informa o que é para fazer

  • INSERT INTO > insira dentro de
  • Informo o nome da tabela no nosso exemplo é "usuarios"
  • Informo as colunas da tabela separadas por virgula que no caso é "nome, sobre_nome, login, senha"
  • Passo os valores preparados ":name, :upname, :login, :pass" os nomes devem começar com :"dois-pontos" e serem separados por virgula. É crucial que não erre na ordem, pois esses serão os valores inseridos em ordem com que você definiu as colunas, enquanto ao nomes você pode usar sua criatividade, só não aconselho usar caracteres especiais ou nomes muito longos.

 

Ficando assim minha query

$insert = $con->prepare('INSERT INTO usuarios (nome, sobre_nome, login, senha) VALUES (:nome, :upname, :login, :pass)');

 

Por fim mandamos executar "dando nome aos gados"
 

$insert->execute([
    'nome' => 'Chaves',
    'upname' => 'Kiko',
    'login' => 'Madruga',
    'pass' => 'Florinda'
]);

 

Então pedimos a contagem do registro para saber se tudo ocorreu bem.

if ($insert->rowCount()) {
    echo ('Dados Registrados');
} else {
    echo ('Nenhum registro inserido');
}


 

Citar

*Nota: Para maior depuração você pode usar o bloco try para pedir que a PDO informe o erro através de Exception assim como foi feito na conexão.

 

 

Veja como ficou meu arquivo com a conexão e com o insert:

Spoiler

<?php
$host = '127.0.0.1';
$db = 'crudpdo';
$usuario = 'root';
$senha = '';

try {
    $dsn = "mysql:host={$host}; dbname={$db}";
    $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];

    $con = new PDO($dsn, $usuario, $senha, $options);
} catch (PDOException $erro) {
    echo ('Erro na conexão: ' . $erro->getMessage());
}

$insert = $con->prepare('INSERT INTO usuarios (nome, sobre_nome, login, senha) VALUES (:nome, :upname, :login, :pass)');
$insert->execute([
    'nome' => 'Chaves',
    'upname' => 'Kiko',
    'login' => 'Madruga',
    'pass' => 'Florinda'
]);
if ($insert->rowCount()) {
    echo ('Dados Registrados');
} else {
    echo ('Nenhum registro inserido');
}

 

 

 

Ah!! Mas aí você me pergunta: "Que diacho é isso" toda vez que eu atualizo a página ou acesso o mesmo registro é inserido novamente!
Isso já são outros carnavais, aqui nós só estamos vendo a execução, enquanto a validação e checagens fica para a próxima... :glasses:
 

  • R - Read/SELECT

 

Já que temos um registro ou mais, não sei quantas vezes você fez nossa brincadeira acima^^, então vamos ler esse(s) registro(s) agora.
Para fazer um select fazemos da mesma forma que no insert, a única coisa que você deve ficar atento quando for executar as querys é com o prepared, onde o que você faz é só tirar os valores da execução, passado-os para outra camada mais protegida, o que já nos trás alguma segurança contra injeção de código.

 

Criamos então nosso prepared para leitura

$select = $con->prepare("SELECT * FROM usuarios WHERE nome = :username AND login = :userlogin");

 

Nesse caso estou fazendo um select em todos dos dados da tabela usuarios (SELECT * FROM usuarios) mas eu só quero os resultados que contenham o (nome & login) "Obeserve como é passada a referência da busca"

 

Uma vez com a query preparada executamos passando o statements, através de uma array

$select->execute([':username' => 'Chaves', ':userlogin' => 'Madruga']);

 

Veja que os valores buscados são os valores do cadastro, logo então esses dados existem.
Agora eu tenho que escolher como eu quero receber esses dados pois eles sempre serão recebidos como array. E como quero essa array?
Optei por utilizar uma array associativa por ser de mais fácil entendimento para iniciantes.
Apesar que gosto de retornar os valores já em objetos, assim fica mais prático de se reaproveitar.

$resultado = $select->fetchAll(PDO::FETCH_ASSOC);

 

Antes de mostrar os resultados eu tenho que saber se realmente existem resultados para mostrar, para basta que mandemos a PDO contar quantos registros ela encontrou usando rowCount()

Citar

*NOTA: rowCunt. Sempre vai retornar um INTERGER com a quantidade de registros obtidos através da query


Então dentro dessa condição se existir eu percorro a array e vou exibindo os dados

if ($select->rowCount()) {
    foreach ($resultado as $valores) {
        echo ("<b>Nome:</b> {$valores['nome']}<br />"
             . "<b>Sobre-Nome:</b> {$valores['sobre_nome']}<br />"
             . "<b>Login:</b> {$valores['login']}<br />"
             . "<b>Senha:</b> {$valores['senha']}");
    }
}

 

Olha como ficou minha leitura:
 

Spoiler

<?php
$host = '127.0.0.1';
$db = 'crudpdo';
$usuario = 'root';
$senha = '';

try {
    $dsn = "mysql:host={$host}; dbname={$db}";
    $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];

    $con = new PDO($dsn, $usuario, $senha, $options);
} catch (PDOException $erro) {
    echo ('Erro na conexão: ' . $erro->getMessage());
}

$select = $con->prepare('SELECT * FROM usuarios WHERE nome = :username AND login = :userlogin');
$select->execute([':username' => 'Chaves', ':userlogin' => 'Madruga']);
$resultado = $select->fetchAll(PDO::FETCH_ASSOC);

if ($select->rowCount()) {
    foreach ($resultado as $valores) {
        echo ("<b>Nome:</b> {$valores['nome']}<br />"
             . "<b>Sobre-Nome:</b> {$valores['sobre_nome']}<br />"
             . "<b>Login:</b> {$valores['login']}<br />"
             . "<b>Senha:</b> {$valores['senha']}");
    }
} else {
    echo ('Nada encontrado com a query executada');
}

 

 

 

 

 

  • U - Update/UPDATE

 

 

Bom agora que já inserimos, e fizemos a leitura vamos ao modificar

 

Então criamos nossa query preparada

$update = $con->prepare('UPDATE usuarios SET nome = :username, login = :userlogin WHERE usuario_id = :userid');

 

Note que só estou a alterar o nome e o login de uma tabela(os dados devem ser separados por virgula)
Seguindo após o WHERE eu busco o local para alterar pela coluna usuario_id
 

Passamos o statements

$update->execute(['username' => 'Chapolin', 'userlogin' => 'Chiquinha', 'userid' => 1]);

 

Citar

*Nota: veja que no statements 'userid' eu usei um INTERGER pois essa coluna na tabela é desse tipo. A PDO possui métodos para averiguar o que é STRING e o que é INTERGER, procure a respeito sobre PDO::PARAM_STR e PDO::PARAM_INT
Resolvi não abordar esse assunto aqui porque o guia é para iniciantes, e isso depende de um certo conhecimento no uso da PDO.

 

Então o usuário que se chamava chaves agora vai ser modificado para Chapolin e seu login que era Madruga vai ser Chiquinha
Para saber se foi modificados usamos também o rowCount()
 

Veja como ficou o meu update:

Spoiler

<?php
$host = '127.0.0.1';
$db = 'crudpdo';
$usuario = 'root';
$senha = '';

try {
    $dsn = "mysql:host={$host}; dbname={$db}";
    $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];

    $con = new PDO($dsn, $usuario, $senha, $options);
} catch (PDOException $erro) {
    echo ('Erro na conexão: ' . $erro->getMessage());
}

$update = $con->prepare('UPDATE usuarios SET nome = :username, login = :userlogin WHERE usuario_id = :userid');
$update->execute(['username' => 'Chapolin', 'userlogin' => 'Chiquinha', 'userid' => 1]);

if ($update->rowCount()) {
    echo ('Dados modificados');
} else {
    echo ('Nada foi modificado');
}

 

 

 

 

 

  • D - Delete/DELETE

 

Agora por fim vamos deletar os dados no banco.
O mais simples de todo crud
 

Preparamos

$delete = $con->prepare('DELETE FROM usuarios WHERE usuario_id = :userid');

 

Executamos

$delete->execute(['userid' => 3]);

Hunnn.....? Se eu estou apenas buscando um ID porque criar uma array? Pelo simples fato que assim como nos outros exemplos acima, se você quiser atacar vários registros ao mesmo tempo.

 

Veja como ficou meu delete:

Spoiler

<?php
$host = '127.0.0.1';
$db = 'crudpdo';
$usuario = 'root';
$senha = '';

try {
    $dsn = "mysql:host={$host}; dbname={$db}";
    $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'];

    $con = new PDO($dsn, $usuario, $senha, $options);
} catch (PDOException $erro) {
    echo ('Erro na conexão: ' . $erro->getMessage());
}

$delete = $con->prepare('DELETE FROM usuarios WHERE usuario_id = :userid');
$delete->execute(['userid' => 1]);

 


 

 

Adicionais

 

 

Se você percebeu, tentei falar e mostrar o mais básico e simples o possível, a PDO de forma peculiar possui diversos métodos e técnicas de acesso e edição de databases, além vários truques de segurança.

 

O ideal é acompanha-lo junto a orientação a objetos. Em todos os exemplos tive que ficar criando a conexão e enchendo o arquivo da mesma coisa repetitivamente. Não seria mais prático ter uma classe só para conectar, daí quando e precisar da conexão é só chamar?

A mesma coisa vale para insert, select, update e delete. Não é mais fácil criar uma classe que faz tudo e quando precisar realizar tal coisa consiga em uma única linha porque já está pronto?

 

Bem eu fico por aqui, como disse o guia era só um "basicão" para introdução a PDO. espero que tenham apreciado a leitura, e que tenha sido de ajuda isso. Mas se não apreciou nem ajudou fico grato por ter lido.

 

Comentários, criticas... Fiquem a vontade

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mm_edilson
      Colegas, boa tarde. Estou criando um sisteminha de login, e estou na parte de recuperação de senha. Escrevi o código para o usuário digitar o e-mail cadastrado e solicitar a redefinição. Então, ele recebe um link único no e-mail dele e, por meio desse link, abre a página de criar nova senha. 
      Tudo funciona. O cadastro, o login, e a alteração de senha. Exceto por um problema. Quando faço uma recuperação de senha, e retorno para a página de login, ele dá a nova senha como inválida. Aí, se eu fechar o navegador e abrir de novo, e digitar a nova senha, ele entra normalmente. E não funciona ctrl+F5. Tem que fechar e abrir.
      Não faço ideia do que pode estar causando isso. 
      Vou postar meu código:

      Página de Login:
       
      <?php include_once 'connect.php'; ?> <!DOCTYPE html> <html lang="pt-br"> <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>Login</title> <style> body{font-family: Arial, Helvetica, sans-serif} .content{display:flex;justify-content: center} .contato{width:100%; max-width: 500px;} .form{display: flex; flex-direction: column} .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px} .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px} .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;} </style> </head> <body> <section class="content"> <div class="contato"> <h2>Login</h2> Por favor, entre com o e-mail e a senha cadastrados.<br><br> <form name="cad_usu" class="form" method=post> <input class="field" type="email" name="email" placeholder="E-mail" required> <input class="field" type="password" name="senha" placeholder="Senha" required> <input class="field2" type="submit" name="SendLogin" value="Entrar no Sistema"> <input class="field2" type="reset" value="Limpar Formulário"> <center><a href="recuperar_senha.php"><font size="2">Esqueci a senha</font></a></center> </form> </div> </section> <?php if(!isset($_POST['SendLogin'])){exit;} $dados = filter_input_array(INPUT_POST,FILTER_DEFAULT); $query_usuario = "SELECT * FROM usuario WHERE email =:email LIMIT 1"; $result_usuario = $conn->prepare($query_usuario); $result_usuario->bindParam(':email', $dados['email']); $result_usuario->execute(); $row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC); if($row_usuario && (password_verify($dados['senha'], $row_usuario['senha']))) { $_SESSION['id'] = $row_usuario['id']; $_SESSION['nome'] = $row_usuario['nome']; $_SESSION['situacoe_id'] = $row_usuario['situacoe_id']; $_SESSION['niveis_acesso_id'] = $row_usuario['niveis_acesso_id']; header("Location: painel.php");} else { echo "<div class=content><p style='color: red'> Erro: Usuário e/ou senha inválidos!</p>";} ?> </body> </html>  
      Página que faz a alteração da Senha:
       
      <?php include_once 'connect.php'; ?> <!DOCTYPE html> <html lang="pt-br"> <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>Recuperação de Senha</title> <style> body{font-family: Arial, Helvetica, sans-serif} .content{display:flex;justify-content: center} .contato{width:100%; max-width: 500px;} .form{display: flex; flex-direction: column} .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px} .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px} .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;} </style> <script> function confereSenha(){ const senha = document.querySelector('input[name=senha]'); const confirma_senha = document.querySelector('input[name=confirma_senha'); if (confirma_senha.value === senha.value) { confirma_senha.setCustomValidity(''); } else { confirma_senha.setCustomValidity('As senhas digitadas não conferem! Elas precisam ser iguais.'); } } </script> </head> <body> <section class="content"> <div class="contato"> <center><h2>Recuperação de Senha</h2></center> <br><br> <?php $user = $_GET['utilizador']; $hash = $_GET['confirmacao']; $query_recupera = "SELECT * FROM recuperacao"; $result_recupera = $conn->prepare($query_recupera); $result_recupera->execute(); $row_recupera = $result_recupera->fetch(PDO::FETCH_ASSOC); $user_cadastrado = $row_recupera['email_usu']; $hash_cadastrado = $row_recupera['confirmacao']; $query_usuario = "SELECT * FROM usuario WHERE email = '$user'"; $result_usuario = $conn->prepare($query_usuario); $result_usuario->execute(); $row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC); $id_user = $row_usuario['id']; $modified = date('Y-m-d H:i:s'); echo $id_user; if(!empty($_POST)){ if($user == $user_cadastrado && $hash == $hash_cadastrado){ $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT); $sql = "UPDATE usuario SET senha =:senha, modified =:modified WHERE id =:id"; $statement = $conn->prepare($sql); $statement->bindParam(':senha', password_hash($dados['senha'], PASSWORD_DEFAULT)); $statement->bindParam(':modified', $modified); $statement->bindParam(':id', $id_user); if($statement->execute()){ echo "<p style='color: green;'>Senha alterada com sucesso!</p>"; echo "<p><a href='login.php'>Voltar ao Login></a></p>"; } else { echo "<p style='color: red;'>Erro! Não foi possível alterar sua senha. Por favor, entre em contato com o administrador do sistema.</p>"; } } else { echo "<p style='color: red;'>Erro! Não foi possível alterar sua senha. Por favor, entre em contato com o administrador do sistema.</p>"; } } else { echo ""; } ?> <form name="cad_usu" class="form" method="POST" action=""> <input class="field" type="password" name="senha" placeholder="Senha" required onchange='confereSenha();'> <input class="field" type="password" name="confirma_senha" placeholder="Confirmar Senha" required onchange='confereSenha();'> <input class="field2" type="submit" name="AlteraSenha" value="Alterar Senha"> <input class="field2" type="reset" value="Limpar Formulário"> </form> </div> </section> </div> </body> </html>  
      E por fim, a página que solicita a alteração da senha: 
      <?php include_once 'connect.php'; ?> <html> <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>Login</title> <style> body{font-family: Arial, Helvetica, sans-serif} .content{display:flex;justify-content: center} .contato{width:100%; max-width: 500px;} .form{display: flex; flex-direction: column} .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px} .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px} .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;} </style> </head> <body> <section class="content"> <div class="contato"> <h2>Recuperação de Senha</h2> Por favor, digite o e-mail cadastrado.<br><br> <form name="cad_usu" class="form" method=post> <input class="field" type="email" name="email_usu" placeholder="E-mail" required> <input class="field2" type="submit" name="Recuperar" value="Recuperar Senha"> <center><a href="login.php"><font size="2">Voltar ao Login</font></a></center> </form> </div> </section> <?php if(!isset($_POST['Recuperar'])){exit;} $dados = filter_input_array(INPUT_POST,FILTER_DEFAULT); $query_usuario = "SELECT email FROM usuario WHERE email =:email LIMIT 1"; $result_usuario = $conn->prepare($query_usuario); $result_usuario->bindParam(':email', $dados['email_usu']); $result_usuario->execute(); $row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC); if($row_usuario) { //se o e-mail for localizado, acontece isso: //gera a chave de confirmação $utilizador = $dados['email_usu']; $chave = sha1(uniqid( mt_rand(), true)); //salva a chave no banco de dados $query_salva_usu = "INSERT INTO recuperacao (email_usu, confirmacao) VALUES (:email_usu, :confirmacao)"; $salva_usu = $conn->prepare($query_salva_usu); $salva_usu->bindParam(':email_usu', $dados['email_usu'], PDO::PARAM_STR); $salva_usu->bindParam(':confirmacao', $chave, PDO::PARAM_STR); $salva_usu->execute(); if($salva_usu->rowCount()){ $link = "http://www.sgi.dev.br/recuperar.php?utilizador=$utilizador&confirmacao=$chave"; if(mail($utilizador, 'Recuperação de Senha', 'Olá, '.$utilizador.'. Recebemos uma solicitação de recuperação de senha do site SGI - Sistema de Gestão de Igrejas. Se foi você, por favor, clique no link a seguir e crie uma nova senha: '.$link.' Se você não se lembra de ter solicitado essa alteração, por favor, desconsidere este e-mail. ')) echo "<center><p style='color: green;'>Um link de confirmação foi enviado para '.$utilizador.'. <br>Por favor, abra-o e confirme sua solicitação. Se não o encontrar na caixa de entrada, gentileza verificar a caixa de spam.</center></p>"; }else{ echo "<p style='color: #ff0000;'>Erro. Não foi possível recuperar a senha. Entre em contato com o administrador do sistema!</p>"; } } else { //se o e-mail não for localizado, acontece isso: echo "<div class=content><p style='color: red'> Erro: email não encontrado!</p>"; } ?> </body> </html>  
    • Por Luiz Henrique
      Olá,
       
      Preciso fazer uma inserção no DB de registros referente a pagamentos, quando for no crédito será realizado o insert com sua respectiva data de compensação e valor da parcela exemplo:
       3 parcelas de 100.00 e cada registro em seu devido mês:
      INSERT INTO tabela (valor, data) VALUES (100, 2022-08-17),(100, 2022-09-17),(100, 2022-10-17) É mais eficiente fazer da forma acima ou colocar 3 INSERT?
      Ou existe forma melhor de fazer isso?
       
      Obrigado.,
       
    • Por mm_edilson
      Boa tarde, amigos. Estou criando um sistema de login com PHP e PDO, mas não consigo achar um erro. Ao abrir a página de cadastro, retorna "esta página não está funcionando". Já vasculhei o código de cima a baixo várias vezes, e não consigo encontrar o erro. Se puderem ajudar, fico muito grato.
       
      Minha página de cadastro:
      <?php require_once 'classes/usuarios.php'; $u = new Usuario; ?> <htm lang="pt-br"> <head> <meta charset="utf-8"> <title>SGI - CADASTRO DE USUÁRIO</title> <link rel="stylesheet" href="css/stilo.css"> <body> <div id="corpo-form"> <h1>SGI - LOGIN</h1> <form method="POST"> <input type="text" name="nome" placeholder="Nome Completo" maxlengtht="75"> <input type="email" name="email" placeholder="Usuário" maxlength="50"> <input type="password" name="senha" placeholder="Senha" maxlength="12"> <input type="password" name="confsenha" placeholder="Confirmar Senha" maxlength="12"> <input type="submit" value="INSERIR"> </form> </div> <?php if(isset($_POST['nome'])) { $nome = addslashes($_POST['nome']); $email = addslashes($_POST['email']); $senha = addslashes($_POST['senha']); $confsenha = addslashes($_POST['confsenha']); if(!empty($nome) && !empty($email) && !empty($senha) && !empty($confsenha)) { $u->conectar("****","localhost","***","***"); if($u->msgErro == "") { if($senha == $confsenha){ if($u->cadastrar($nome,$email,$senha)) { echo "Cadastro realizado com sucesso!"; } else { echo "Email já cadastrado no sistema!"; } } else { echo "Senhas digitadas não correspondem."; } } else { echo "Erro:" .$u->msgErro; } } else { echo "Por favor, preencha todos os campos."; } } ?> </body> </head> </html>  
      E aqui a classe usuários
       
      <?php Class Usuario { private $pdo; public $msgErro = ""; public function conectar($nome, $host, $usuario, $senha) { global $pdo; try { $pdo = new PDO("mysql:dbname=".$nome.";host=.$host,$usuario,$senha); } catch (PDOException $e) { $msgErro = $e->getMessage(); } public function cadastrar($nome, $email, $senha, $situacoe_id, $niveis_acesso_id, $created, $modified) { global $pdo; $sql = $pdo->prepare("SELECT id FROM usuarios WHERE email = :e"); $sqk->bindValue(":e",$email); $sql->execute(); if($sql->rowCount() > 0) { return false; } else { $sql = $pdo->prepare("INSERT TO usuarios ($nome, $email, $senha, $situacoe_id, $niveis_acesso_id, $created, $modified) VALUES(:n, :e, :p, :s, :n, :c, :m)"); $sqk->bindValue(":n",$nome); $sqk->bindValue(":e",$email); $sqk->bindValue(":p",md5($senha)); $sqk->bindValue(":s",$situacoe_id); $sqk->bindValue(":n",$niveis_acesso_id); $sqk->bindValue(":c",$created); $sqk->bindValue(":m",$modified); $sql->execute(); return true; } } public function logar($email, $senha) { global $pdo; $sql = $pdo->prepare("SELECT id FROM usuarios WHERE email = :e AND senha = :p"); $sql->bindValue(":e",$email); $sql->bindValue(":p"md5($senha)); $sql->execute(); if($sql->rowCont() > 0) { $dado = $sql->fetch(); session_start(); $_SESSION['id'] = $dado['id']; return true; } else { return false; } } } ?>  
      Se alguém puder ajudar, e conseguir identificar onde está o erro, fico muito, muito agradecido. Abraços
       
       
       
    • Por Marcones Borges
      Olá, estou precisando de uma ajuda...
       
      Tenho duas tabelas
      ministros
      entradas
       
      Preciso exibir a lista dos ministros que não contam no relatório gerado em entradas.
       
      Fiz assim a combinação.
       

      $sql = "SELECT ministro.id, ministro.area, entrada.beneficiario, entrada.id_benificiario, entrada.id_benificiario, entrada.tipo_lancamento FROM ministro INNER JOIN entrada ON ministro.id = entrada.id_benificiario WHERE ministro.area = entrada.area_beneficiario AND ministro.nome = entrada.beneficiario AND entrada.id_benificiario='[{$id_exer}' AND entrada.tipo_lancamento='ministro'  "; $stm = $conexao->prepare($sql); $stm->execute(); $clientes = $stm->fetchAll(PDO::FETCH_OBJ);
       
      Fiz as combinações direitinho mais não consigui exbir os que estão na tabela ministro e não estão na tabela entrada.
    • Por Marcones Borges
      Olá, sou iniciante em php, estou tentando migrar um código de php 5.6 para pdo mais da erro, não roda....
      Alguém pode me ajudar?

      include '../Connections/functions.php';           function montaSelect()         {  $sql = "SELECT * FROM membros"; $result = $con->query($sql); if ($result->num_rows > 0 )  {   while($dados = $result->fetch_assoc())   {   $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>';   } } else {           $opt = '<option value="0">Nenhum Membro cadastrado</option>';     return $opt; }         }
       
      Este era o código original:
       

      // require 'topof.php'; // echo $usuario;         /**          * função que retorna o select          */         function montaSelect()         {                 $sql = "SELECT id, nome FROM membros '";                 $query = mysql_query( $sql );                 if( mysql_num_rows( $query ) > 0 )                 {                         while( $dados = mysql_fetch_assoc( $query ) )                         {                                 $opt .= '<option value="'.$dados['id'].'">'.$dados['nome'].'</option>';                         }                 }                 else                         $opt = '<option value="0">Nenhum Membro cadastrado</option>';                 return $opt;         }
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.