php - 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”。那么我还能做些什么来解决这个问题呢?
解决方案
我设法弄清楚了,是的,这是导致问题的逻辑问题。这就是我现在的做法,并且效果很好:
$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>';
}
推荐阅读
- python - 如何解决我的 .pkl 文件无法加载的问题
- android - onPress() 不适用于 expo v42.0.0。对圆形按钮使用 TouchableOpacity
- vue.js - 将从 API 获取的动态元标记添加到 nuxtjs 静态站点
- c++ - 初始化列表中的抽象类init
- linux - bash 脚本;重命名/子目录中的文件
- excel - VBA Excel:函数不适用于组合单元格
- javascript - 如何使用 Google 表格脚本将数据范围从一张表格复制到另一张表格
- jmeter - Jmeter命令行选项问题
- sql - 使用上个月的值在结果中添加缺失的月份
- openshift - 在 start-build 命令执行期间获取日志/更多信息