我有一个php表单验证的问题,它工作正常,但它没有按预期工作,现在我有两种类型的PHP表单验证正在使用,一个是检查四个字段是否有数据在其中,另一个是检查电子邮件字段是否使用了正确的格式。
我遇到的问题是,如果我不做任何字段并点击提交,我希望"做这四个字段"弹出错误信息,但是电子邮件验证确实如此,如果我发电子邮件正常,则弹出所需的字段消息,这不是我想要的。
代码,我知道对于验证电子邮件,if语句中没有代码,我真的不知道该放什么
//Check if these fields have data in them
if(isset($_POST['email']) || isset($_POST['password']) || isset($_POST['confirm']) || isset($_POST['username']) ){
if(!$_POST['email'] || !$_POST['password'] || !$_POST['confirm'] || !$_POST['username'] ){
$error = "Error. Please write in all required fields with the * symbol";
}
// Validate email format
//https://www.w3schools.com/php/php_form_url_email.asp
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
} else {
$error = "Error. Please write in the correct E-Mail format";
}
EDIT 只是想澄清一下,我尝试将验证电子邮件代码移到检查代码上方,但是当用户输入表单以写入所有必填字段时,它会保持一个持续的错误消息
整个PHP
<?php
//Check if these fields have data in them
if(isset($_POST['email']) || isset($_POST['password']) || isset($_POST['confirm']) || isset($_POST['username']) ){
if(!$_POST['email'] || !$_POST['password'] || !$_POST['confirm'] || !$_POST['username'] ){
$error = "Error. Please write in all required fields with the * symbol";
}
// Validate email format
//https://www.w3schools.com/php/php_form_url_email.asp
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
} else {
$error = "Error. Please write in the correct E-Mail format";
}
if(!$error){
//No errors - let’s create the account
//Encrypt the password with a salt
$encryptedPass = password_hash($_POST['password'], PASSWORD_DEFAULT);
//Insert DB
$query = "INSERT INTO users (user_email, user_password, user_forename, user_lastname, user_name, user_gender, user_country, user_number) VALUES (:email, :password, :firstname, :lastname, :username, :gender, :country, :mobile)";
$result = $DBH->prepare($query);
$result->bindParam(':username', $_POST['username']);
$result->bindParam(':firstname', $_POST['firstname']);
$result->bindParam(':lastname', $_POST['lastname']);
$result->bindParam(':email', $_POST['email']);
$result->bindParam(':gender', $_POST['gender']);
$result->bindParam(':country', $_POST['country']);
$result->bindParam(':mobile', $_POST['mobile']);
$result->bindParam(':password', $encryptedPass);
if($result->execute()){
echo '<div class="alert alert-success" role="alert">Registration Successful!</div>';
echo "<script> window.location.assign('index.php?p=login'); </script>";
}
}
HTML
<div class="row">
<div class="main-login main-center">
<h1>Register</h1>
<form action="index.php?p=register" method="post">
<?php if($error){
echo '<div class="alert alert-danger" role="alert">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
'.$error.'
</div>';
} ?>
<p>
* Required Fields
</p>
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">* Username</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-user fa" aria-hidden="true"></i></span>
<input type="text" class="form-control" name="username" id="username" placeholder="Username"/>
</div>
</div>
</div>
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">* E-Mail Address</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
<input type="text" class="form-control" name="email" id="email" placeholder="example@hotmail.com"/>
</div>
</div>
</div>
<div class="form-group">
<label for="password" class="cols-sm-2 control-label">* Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
<input type="password" class="form-control" name="password" id="password" placeholder="Password"/>
</div>
</div>
</div>
<div class="form-group">
<label for="confirm" class="cols-sm-2 control-label">* Confirm Password</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
<input type="password" class="form-control" name="confirm" id="confirm" placeholder="Confirm Password"/>
</div>
</div>
</div>
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">First Name</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-user-circle fa" aria-hidden="true"></i></span>
<input type="text" class="form-control" name="firstname" id="firstname" placeholder="First Name"/>
</div>
</div>
</div>
<div class="form-group">
<label for="email" class="cols-sm-2 control-label">Last Name</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-user-circle fa" aria-hidden="true"></i></span>
<input type="text" class="form-control" name="lastname" id="lastname" placeholder="Last Name"/>
</div>
</div>
</div>
<div class="form-group">
Gender:
<div class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-outline-info active">
<!-- This button is checked by default for the user -->
<input type="radio" name="gender" id="gender_male" value="Male" autocomplete="off" checked=""> Male
</label>
<label class="btn btn-outline-info">
<input type="radio" name="gender" id="gender_female" value="Female" autocomplete="off"> Female
</label>
</div>
</div>
<div class="form-group">
<label for="address" class="cols-sm-2 control-label">Country</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-address-card" aria-hidden="true"></i></span>
<input type="text" class="form-control" id="placesSearch" placeholder="Country" name="country">
</div>
</div>
</div>
<div class="form-group">
<label for="mobile" class="cols-sm-2 control-label">Mobile Number</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-phone fa-lg" aria-hidden="true"></i></span>
<input type="mobile" class="form-control" name="mobile" id="mobile" placeholder="Mobile Number"/>
</div>
</div>
</div>
<div align="center" class="checkbox">
<label><input type="checkbox" value=""> Sign up for BakeryUp Newsletters!</label>
</div>
<div class="form-group ">
<button type="submit" class="btn btn-success btn-lg btn-block login-button">Join</button>
</div>
<div align="center">
By clicking 'Join' you are agreeing to our Terms and Conditions, Cookie Policy and Privacy Policy.
</div>
</form>
</div>
</div>
答案 0 :(得分:0)
尝试这种方法
$required = ['email','password','confirm','username'];
$countFieldFilled = 0;
foreach($_POST as $key => $value) {
if (!empty($value)) {
$countFieldFilled++;
}
}
$postedKeys = array_keys($_POST);
if (count($_POST) > 0) {
if ($countFieldFilled >= 4 && count(array_intersect($required,$postedKeys)) >= 4) {
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
//all ok !
} else {
$error = "Error. Please write in the correct E-Mail format";
}
} else {
echo 'not all required fields entered';
}
}
答案 1 :(得分:0)
<?php
if($_SERVER['REQUEST_METHOD']=='POST')
{
$fields = ['email', 'password', 'confirm', 'username'];
foreach($fields as $name)
$input[$name] = $_POST[$name] ?? '';
// All fields require a value.
foreach($input as $k => $v)
if($v == '')
$errors[$k] = 'Field required.';
// Check valid email.
if(
$input['email'] &&
filter_var($input['email'], FILTER_VALIDATE_EMAIL) === false
)
$errors['email'] = 'Email invalid.';
// Check passwords match.
if(
$input['password'] && $input['confirm']
&& $input['password'] != $input['confirm']
)
$errors['password'] = $errors['confirm'] = 'Passwords must match.';
if(!count($errors)) {
// All good.
} else {
var_dump($errors);
}
}