我有一个基本的注册表单,当检查字段是否未设置(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))
仅此而已,一个简单的错误运营商选择。
顺便说一句,我的编辑不是基于给出的其他答案。当它发布时,我实际上正忙于测试它。
他们的解释写得很好/解释得很好,但是他们太努力了。
在代码中将&&
更改为||
就可以了。