对空表单元素的PHP测试不起作用

时间:2011-05-21 02:33:16

标签: php html

我的表单上有两个元素 - textarea和文件元素,用于文件上传。 我需要两个中的一个不为空,以便提交表单。 我是这样检查的:

<?php

$text = $_POST['text'];
$uploadedfile = $_FILES['uploadedfile'];    
if (isset($_POST['submit'])) {

        if((empty($_POST['text'])) && (empty($_FILES['uploadedfile']))) {
                $errors .= 'Please either enter your text or attach a file.<br/><br/>';
            }

        }
if (!$errors) { do some code...
              header("Location: http://mysite.com/mysite/submitted.html");
} 
else {
            echo '<div style="color: red; font-weight: bold; text-align: center"> The form was not sent. Some data is missing:<br />' . $errors . '<br/>
                    </div>';



        }
    }

?>

这是我的HTML:

    <form id="form" action="quot_form.php" method="post" enctype="multipart/form-data">
<p>
            <textarea rows="15" cols="50" name="text"><?php echo $text?></textarea>
        </p>
        <p class = "upload">        
            <input type="file" class="file" name="uploadedfile" />
        </p>
    </form>

知道为什么表单会被提交,即使两个字段都为空并且没有错误消息得到回应? 谢谢!

4 个答案:

答案 0 :(得分:3)

您使用逻辑AND(&amp;&amp;)代替逻辑OR(||)。

if((empty($_POST['text'])) || (empty($_FILES['uploadedfile']))) 

补充:看起来像文件数组有问题以这种方式检查。试试这个:

if((empty($_POST['text'])) && ($_FILES['uploadedfile']['size'] < 1)) 

答案 1 :(得分:1)

我会按如下方式重写它

$test = $_POST['test'];
if(empty($test, $uploadfile) {
//Do Something
    }

答案 2 :(得分:1)

底部的链接解释得更好,但它的笑话是:

empty()不能与字符串变量一起使用,因为如果你的变量被设置为字符串值'0',则empty()返回true的简单事实。如果字符串字符“0”是字符串变量的可能有效值 - 如果所有非零长度字符串都有效 - 则不能使用empty()。如果使用empty()来检查是否定义了字符串变量,则更加危险。另外值得一提的是,empty()为一个字符串值返回false,该字符串值只是一个空格(或者实际上是任意数量的空格)。

你不能简单地用一个条件来替换empty()的用法,该条件检查字符串变量是否等于null或者字符串长度为零。如果您的字符串变量恰好是未定义的,则empty()将静默返回true,而strlen($ mystring)和$ mystring == null将抛出PHP警告。如果您的变量可能未定义,则必须首先检查变量是否使用isset()定义。之后,您可以检查字符串是否为空。

答案可以在这里找到: http://www.zachstronaut.com/posts/2009/02/09/careful-with-php-empty.html

答案 3 :(得分:0)

你可以随时使用它作为测试者if (empty($_POST["text"]) ^ empty($_FILES['uploadedfile']))它使用xor,它测试是否设置为true,但不是两者,或两者都没有。