PHP 复制教程代码后表单验证无法正常工作
PHP form validation not functioning having copied the tutorial code
我希望社区能让我深入了解我的代码有什么问题,我正在学习 Udemy 课程。我观看了随附的视频,该视频出现了一个未定义的变量错误,经过一些研究后,我相信我已经通过将变量声明为空字符串来修复它,该空字符串可以被表单数据覆盖。
如果两个字段都已完成,表单会将数据发送到数据库,如果其中一个字段为空,则不会发送数据,这是应该的。
如果其中一个字段为空,它应该 return 一条语句要求用户在相应的字段中输入数据,但没有发送任何内容。
教程和我的代码之间的唯一区别是我使用了物化框架,而教程使用的是 bootstrap,但我看不出这是问题所在。
我附上了我的代码,并注释掉了多余的部分。
<?php
include('php/connection.php');
//validates data for create user form
if( isset( $_POST["createUserBtn"])){
$createUsername = "";
$createUserPassword = "";
function validateFormData( $formData ) {
$formData = trim( stripcslashes( htmlspecialchars( $formData)));
return $formData;
}
if( !$_POST["createUsername"]){
$createUsernameError = "Enter a username <br>";
} else {
$createUsername = validateFormData( $_POST["createUsername"]);
}
if( !$_POST["createUserPassword"]){
$createUserPasswordError = "Enter a Password <br>";
} else {
$createUserPassword = validateFormData( $_POST["createUserPassword"]);
}
if( $createUsername && $createUserPassword) {
$query = "INSERT INTO users (user_id, userName, userPassword) VALUES (NULL, '$createUsername', '$createUserPassword')";
// if( mysqli_query( $connection, $query)){
// echo "New User added";
// } else {
// echo "Error: ".$query."<br>".mysqli_error($connection);
// }
}
}
?>
<!DOCTYPE html>
<html lang="en">
<?php require('static/header.php'); ?>
<?php
$createUsernameError = "";
$createUserPasswordError = "";
?>
<div class="col s8 m8 l5 valign-wrapper">
<div class="container">
<form action="<?php echo htmlspecialchars( $_SERVER["PHP_SELF"] ); ?>" method="post">
<div class="row">
<div class="col s12">
<span><h4>Create your user account - create user.php</h4></span>
<div class="row form-font">
<div class="col s12">
<div class="input-field">
<a class="red-text"><?php echo $createUsernameError; ?></a>
<input placeholder="Enter your username" type="text" name="createUsername">
<label for="email">Username</label>
</div>
<div class="input-field">
<a class="red-text"><?php echo $createUserPasswordError; ?></a>
<input placeholder="Enter your password" type="password" name="createUserPassword">
<label for="password">Password</label>
</div>
<div class="row left-align">
<div class="col s2"></div>
<div class="col s8">
<button class="btn-flat waves-effect waves-custom" type="submit" name="createUserBtn"><i class="material-icons left">create</i>Create Account</button>
</div>
<div class="col s2"></div>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
<?php require('static/footer.php'); ?>
</html>
仔细查看您的代码和您使用的地方 - 例如 - $createUsernameError
变量。
如果出现错误,您可以使用以下行在其中设置一条消息:$createUsernameError = "Enter a username <br>";
。太棒了,正是你想要的。
但是,稍后在代码中,您 运行 $createUsernameError = "";
,它再次将其重置为空。这种情况 在所有情况下都会发生,无论是否发现错误 。它发生在您尝试 echo
那个变量到页面上之前。
所以基本上你是在设置值,然后在输出之前立即再次将其消隐。您需要确保它只在没有错误的情况下设置为空白。密码错误信息也是同样的问题。
一个简单的方法就是在您运行错误检查之前将值设置为空白。如果没有错误,它将保持空白,但它不会覆盖任何已设置的错误消息。
所以只需移动这些行:
$createUsernameError = "";
$createUserPasswordError = "";
到脚本的顶部。
P.S。在任何类型的实时环境中使用此代码之前,请注意评论中发布的安全警告并紧急修复您的代码以消除这些漏洞。即使您不打算真正使用此代码,您仍然应该解决这些问题,以便您学会以正确、安全、可靠的方式做事,并且不会养成坏习惯。如果您是从在线课程中复制此代码,我建议您寻找更好的课程。
我希望社区能让我深入了解我的代码有什么问题,我正在学习 Udemy 课程。我观看了随附的视频,该视频出现了一个未定义的变量错误,经过一些研究后,我相信我已经通过将变量声明为空字符串来修复它,该空字符串可以被表单数据覆盖。
如果两个字段都已完成,表单会将数据发送到数据库,如果其中一个字段为空,则不会发送数据,这是应该的。
如果其中一个字段为空,它应该 return 一条语句要求用户在相应的字段中输入数据,但没有发送任何内容。
教程和我的代码之间的唯一区别是我使用了物化框架,而教程使用的是 bootstrap,但我看不出这是问题所在。
我附上了我的代码,并注释掉了多余的部分。
<?php
include('php/connection.php');
//validates data for create user form
if( isset( $_POST["createUserBtn"])){
$createUsername = "";
$createUserPassword = "";
function validateFormData( $formData ) {
$formData = trim( stripcslashes( htmlspecialchars( $formData)));
return $formData;
}
if( !$_POST["createUsername"]){
$createUsernameError = "Enter a username <br>";
} else {
$createUsername = validateFormData( $_POST["createUsername"]);
}
if( !$_POST["createUserPassword"]){
$createUserPasswordError = "Enter a Password <br>";
} else {
$createUserPassword = validateFormData( $_POST["createUserPassword"]);
}
if( $createUsername && $createUserPassword) {
$query = "INSERT INTO users (user_id, userName, userPassword) VALUES (NULL, '$createUsername', '$createUserPassword')";
// if( mysqli_query( $connection, $query)){
// echo "New User added";
// } else {
// echo "Error: ".$query."<br>".mysqli_error($connection);
// }
}
}
?>
<!DOCTYPE html>
<html lang="en">
<?php require('static/header.php'); ?>
<?php
$createUsernameError = "";
$createUserPasswordError = "";
?>
<div class="col s8 m8 l5 valign-wrapper">
<div class="container">
<form action="<?php echo htmlspecialchars( $_SERVER["PHP_SELF"] ); ?>" method="post">
<div class="row">
<div class="col s12">
<span><h4>Create your user account - create user.php</h4></span>
<div class="row form-font">
<div class="col s12">
<div class="input-field">
<a class="red-text"><?php echo $createUsernameError; ?></a>
<input placeholder="Enter your username" type="text" name="createUsername">
<label for="email">Username</label>
</div>
<div class="input-field">
<a class="red-text"><?php echo $createUserPasswordError; ?></a>
<input placeholder="Enter your password" type="password" name="createUserPassword">
<label for="password">Password</label>
</div>
<div class="row left-align">
<div class="col s2"></div>
<div class="col s8">
<button class="btn-flat waves-effect waves-custom" type="submit" name="createUserBtn"><i class="material-icons left">create</i>Create Account</button>
</div>
<div class="col s2"></div>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
<?php require('static/footer.php'); ?>
</html>
仔细查看您的代码和您使用的地方 - 例如 - $createUsernameError
变量。
如果出现错误,您可以使用以下行在其中设置一条消息:$createUsernameError = "Enter a username <br>";
。太棒了,正是你想要的。
但是,稍后在代码中,您 运行 $createUsernameError = "";
,它再次将其重置为空。这种情况 在所有情况下都会发生,无论是否发现错误 。它发生在您尝试 echo
那个变量到页面上之前。
所以基本上你是在设置值,然后在输出之前立即再次将其消隐。您需要确保它只在没有错误的情况下设置为空白。密码错误信息也是同样的问题。
一个简单的方法就是在您运行错误检查之前将值设置为空白。如果没有错误,它将保持空白,但它不会覆盖任何已设置的错误消息。
所以只需移动这些行:
$createUsernameError = "";
$createUserPasswordError = "";
到脚本的顶部。
P.S。在任何类型的实时环境中使用此代码之前,请注意评论中发布的安全警告并紧急修复您的代码以消除这些漏洞。即使您不打算真正使用此代码,您仍然应该解决这些问题,以便您学会以正确、安全、可靠的方式做事,并且不会养成坏习惯。如果您是从在线课程中复制此代码,我建议您寻找更好的课程。