if(isset($_POST['submitRegister'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$email = $_POST['email'];
if(!preg_match('#^[a-zA-Z0-9_-]+$#', $username))
$error1 = 'Username can only contain: A-Z a-z 0-9 _ - ';
if(!isset($username) || empty($username))
$error1 = 'Please enter your Username';
if(!preg_match("#[0-9]+#", $password))
$error2 = 'Password must include at least one number';
if(!isset($password) || empty($password))
$error2 = 'Please enter your Password';
if($password != $password2)
$error3 = 'Passwords do not match';
if(!isset($password2) || empty($password2))
$error3 = 'Please confirm your Password';
if(!preg_match("#^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}+$#", $email))
$error4 = 'That e-mail does not appear to be valid';
if(!isset($email) || empty($email))
$error4 = 'Please enter your E-mail address';
if(!isset($_POST["terms"]))
$error5 = 'You must accept the Terms and Conditions';
else {
require_once 'server.php';
require_once 'dbconn.php';
}
}
我在让它正常工作方面遇到了一些麻烦。 如你所见,我有多个if条件。事实上还有一些,但我编辑它以使帖子更短。我经历了很多其他的事情,并且认为我理解它,但显然不是。
我的问题是,只要我不勾选术语复选框(最后一个if语句),一切正常。但是,如果勾选复选框,它将尝试连接到数据库,无论前面的字段是空还是没有正确填写。
在我的上一篇文章中,我把错误的顺序放在了错误的顺序(回到前面),我先将if语句放在首位,用户名放在最后。我认为这解决了它,但只要我输入用户名就可以连接,无论其他字段是否为空。所以在这种情况下不起作用。 希望有人可以提供帮助,非常感谢。
答案 0 :(得分:1)
抱歉,我不太了解你的意图,但我可以告诉你,每次检查条款复选框时,下一个代码都是:
require_once 'server.php';
require_once 'dbconn.php';
将被执行。
如果您希望require_once语句仅在没有错误时执行,您可以这样做:
if (!$error1 && !$error2 && !$error3 && !$error4 && !$error5)
{
require_once 'server.php';
require_once 'dbconn.php';
}
我建议您在所有if语句中使用{}阻止。
答案 1 :(得分:0)
你不需要"否则"在这种情况下的最后一例。多个" if"这里的陈述可以匹配。最后一个("术语"一个)可以匹配,当且仅当它不匹配时," else"块被执行。你"否则" block是调用require_once的唯一部分。
如果删除其他内容,则应该开始工作。
答案 2 :(得分:0)
问题是else语句仅适用于最后一个if(是否检查条件)。
我建议你做一些事情:
if(isset($_POST['submitRegister'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$email = $_POST['email'];
$valid = false;
if(!preg_match('#^[a-zA-Z0-9_-]+$#', $username))
$error1 = 'Username can only contain: A-Z a-z 0-9 _ - ';
if(!isset($username) || empty($username))
$error1 = 'Please enter your Username';
if(!preg_match("#[0-9]+#", $password))
$error2 = 'Password must include at least one number';
if(!isset($password) || empty($password))
$error2 = 'Please enter your Password';
if($password != $password2)
$error3 = 'Passwords do not match';
if(!isset($password2) || empty($password2))
$error3 = 'Please confirm your Password';
if(!preg_match("#^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}+$#", $email))
$error4 = 'That e-mail does not appear to be valid';
if(!isset($email) || empty($email))
$error4 = 'Please enter your E-mail address';
if(!isset($_POST["terms"]))
$error5 = 'You must accept the Terms and Conditions';
$valid = !(isset($error1) || isset($error2) || ...); //The number of possible errors
if($valid)
{
require_once 'server.php';
require_once 'dbconn.php';
}
}
请注意,保存错误的另一种方法是将它们存储在数组中。
$errors = array();
if(/* Invalid username */)
$errors[] = 'Invalid username'; //Add new error to the list
/*
...
*/
$valid = count($errors) === 0; //Valid if there is no error
答案 3 :(得分:0)
是的,让我们退后一步,看看if语句是如何工作的。
伪代码中的:
if(statement){
code1
}
code2
现在,如果statement是true
,那么code1将执行,code2将执行。如果statement是false
,则code1将不会执行,并且code2将执行,因为它不会被if语句块包含。因此,如果我们有:
if(!isset($email) || empty($email))
$error4 = 'Please enter your E-mail address';
PHP的工作方式是,它允许你有一行而不需要大括号,但你可以假设它把它放在那里,这样看起来像这样:
if(!isset($email) || empty($email)){
$error4 = 'Please enter your E-mail address';
}
那么问题出现了。无论if语句的结果如何,所有代码仍然会执行。怎么办?
好吧,你可以做一个大的嵌套if语句
if(statement1){
if(statement2){
if(statement3){
...
}else{
error
}
}else{
error
}
}else{
error
}
但你可以看到这很快变得多么丑陋。
所以我们可以用多个条件做一个if语句,
if(statement1 and statement2 and statement3 and ...){
code
}else{
error
}
但是有很多陈述,就像你的陈述一样,也会很快变得难看。那又怎么样?使用elseif
! elseif
仅在前一个if语句未执行时执行。
if(!statement1){
error
}elseif(!statement2){
error
}elseif(!statement3){
error
}else{ //meaning no error was triggered
code
}
另一种解决方案:在大多数语言中,有一些功能try
和catch
,这些功能证明是有用的。手表:
try{
if(!statement1){
throw exception
}
if(!statement2){
throw exception
}
if(!statement3){
throw exception
}
code
}catch(exception){
throw error because <exception>
}
为什么这有用?如果抛出异常,try块中的代码将停止执行并立即转到catch块。这意味着你的所有代码都没有被执行(所以在你的情况下,你想要调用的那些错误实际上会被调用)。
那么,我的解决方案?将您的代码放入某些try - catch blocks
答案 4 :(得分:0)
if(!isset($_POST["terms"]))
$error5 = 'You must accept the Terms and Conditions';
else {
require_once 'server.php';
require_once 'dbconn.php';
}
if ... else
阻止成对工作,此前的if
语句都不会对else条件产生任何影响。从本质上讲,如果require_once
设置为,则会发生$_POST['terms']
次调用 - 无论其他任何内容。
我认为你想要的更像是:
if(isset($_POST['submitRegister'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];
$email = $_POST['email'];
//define errors, I'm going to put them into an array
// - it makes it easier to evaluate at the end
$aErrors = array();
if(!preg_match('#^[a-zA-Z0-9_-]+$#', $username)) {
$aErrors['error_1'] = 'Username can only contain: A-Z a-z 0-9 _ - ';
}
elseif(!isset($username) || empty($username)) {
$aErrors['error_1'] = 'Please enter your Username';
}
if(!preg_match("#[0-9]+#", $password)) {
$aErrors['error_2'] = 'Password must include at least one number';
}
elseif(!isset($password) || empty($password)) {
$aErrors['error_2'] = 'Please enter your Password';
}
if($password != $password2) {
$aErrors['error_3'] = 'Passwords do not match';
}
elseif(!isset($password2) || empty($password2)) {
$aErrors['error_3'] = 'Please confirm your Password';
}
if(!preg_match("#^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}+$#", $email)) {
$aErrors['error_4'] = 'That e-mail does not appear to be valid';
}
elseif(!isset($email) || empty($email)) {
$aErrors['error_4'] = 'Please enter your E-mail address';
}
if(!isset($_POST["terms"])) {
$aErrors['error_5'] = 'You must accept the Terms and Conditions';
}
//if there are no errors
if(!$aErrors) {
require_once 'server.php';
require_once 'dbconn.php';
}
}