注册表窗体上的PHP if语句失败

注册表窗体上的PHP if语句失败,php,forms,if-statement,Php,Forms,If Statement,我有一段代码: if(isset($_POST['register_form'])) { if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['lastname']) && isset($_POST['email'])) { Register(); } else {

我有一段代码:

if(isset($_POST['register_form'])) {
    if(isset($_POST['username']) &&
       isset($_POST['password']) &&
       isset($_POST['lastname']) &&
       isset($_POST['email'])) {
         Register();
       }
    else {
      echo 'It seems like some information is missing. Please fill in the whole form.';
    }
  }
这适用于以下表格:

  <form action="" method="post">
    <fieldset>
      <legend>Register Form</legend>
      <input type="text" name="username" maxlenght="32" placeholder="Username"/> <br />
      <input type="password" name="password" placeholder="Password" /> <br />
      <input type="lastname" name="lastname" placeholder="Last name" /> <br />
      <input type="email" name="email" placeholder="Email" maxlenght="1024" /> <br />
      <input type="submit" value="Register" name="register_form" />
    </fieldset>
  </form>

登记表




我知道这是错误的。因为if语句只检查是否存在“Username”、“Password”等表单,而不检查它是否为空。 但我不知道如何检查它是否填写不正确。如果有人能帮我,那就太好了

提前感谢。

您可以尝试:

$error = 0;    
(isset($_POST['username']) && $_POST['username'] != "") ? $username = $_POST['username'] : $error++;

if($error > 0) echo "error";
这将检查其集合是否为==“”。否则它将返回一个错误标志,您可以稍后检查


这显然需要编辑以适应您的情况

isset()
在这种情况下将始终返回true。如果要检查这些表单值是否为空,请使用
empty()

您可以使用javascript进行验证。对于服务器端验证,您可以编写如下内容:

function validate($value){
     if(isset($value) && !empty($value)){
        return true;
     }else{
        return false;
     }
}


if(validate($_POST['username']) &&
       validate($_POST['password']) &&
       validate($_POST['lastname']) &&
       validate($_POST['email'])) {
         Register();
    }
    else {
      echo 'It seems like some information is missing. Please fill in the whole form.';
  }

我知道这很麻烦,但更好的做法是不仅检查它是否已设置,而且确保未传递null。您应该根据问题所在创建错误列表,以便用户更好地理解错误所在

$errors = array( 'error' => true,
                 'username' => false,
                 'password' => false,
                 'lastname' => false,
                 'email' => false);

if(isset($_POST['register_form'])) {
    if(isset($_POST['username']) && $_POST['username'] != ''){
        $errors['username'] = true;
    }else{
        $errors['username'] = 'Please set a username';
    }
    if(isset($_POST['password']) && $_POST['password'] != ''){
        $errors['password'] = true;
    }else{
        $errors['password'] = 'Please set a password';
    }
    if(isset($_POST['lastname']) && $_POST['lastname'] != ''){
        $errors['lastname'] = true;
    }else{
        $errors['lastname'] = 'Please set a lastname';
    }
    if(isset($_POST['email']) && $_POST['email'] != ''){
        $errors['email'] = true;
    }else{
        $errors['email'] = 'Please set an email';
    }
}

if($errors === true){
    return $errors;
}else{
    $errors['error'] = false;
    return $errors;
}

return false;

这样,在返回时,您可以使用JS根据php响应打印错误,并使用$errors['error']点作为JS测试,查看它是否需要打印任何错误,如果它为false,则不要这样做。

我希望有用于此类检查的函数。对于这种特殊情况,我将使用我的函数进行数组键检查:

function check_key($key, $array) {
    if (isset($array[$key]) && (! empty($array[$key])))
        return true;
    return false;
}
你可以这样使用它:

if(check_key('register_form', $_POST)
    if(check_key('username', $_POST) && check_key('password', $_POST) 
    && check_key('lastname', $_POST) && check_key('email', $_POST) )
        Register();
else
  echo 'It seems like some information is missing. Please fill in the whole form.';

首先,你必须确定什么是有效的,然后才能检查它。如果您只想检查空值,请查看类似或可能的内容。
empty()
strlen()==0
=='
任何这些工作
trim()
输入也要确保它们不会放在一个或两个空格中。每天我们都会看到这种问题,每次都有数以十亿计的答案和我永远不会接受的实践……不,
isset
只会在设置了这些变量(例如,使用示例中的表单)的情况下返回
true
;如果通过其他方式调用该文件,则可能不会设置所有变量。这就是为什么我编写的
isset()
在这种情况下将始终返回true。当然,我假设他在使用问题中的代码。但是恶意攻击者可能不会使用所有这些变量,并且可能会出现可怕的错误。永远不要相信用户内容!当然,他可以再次检查
如果(isset($\u POST)和&&!empty($\u POST))
:)我刚刚在php.net上读到了这篇文章:如果变量不存在,则不会生成警告。这意味着empty()本质上是与!isset($var)| |$var==false。因此,检查
empty()
就足够了。还检查变量的可用性,因此无需检查它是否
isset
。在这里,我们有一个函数来执行isset检查和非空检查。我使用了这个函数,而不仅仅是设置检查。至于代码更改,我删除了不需要的曲线括号。