Ir para conteúdo

Arquivado

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

Rodrigo5468

Validação em PDO OOP

Recommended Posts

Boa tarde a todos.

 

Estou desenvolvendo um sistema de registro para fins de estudos, mas tenho algumas dúvidas e dificuldades até. Estou usando "programação orientada a objetos", e quero validar alguns campos do meu registro, se puderem me auxiliar, será de grande ajuda.

 

Meu Diretório:

Projeto1/
├── backend/
│   ├── classes/
│   │   ├── Register.php
├── index.php

Em Register.php tenho o seguinte código para fazer a validação, mas acredito que estou fazendo algo de errado.

        public function setUsername($username) {
            $sql    = "SELECT * FROM $this->table WHERE username = :username";
            $stmt   = Database::prepare($sql);
            $stmt->execute(array('username' => $_POST["username"]));
            
            if(empty($_POST["username"])) {
                return "O campo usuário não pode ser vázio.";
            }elseif(ctype_space($_POST["username"])) {
                return "Não pode usar apenas espaços no campo de usuário.";
            }elseif(strlen($_POST["username"] < 3)) {
                return "É necessário no mínimo 3 (três) caracteres no usuário.";
            }elseif(strlen($_POST["username"] > 15)) {
                return "O máximo é de 15 (quinze) caracteres no usuário.";
            }elseif(preg_match("/^[a-zA-Z0-9]*$/", $_POST["username"] == 0)) {
                return "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)";
            }elseif($stmt->num_rows !== 0) {
                return "O nome de usuário já está cadastrado em nossos bancos de dados.";
            }else {
                $this->username = $username;
            }
        }

E no index.php tenho o seguinte código, acredito que está certo, mas eu gostaria de mostrar as mensagens de erros que estão no Register.php, como que posso fazer isso?

        $register = new Registers();
        
        if(isset($_POST["cadastrar"])) {
            $username   = $_POST["username"];
            $email      = $_POST["email"];
            $password   = $_POST["password"];
            
            $register->setUsername($username);
            $register->setEmail($email);
            $register->setPassword($password);
            
            if($register->insert()) {
                return "Usuário cadastrado com sucesso.";
            }
        }

 

 

Obrigado pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo5468, joia!

Existem muitas formas de fazer, a refatoração não tem limites!

Uma boa prática, seria você ter suas validações isoladas, e os métodos realmente fazerem o que dizem que fazem, por exemplo:
Eu espero que o método setName apenas sete o nome, e nada mais!

Segue uma ideia:

class ValidaCadastro
{
    private $erros = [];

    public function __construct(array $dados)
    {
        $this->validaNome($dados['nome']);
        $this->validaEmail($dados['email']);
        $this->validaSenha($dados['senha'])
    }
    
    public function erros()
    {
        return $this->erros;
    }

    public function validaNome($nome)
    {
        /**
         *  se o nome estiver vazio 
         */
        $this->erros[] = 'O campo usuário não pode ser vázio.';

        /**
         *  se o nome tiver menos que três letras
         */
        $this->erros[] = 'É necessário no mínimo 3 (três) caracteres no usuário';
    }

    public function validaEmail()
    {
        //
    }

    public function validaSenha()
    {
        //
    }
}

   $validaCadastro = new ValidaCadastro($_POST)

    if ($erros = $validaCadastro->erros()) {
        foreach ($erros as $erro) {
            echo $erro;
        }
        return;   
    }

    $register = new Registers();

    $register->setUsername($username);
    $register->setEmail($email);
    // etc...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

image.thumb.png.4ce57010b5b39bd1114a3bf43b8d8338.png

Fiz o quê você me pediu, aliás, tentei fazer, mas acho que não deu muito certo.

ValidaCadastro.php

<?php
    require_once (__DIR__."\Registers.php");
    
    class ValidaCadastro extends Registers {
        private $dados;
        private $erros = [];
        
        public function __construct($dados) {
            $this->validaUsername($this->username);
    }
        
        public function erros() {
            return $this->erros;
        }
        
        public function validaUsername() {
            if(empty($_POST["username"])) {
                 $this->erros[] = "O campo usuário não pode ser vázio.";
            }elseif(ctype_space($_POST["username"])) {
                 $this->erros[] = "Não pode usar apenas espaços no campo de usuário.";
            }elseif(strlen($_POST["username"] < 3)) {
                 $this->erros[] = "É necessário no mínimo 3 (três) caracteres no usuário.";
            }elseif(strlen($_POST["username"] > 15)) {
                 $this->erros[] = "O máximo é de 15 (quinze) caracteres no usuário.";
            }elseif(preg_match("/^[a-zA-Z0-9]*$/", $_POST["username"] == 0)) {
                 $this->erros[] = "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)";
            }elseif($stmt->num_rows !== 0) {
                 $this->erros[] = "O nome de usuário já está cadastrado em nossos bancos de dados.";
            }
        }
    }

