我有两个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的值为&#34;不正确。&#34;
但为什么它会像这样工作?用户尚未按下提交按钮。我想给一个&#34;不正确&#34;当&#34;评估&#34;时,此变量的值按下提交按钮。
编辑:
我怀疑这可能是a.php的POST(提交)弄乱了我的b.php。我想要的是显示带有提交按钮的文本表单。当按下提交按钮($ POST)并且textarea为空时,我想向用户显示错误消息(不正确)并再次显示该表单。
答案 0 :(得分:2)
将empty($_POST["something1"])
更改为empty($_POST["something1"]) && $_POST["evaluate"]
答案 1 :(得分:2)
您可以使用strlen()
检查变量是否已设置。
这将计算输入的位数,当textarea为空时将返回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。
答案 2 :(得分:2)
1)CSRF:来自其他网站的人可以选择向表单处理程序提交表单,因此您应该添加 C ross S ite R equest F orgery prevent value到表单中的隐藏字段,每次加载表单时都会更新,通常与$_SESSION
值配对。
Read more on this
使用这个独特的&#34;键&#34;如果此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
可能被最终用户滥用。
答案 3 :(得分:1)
更改代码中的以下代码段
if (empty($_POST["something1"])) {}
到下面的一个。
if (strlen($_POST['something1']) > 0) {}
答案 4 :(得分:0)
你应该绝对选择isset()
!即使empty()
,null
不会,isset()
也会返回true!
empty()
只检查给定变量是否有值。这可以是任何东西! Int
,Float
,String
,Object
以及NULL
- 无所谓。它将返回true
。
isset()
, true
将返回null
。
最好在此内容中选择isset()
;)
编辑: