2

我有一个发布到页面的表单,并且从POST数据中获取值时遇到了一个奇怪的问题。如您所见,我可以在运行条件之前检查是否image_id,votefb_id_form都已设置。

javascript 警报运行,所以我知道三个变量已设置。但我得到的是令人困惑的。我得到第一个显示“工作”的警报窗口。然后我得到两个空白警报窗口。当我试图提醒他们时,如何fb_id_form“设置”(通过条件)但没有价值?

if(isset($_POST['image_id']) && isset($_POST['vote']) && isset($_POST['fb_id_form'])){
    $image_id = $mysqli->real_escape_string($_POST['image_id']);
    $vote = $mysqli->real_escape_string($_POST['vote']);
    $fb_id_form = $mysqli->real_escape_string($_POST['fb_id_form']);
    echo "<script>alert('worked');</script>";
    echo "<script>alert('".$fb_id_form."');</script>";
    echo "<script>alert('".$_POST['fb_id_form']."');</script>";
}

这是表单数据(在同一页面上):

echo "<form method=\"post\" action=\"\">
<input type=\"hidden\" name=\"image_id\" value=\"".$id."\" />
<input type=\"hidden\" name=\"vote\" value=\"1\" />
<input type=\"hidden\" name=\"fb_id_form\" value\"".$fb_id."\" />
<input type=\"submit\" name=\"submitvote\" value=\"Vote\" />
</form>";

这就是问题所在。我已经在表格之前回显了 $fb_id RIGHT 的警报,它给了我正确的值。当我提交它时,我认为该值会丢失。

4

5 回答 5

3

因为isset如果$_POST['fb_id_form']包含一个空字符串,它仍然是真的。你想用empty()

isset vs 空链接

empty 与 isset 有很大不同。首先,最明显的是它的工作方式与isset相反,但它的作用远不止于此。Empty 将为所有内容返回 true isset 将为 PLUS 返回 false 它也将为空字符串、空数组、字符串“0”、数字 0 或 false 返回 true。

于 2012-11-30T17:11:33.587 回答
2

变量在分配时被设置(isset()为真)而不是 NULL。这意味着包含空字符串 ("") 的变量实际上是已设置的请参阅文档

要检查变量是否为空,请使用empty()或检查$mystr === ""

于 2012-11-30T17:09:41.320 回答
1

您会得到这些结果,因为isset()即使变量中存储的唯一内容是空字符串,也会返回 true。您的结果可能没有被存储。这可能是由于您的表单可能具有恢复页面的操作,该操作清空了字段,使您的变量带有空字符串?我们必须查看您的 html 代码才能给出更全面的答案...

于 2012-11-30T17:16:25.840 回答
1

从手册

isset — 确定变量是否已设置且不为 NULL

没有它说如果变量是"",等它将返回 false 的地方。在您的示例中0,通过发布此数据false很容易绕过您的健全性检查:

image_id=&vote=&fb_id_form=

您需要额外的数据验证,您可以为此使用PHP 过滤器函数。检查是否$_POST包含三个参数的示例代码,它们是整数:

$params = filter_input_array(INPUT_POST, array(
'image_id'   => array('filter' => FILTER_VALIDATE_INT, 'options' => array('default' => NULL)),
'vote'       => array('filter' => FILTER_VALIDATE_INT, 'options' => array('default' => NULL)),
'fb_id_form' => array('filter' => FILTER_VALIDATE_INT, 'options' => array('default' => NULL))
));

因此,例如有人将此数据发布到您的页面:

image_id=&vote=hello+world&fb_id_form=12345

然后上面的代码会返回:

array(3) {
  ["image_id"]=>
  NULL
  ["vote"]=>
  NULL
  ["fb_id_form"]=>
  int(12345)
}

PS:mysqli->real_escape_string不验证您的数据。

于 2012-11-30T17:19:01.543 回答
0

我认为这与分离前后的单引号有关。

echo "<script>alert(".$fb_id_form.");</script>";

echo "<script>alert(".$_POST['fb_id_form'].");</script>";

于 2012-11-30T17:15:48.157 回答