E no index.php

    <?php
        $validaCadastro = new ValidaCadastro($_POST["cadastrar"]);
        
        if($erros = $validaCadastro->erros()) {
            foreach ($erros as $erro) {
                echo $erro;
            }
            
            return;
        }
        
        $register = new Registers();
        
        if(isset($_POST["cadastrar"])) {
            $username   = $_POST["username"];
            $email      = $_POST["email"];
            $password   = $_POST["password"];
            
            $register->setUsername($username);
            $register->setEmail($email);
            $register->setPassword($password);
            
            if($register->insert()) {
                return "Usuário cadastrado com sucesso.";
            }
        }
    ?>

 

O quê eu tenho que fazer exatamente, poderia me dá mais detalhes por favor.

 

 

OBRIGADOOO!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigo5468, só alguns ajustes...
 

// Aqui eu me confundi, no construtor, vai $_POST, e não $_POST['cadastrar']
$validaCadastro = new ValidaCadastro($_POST);

// E aqui fica assim mesmo
public function __construct($dados) {
    $this->validaUsername($dados['username']);
}

// E no metodo, não precisa mais usar o $_POST, use o $userName
public function validaUsername($userName) {
    if(empty($userName)) {
            $this->erros[] = "O campo usuário não pode ser vázio.";
    }
    //
    //
}

 

class ValidaCadastro extends Registers

E ValidaCadastro não herda de Registers

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, mano tá dando certo, mas peço que tenha mais um pouco de paciência comigo.

image.png.0d4094b14807adb8d99e96429e3e79d9.png

 

<?php
    class ValidaCadastro {
        private $dados;
        private $erros = [];
        
        public function __construct(array $dados) {
            $this->validaUsername($dados['username']);
        }
        
        public function erros() {
            return $this->erros;
        }
        
        public function validaUsername() {
            if(empty($username)) {
                 $this->erros[] = "O campo usuário não pode ser vázio.";
            }elseif(ctype_space($username)) {
                 $this->erros[] = "Não pode usar apenas espaços no campo de usuário.";
            }elseif(strlen($username) < 3) {
                 $this->erros[] = "É necessário no mínimo 3 (três) caracteres no usuário.";
            }elseif(strlen($username) > 15) {
                 $this->erros[] = "O máximo é de 15 (quinze) caracteres no usuário.";
            }elseif(preg_match("/^[a-zA-Z0-9]*$/", $username == 0)) {
                 $this->erros[] = "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)";
            }elseif($username !== 0) {
                 $this->erros[] = "O nome de usuário já está cadastrado em nossos bancos de dados.";
            }
        }
    }

Fiz as alterações, mas está dando erro, já tentei alterar para

$this->dados = $username;

 

Entre diversas outras maneiras, mas não foi.

 

Obrigado por tudo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como a intenção é só validação de uma string ao qual pode existir ou não.

Usar um construtor no meu ponto de vista não é uma boa ideia, pois não necessita de um comportamento inicial pela classe.

 

Então só passando o olho rapidinho identifiquei erro já na primeira condição do método validaUsername uma vez que a variável $username não pertence ao escopo do método nem foi criada.

Ou detalhe que no caso específico de sua classe que usa um construtor. Ela só pode ser instanciada dentro das condições que existem uma super global POST e obrigatoriamente é necessário existir o índice username, caso não sempre vai gerar o erro citado.

Outro erro é que o método construtor envia como parâmetro dados para o outro método, ao qual não possui recebimento de parâmetro.

 

Tente assim:

Spoiler

<?php
class ValidaCadastro {

    private $erros;

    public function erros() {
        return $this->erros;
    }

