首页 > 解决方案 > PHP 查询未按预期工作。应显示错误时运行插入语句

问题描述

我想知道是否可以就我正在创建的网站的注册页面中的哪里出错获得一些帮助。

当用户创建帐户时,会进行检查以确保他们输入的用户名和电子邮件尚未被使用。如果两者都没有,那么他们输入的信息将输入到我设置的 SQL 表中。目前虽然这不起作用,但如果电子邮件地址已被占用,则会显示错误,但如果用户名已被占用,则不会显示错误并将信息插入 SQL 表中。

这就是我目前所拥有的:

<body>
 <?php

    //if form has been submitted process it

    if(isset($_POST['submit'])){



        //collect form data

        extract($_POST);

        
            if($name==''){

            $error[] = 'Please enter your name.';

        }



        if($username ==''){

            $error[] = 'Please enter the username you would like.';

        }

        if($email==''){

            $error[] = 'Please enter your email address.';

        }
        
            if($age < 18){

            $error[] = 'You are too young to create an account with this site.';

        }
        
        if ($age==''){
            $error[] = 'Please enter your age.';
        }
        
          if($email==''){

            $error[] = 'Please enter your email address.';

        }


        if($password ==''){

            $error[] = 'Please enter your password.';

        }



        if($passwordConfirm ==''){

            $error[] = 'Please confirm the password.';

        }



        if($password != $passwordConfirm){

            $error[] = 'Passwords do not match.';

        }
        

        
        if(!isset($error)){

            $query = $dbconn->prepare('SELECT username FROM users WHERE username = ?');

            $query->bindValue( 1, $username );

            $query->execute();



            if( $query->rowCount() > 0 ) { # If rows are found for query

   
            echo '<p class="error" align="center">An account has already been made using this username</p>';


            }
            
            $query = $dbconn->prepare('SELECT email FROM users WHERE email = ?');

            $query->bindValue( 1, $email );

            $query->execute();



            if( $query->rowCount() > 0 ) { # If rows are found for query

   
            echo '<p class="error" align="center">An account has already been made using this email address</p>';


            }

            else {


                try {

                $hashedpassword = password_hash($password, PASSWORD_BCRYPT);


                //insert into database

  
                $stmt = $dbconn->prepare('INSERT INTO users (username,name,password,email,role,age,passwordchange) VALUES (:username, :name, :password, :email, :role, :age, :passwordchange)') ;

                $stmt->execute(array(

                    ':username' => $username,

                    ':name' => $name,
                    
                    ':password' => $hashedpassword,
                    
                    ':email' => $email,

                    ':role' => "user",
                    
                    ':age' => $age,
                    
                    ':passwordchange' => 0

                  

                ));
                    //redirect to login page

                header('Location: login.php');

                exit;

            } catch(PDOException $e) {

                echo $e->getMessage();

            }           

            }

        }
    
    }
            //check for any errors

    if(isset($error)){

        foreach($error as $error){

            echo '<p class="error" align="center">'.$error.'</p>';

        }

    }
    
    ?>

<div class = "register">

<form action='' method='post' align = "center">
         <h2>Register an account</h2>
    <p><label>Name</label><br />

        <input type='text' name='name' value='<?php if(isset($error)){ echo $_POST['name'];}?>'></p>

        <p><label>Username</label><br />

        <input type='text' name='username' value='<?php if(isset($error)){ echo $_POST['username'];}?>'></p>

        <p><label>Email Address</label><br />

        <input type='email' name='email' value='<?php if(isset($error)){ echo $_POST['email'];}?>'></p>
                
        <p><label>Age</label><br />

        <input type='age' name='age' value='<?php if(isset($error)){ echo $_POST['age'];}?>'></p>

        <p><label>Password</label><br />

        <input type='password' name='password' value='<?php if(isset($error)){ echo $_POST['password'];}?>'></p>



        <p><label>Confirm Password</label><br />

        <input type='password' name='passwordConfirm' value='<?php if(isset($error)){ echo $_POST['passwordConfirm'];}?>'></p>

        <p><input type='submit' name='submit' value='Register'></p>
        
        <p>Already a member? <a href="login.php">Log in</a></p>

    </form>
  </div>

</body>

更多信息:

如果我交换用户名和电子邮件查询,那么如果用户名已被使用但未与电子邮件一起使用,则会显示错误。

如果我没有带有用于插入数据库的代码的 else 语句,那么两个查询都将返回错误。我真的很困惑我哪里出错了,任何帮助将不胜感激

编辑:

所以我仍然对为什么这不起作用感到困惑,我已经这样做了,就像我为其他项目所做的那样,它运行良好,所以我不知道为什么它在这里不起作用。

评论建议将 else 与第二个 if 语句一起用于电子邮件检查,然后我收到一条错误消息,提示“unexpected else”。那么我还能做些什么来解决这个问题呢?

标签: phphtml

解决方案


我设法弄清楚了,是的,这是导致问题的逻辑问题。这就是我现在的做法,并且效果很好:

$userQuery = $dbconn->prepare( 'SELECT username FROM users WHERE username = ?');

            $userQuery->bindValue( 1, $username );

            $userQuery->execute();

            $emailQuery = $dbconn->prepare( 'SELECT email FROM users WHERE email = ?' );

            $emailQuery->bindValue( 1, $email );

            $emailQuery->execute();

            
         if($userQuery->rowCount() > 0 && $emailQuery->rowCount() > 0  ) {
            
            echo '<p class="error" align="center">An account has already been made using this username</p>';
            echo '<p class="error" align="center">An account has already been made using this email address</p>';

        }



            else if( $userQuery->rowCount() > 0 ) { # If rows are found for query

            echo '<p class="error" align="center">An account has already been made using this username</p>';

        }
    
        else if( $emailQuery->rowCount() > 0 ) { # If rows are found for query

            echo '<p class="error" align="center">An account has already been made using this email address</p>';

            }

推荐阅读