我有两个PHP脚本,第二个脚本似乎没有正确处理$_POST
。
a.php
重要部分:
echo "<form action='b.php' method='post'>";
echo "<input type='submit' name='add' value='Add new items'>";
echo "</form>";
b.php
重要部件:
$error_variable1="";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["something1"])) {
$error_variable1="not correct";
}
}
echo '<form action="'.htmlspecialchars($_SERVER["PHP_SELF"]).'" method="post">';
echo '<textarea name="something1" rows="1" cols="10"></textarea>';
echo $error_variable1;
echo '<input type="submit" name="evaluate" value="Checking inputs">';
echo " </form>";
不幸的是,即使在b.php的第一次启动时,它也会将$error_variable1的值显示为"不正确"
但为什么它会这样工作呢?用户尚未按下提交按钮。当按下"评估"提交按钮时,我想给这个变量一个"不正确"的值。
编辑:
我怀疑来自a.php的POST(提交)可能会扰乱我的b.php。我想要的是显示一个带有提交按钮的文本表单。当按下提交按钮($POST)并且文本区域为空时,我想向用户显示一条错误消息(不正确)并再次显示表单。
将empty($_POST["something1"])
更改为empty($_POST["something1"]) && $_POST["evaluate"]
1)CSRF:其他网站的用户可以选择向您的表单处理程序提交表单,因此您应该在表单中的隐藏字段中添加CrossSiteRequestF狂欢预防值,该值在每次加载表单时都会更新,通常与$_SESSION
值配对。阅读更多关于此的信息。
使用这个唯一的"密钥"值,您可以在页面顶部简单地检查这个POST
ed密钥值是否是正确的值,这将为您确认表单已经发布。
所以
A.php:
session_start();
$_SESSION['obscure'] = some obscurevalue generated anew every page load.
echo "<form action='b.php' method='post'>";
echo "<input type='submit' name='add' value='Add new items'>";
echo "<input tye='hidden' name='key' value='".$_SESSION['obscure']."'>
echo "</form>";
然后发送到b.php:
session_start();
if($_POST['key'] == $_SESSION['obscure'] && !empty($_POST['key'])){
//This code will only run if the form has been correctly submitted.
}
这样做的结果是,您可以更确信您的代码是按预期顺序运行的,并且您可以使用POSTED key
值来确认表单提交。
顺便说一句,使用PHP_SELF
进行表单重定向也是不好的做法。使用静态引用或使用不可编辑的值,因为PHP_SELF
可能会被最终用户滥用。
您可以使用strlen()
来检查是否设置了变量。
这将计算输入的位数,并在文本区域为空时返回false
,因为字符串长度将为0
。
if (!strlen(trim($_POST['something1']))) {
$error_variable1="not correct";
}
或者,检查是否单击了提交按钮:
if (isset($_POST['evaluate'])) {
if (empty($_POST["something1"])) {
$error_variable1="not correct";
}
}
关于isset()
的更多信息:http://php.net/manual/en/function.isset.php.
更改代码中的以下代码段
if (empty($_POST["something1"])) {}
到下面的一个。
if (strlen($_POST['something1']) > 0) {}
您应该明确选择isset()
!而empty()
即使其null
也将返回true,而isset()
则不会!
empty()
只是检查给定变量是否有值。这可以是任何东西!Int
、Float
、String
、Object
以及NULL
——这无关紧要。它将返回true
。
如果变量存在并且不是null
,则isset()
将返回true
。
在此内容中最好选择isset()
;)
编辑:
请参见此处:http://php.net/manual/en/function.empty.php
在这里:http://php.net/manual/en/function.isset.php