    public function validaUsername($username) {
        if (!isset($username)) {
            $this->erros = "Ops! não temos a string para prosseguir";
            return true;
        } else if (empty($username)) {
            $this->erros = "O campo usuário não pode ser vázio.";
            return true;
        //} else if (ctype_space($username)) { Desnecessário pois temos uma expressão regular para verificar isso
        } else if (strlen($username) < 3) {
            $this->erros = "É necessário no mínimo 3 (três) caracteres no usuário.";
            return true;
        } else if (strlen($username) > 15) {
            $this->erros = "O máximo é de 15 (quinze) caracteres no usuário.";
            return true;
            //} else if (preg_match("/^[a-zA-Z0-9]*$/", $username == 0)) {
        } else if (!preg_match('/^([a-zA-Z0-9]+)$/i', $username)) {
            $this->erros = "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)";
            return true;
        }
        /*
          Isso aqui não deveria exisir estamos verificando um STRING e não um INTEGER
          else if ($username !== 0) {
          $this->erros[] = "O nome de usuário já está cadastrado em nossos bancos de dados.";
          }
         */
    }
}

 

 

Exemplo simples:


$register = new ValidaCadastro();

if (isset($_POST["cadastrar"])) {
    if ($register->validaUsername(isset($_POST["username"]) ? $_POST["username"] : null)) {
        echo $register->erros();
    }
    // Crie os métodos para verificar os outros dados email/password
    else {
        var_dump($_POST); // Isso é só para depurar seus dados
        // Aqui você faz o que tem de fazer com o banco de dados
    }
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Omar~, beleza!

Neste caso, instanciar a classe, vazia, abriria margens para falsos positivos, por exemplo:

$validaCadastro = new ValidaCadastro();
echo $validaCadastro->erros(); // Sem erros

Eu passei pela validação, sem passar os dados. Isso não deveria ser possível!
Alem do mais, para essa regra, os campos nome, email e senha são obrigatórios para validar o cadastrado, nenhum é opcional.

Mas o seu comentário só acrescenta, pois esse mesmo racional que você colocou sobre o construtor, muita gente tem.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, EdCesar disse:

@Omar~, beleza!

Neste caso, instanciar a classe, vazia, abriria margens para falsos positivos, por exemplo:


$validaCadastro = new ValidaCadastro();
echo $validaCadastro->erros(); // Sem erros

Eu passei pela validação, sem passar os dados. Isso não deveria ser possível!
Alem do mais, para essa regra, os campos nome, email e senha são obrigatórios para validar o cadastrado, nenhum é opcional.

Mas o seu comentário só acrescenta, pois esse mesmo racional que você colocou sobre o construtor, muita gente tem.

 

Sim, você está correto. Minha intenção foi esclarecer que ele inverteu sua lógica onde o uso dos dados é true, e ele mesmo deixou de usar a lógica do construtor, que tem a finalidade de determinar o que a classe vai fazer antes mesmo de algum método ser iniciado.

A única coisa que eu mudaria nesse caso:

Spoiler
13 horas atrás, EdCesar disse:

 



// Aqui eu me confundi, no construtor, vai $_POST, e não $_POST['cadastrar']
$validaCadastro = new ValidaCadastro($_POST);

// E aqui fica assim mesmo
public function __construct($dados) {
    $this->validaUsername($dados['username']);
}

// E no metodo, não precisa mais usar o $_POST, use o $userName
public function validaUsername($userName) {
    if(empty($userName)) {
            $this->erros[] = "O campo usuário não pode ser vázio.";
    }
    //
    //
}

 

 

É ao invés de repassar o índice do POST como parâmetro. Eu armazenaria em um atributo se não vazio ou não existente, assim poderia usar em mais de um método, caso queira criar novo método para verificar a existência dos mesmo em um banco de dados, mas enfim cada caso é um caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Fiz algumas alterações no código, e decidir remover o validaCadastro.php, não sei se agir de maneira correta, mas vamos lá.

Register.php

<?php
    require_once (__DIR__."\Crud.php");
    
    final class Registers extends Crud {
        protected $table = "accounts";
        
        private $erros;
        private $username;
        private $email;
        private $password;
        
        public function erros() {
            return $this->erros;
        }
        
        /*MÉTODOS SET*/
        public function setUsername($username) {
            if(!isset($username)) {
                 $this->erros[] = "Ops! não temos a string para prosseguir.";
                 return true;
            }elseif(empty($username)) {
                 $this->erros[] = "O campo usuário não pode ser vázio.";
                 return true;
            }elseif(strlen($username) < 3) {
                 $this->erros[] = "É necessário no mínimo 3 (três) caracteres no usuário.";
                 return true;
            }elseif(strlen($username) > 15) {
                 $this->erros[] = "O máximo é de 15 (quinze) caracteres no usuário.";
                 return true;
            }elseif(!preg_match('/^([a-zA-Z0-9]+)$/i', $username)) {
                 $this->erros[] = "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)";
                 return true;
            }else {
                $this->username = $username;
            }
        }
        
        public function setEmail($email) {
            $this->email = $email;
        }
        
        public function setPassword($password) {
            if(!empty($password)) {
                $options = [
                    "cost" => 11,
                ];
                
                $this->password = password_hash($password, PASSWORD_BCRYPT, $options);
                
                if(password_verify($password, $this->password)) {
                    return true;
                }
            }
            
            return false;
        }
        
        /*FUNÇÕES*/
        public function insert() {
            $sql    = "INSERT INTO $this->table (username, email, password) VALUES (:username, :email, :password)";
            $stmt   = Database::prepare($sql);
            $stmt->bindParam(":username", $this->username);
            $stmt->bindParam(":email", $this->email);
            $stmt->bindParam(":password", $this->password);
            
            return $stmt->execute();
        }
        
        public function update($id) {
            $sql    = "UPDATE $this->table SET username = :username, email = :email, password = :password WHERE id = :id";
            $stmt   = Database::prepare($sql);
            $stmt->bindParam(":username", $this->username);
            $stmt->bindParam(":email", $this->email);
            $stmt->bindParam(":password", $this->password);
            $stmt->bindParam(":id", $id);
            
            return $stmt->execute();
        }
    }

index.php

    <?php
        $register = new Registers();
        
        if(isset($_POST["cadastrar"])) {
            $username   = $_POST["username"];
            $email      = $_POST["email"];
            $password   = $_POST["password"];
            
            if($register->setUsername(isset($username) ? $username : null)) {
                echo $register->erros();
            }else {
                $var_dump = var_dump($username);
                echo $var_dump;
            }
            $register->setEmail($email);
            $register->setPassword($password);
            
            if($register->insert()) {
                return "Usuário cadastrado com sucesso.";
            }
        }
    ?>

 

Só que o código não está funcionando como deveria, poderia me dizer, o quê tem de errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há um erro de arquitetura como EdCezar já mencionou, quando se trabalha com POO, a primeira coisa a levar em consideração é,  em qual padrão de persistência de dados você vai usar. DAO, MVC "Mais fáceis" etc. Porque do mais, é como que colocar scripts procedurais dentro de classes "Seu Caso". 

Utilizando o DAO, você pode separar as regras de negócios das regras de acesso ao banco de dados.

Exemplo  básico ilustrativo, pois a inúmeros exemplos na net.
 

<?php

require "../Database.php";
require "../Entities/User.php";
require "../Rules/UserRule.php";
require "../Persistences/UserDAO.php";

$db = new Database();
$user = new User();
$dao = new UserDAO($db);

$rule = new UserRule(); //Caso precise verificar se usuario ou email existe, passe a conexão peloo constructor
$rule->isUserName($username);
$rule->isPassword($password);
$rule->isEmail($email);

if(count( $rule->errors() <= 0 )) {

    $user->setUserName($username);
    $user->setPassword($password);
    $user->setEmail($email);    

    $success = $dao->add($user);

} else {
    foreach($rule->errors() as $error) {
        // Tras todos os erros de uma só vez
    }
}





 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por juniormatrix
      Olá
       
      Achei esse script aqui no fórum mesmo:
       
      $.validator.addMethod( "customEmail", function (value, element) { return this.optional(element) || /^[\w-\.]+@fulano\.com\.br$/i.test(value); }, "Por favor, insira um e-mail válido com o domínio @fulano.com.br" ); $("#formulario").validate({ ignore: ".ignore", rules: { empresa: { required: true }, nome: { required: true }, contato: { required: true }, celular: { required: true }, email: { required: true, email: true, customEmail: true }, }, }); Testei e funcionou perfeitamente, mas gostaria que liberasse mais e-mails válidos, ao invés de apenas um.

      Tem como fazer? 
       
      Se alguém puder ajudar, fico muito grato.
    • 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 estanieski_poa
      Estou com um sistema antigo, desenvolvido em Delphi 7+Oracle10g.
       
      O sistema funciona corretamente, mas ele começou a ficar solcititando usuário e senha do Oracle quando realizo pesquisar ou inserções no sistema.
       
      Como desativo essa solicitação?
    • 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
       
       
       
×

Informação importante

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