PHP PDO Notify user which registration name already exists

Asked

Viewed 895 times

0

Hello. The code below does not allow the user to choose an already used name. But I would still like to warn the user who chose the wrong name so he knows he needs to choose another registration name.

include_once 'database.php';
// Verifica se o formulário foi submetido
if($_SERVER['REQUEST_METHOD'] == 'POST'){
/* Armazena os dados enviados pelo formulário em uma 
 * variável normal para não trabalhar com a variável global $_POST (não é  seguro)
 */
$post = $_POST;

// Verifica se todos campos vieram pelo formulário e se estão preenchidos
if(isset($post['email'])     && $post['email']     && 
   isset($post['username']) && $post['username'] && 
   isset($post['password']) && $post['password']){

    // Prepara uma sentença para ser executada
    $statement = $pdo->prepare('INSERT INTO tbl_users (email, username, password) VALUES (:email, :username, :password)');

    // Filtra os dados e armazena em variáveis (o filtro padrão é FILTER_SANITIZE_STRING que remove tags HTML)
    $email     = filter_var($post['email']);
    $username = filter_var($post['username']);
    $password = filter_var($post['password']);

    // Adiciona os dados acima para serem executados na sentença
    $statement->bindParam(':email',     $email);
    $statement->bindParam(':username', $username);
    $statement->bindParam(':password', $password);

    // Executa a sentença já com os valores
    if($statement->execute()){
        // Definimos a mensagem de sucesso
        $_SESSION['message'] = 'Usuário cadastrado com sucesso';
    }else{
        // Definimos a mensagem de erro
        $_SESSION['message'] = 'Falha ao cadastrar usuário';
    } 

}else{
    // Definimos a mensagem de erro
    $_SESSION['message'] = 'Preencha todos os campos';
}
}
// Redirecionamos para a página inicial
header('Location: login.php');
?>
  • This page receives the data through a redirect coming from a form, or you are using ajax?

  • Comes from a simple form.

  • It is already preventing two users with the same name, but it does not warn who puts the name that already exists and goes straight to the login page, without registering the person.

  • What you did in your script was to create a Session to save the message

  • If there is already a user with the same name you will send it back to login anyway?

  • No. I want the system to warn that the name already exists so that the user can fix it before going to login.

  • I made a few changes to your code, take a look and see if it fits

Show 2 more comments

2 answers

1

can also use a floating window

elseif($mensagem == "username"){
    echo ("
    <script type=\"text/javascript\" src=\"jquery.colorbox.js\"></script>
    <link rel=\"stylesheet\" type=\"text/css\" href=\"colorbox.css\">
    <style>#ajax{height:40px; width:500px;}</style>
    <script type=\"text/javascript\">
     $(window).load(function(){
        $(document).ready(function(){
        $.colorbox({inline:true, href:\".ajax\"});
        });
        });
    </script>
    <div style=\"display:none\"><div id=\"ajax\" class=\"ajax\">Já existe um usuário com esse Username.</div></div>");
  • Where exactly would I put this? I would have to add something else?

  • js files at https://github.com/jackmoore/colorbox

0


    include_once 'database.php';
    // Verifica se o formulário foi submetido
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
    /* Armazena os dados enviados pelo formulário em uma 
     * variável normal para não trabalhar com a variável global $_POST (não é  seguro)
     */
    $post = $_POST;

    // Verifica se todos campos vieram pelo formulário e se estão preenchidos
    if(isset($post['email'])     && $post['email']     && 
       isset($post['username']) && $post['username'] && 
       isset($post['password']) && $post['password']){

        //verifica se o usuário realmente não existe
        $verifica = $pdo->prepare('SELECT * FROM tbl_users WHERE email = '.$post['email'].' AND username = '.$post['username'].'');
        $verifica->execute();

        //conta o numero de registros obtidos
        $rows = $verifica->rowCount();
        if($rows >= 1){
           $mensagem = "username";
        }else {
              // Prepara uma sentença para ser executada
              $statement = $pdo->prepare('INSERT INTO tbl_users (email, username, password) VALUES (:email, :username, :password)');

              // Filtra os dados e armazena em variáveis (o filtro padrão é FILTER_SANITIZE_STRING que remove tags HTML)
               $email     = filter_var($post['email']);
               $username = filter_var($post['username']);
               $password = filter_var($post['password']);

               // Adiciona os dados acima para serem executados na sentença
               $statement->bindParam(':email',     $email);
               $statement->bindParam(':username', $username);
               $statement->bindParam(':password', $password);

               // Executa a sentença já com os valores
               if($statement->execute()){
                   // Definimos a mensagem de sucesso
                   $mensagem = "sucesso";
               }else{
                   // Definimos a mensagem de erro
                   $mensagem = "erro";
               } 
        }

    }else{
        // Definimos a mensagem de erro
        $mensagem = "erro";
    }
}

if($mensagem == "erro"){
      echo "<script>alert('Houve um erro ao processar seus dados, tente novamente'); location.href = 'sua-pagina.php';</script>";
}elseif($mensagem == "username"){
      echo "<script>alert('Já existe um usuário com esse Username / E-mail'); location.href = 'sua-pagina.php';</script>";
}else {
      // Redirecionamos para a página inicial
      header('Location: login.php'); 
}
  • Error in line 18:Unexpected '$post['email']'

  • I used the same variables from your code, from a print_r in your $_POST and see if everything is all right

  • Everything is fine but it seems that it does not accept the '$post' there.

  • Sorry, I forgot to concatenate the variable inside the search line, put . before and at the end of the variables inside the first select, I will edit

  • It worked by putting :username

  • I e-mailed you because I thought you might check the e-mail too

  • This code is vulnerable to sql Injection. If you are using PDO, use it correctly.

Show 2 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.