为什么$name字段永远不会!,即使为空


Why is $name field never !, even when empty?

我有一个基本的注册表单,当检查字段是否未设置(if(!$name))时,它总是转到"else",即使该字段为空。有谁知道为什么?(当我尝试反向检查它时(if($name)),它确实显示了错误行。*var_dump($name) - 始终返回字符串,从不返回 false。我猜这是问题的一部分?...

多谢!!

<?php
$error = '';
if(isset($_POST['submit'])){
$name = trim(filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING));
  if( !$name && preg_match("/^(['w]){2,50}$/", $name)){ 
    $error = ' * Please enter a valid name';
}

?>

 <form action="" method="post">
            <label for="name">Name:</label><br>
            <input type="text" name="name">   <br><br>
<input type="submit" name="submit" value="Sign up">
            <span class="error"><?= $error ?></span>
</form>

好吧,你弄错了IF语句。您正在检查$name是否为 false(仅当您发送空字符串时才会如此),并且它的长度是否在 2-50 之间。

考虑两种状态:

<?php
$name = 'Login';
$a = !$name; // FALSE! You're variable is OK, but you neg it
$b = preg_match("/^(['w]){2,50}$/", $name); // TRUE! Between 2-50 letters
<?php
if($a && $b) { 
    die("Won't be visible, because $a and $b are not the same");
}

第二:

$name = '';
$a = !$name; // TRUE! You're variable is empty, but you neg it
$b = preg_match("/^(['w]){2,50}$/", $name); // FALSE! has 0 letters
if($a && $b) { 
    die("Won't be visible, because $a and $b are not the same");
}

所以,你应该使用OR而不是AND或者忘记第一个语句(第二个是检查同样的事情!

<?php
if(!preg_match("/^(['w]){2,50}$/", $name)){ 
    $error = ' * Please enter a valid name';
}

您收到未定义的变量通知是因为您正在尝试回显表单中尚未设置/不为空的内容,并且您的 PHP/HTML 表单用于同一文件。

旁注:<?=是"echo"的短标签语法。

所以改变:

<?= $error ?>

to 和带有条件语句:

<?php if(!empty($error)) { echo $error; } ?>

或:

<?php if(isset($error)) { echo $error; } ?>

或使用三元运算符:

  • http://php.net/manual/en/language.operators.comparison.php

或者在我上面的建议中添加else

另外,您的PHP中还有一个缺少大括号(至少,对于您发布的内容),仅此一项就应该给您带来意外的文件结尾错误。

编辑:

它失败的原因是您使用的运算符,&& (AND)。使用 || (OR) 检查其中一个是否未通过条件,而不是两个。您正在检查是否没有名称以及是否有足够的有效字符。

if( !$name || preg_match("/^(['w]){2,50}$/", $name))

仅此而已,一个简单的错误运营商选择。

顺便说一句,我的编辑不是基于给出的其他答案。当它发布时,我实际上正忙于测试它。

他们的解释写得很好/解释得很好,但是他们太努力了。

在代码中将&&更改为||就可以了。