【问题标题】:POST isset but not echo'ing outPOST isset 但不回显
【发布时间】:2012-11-18 22:28:55
【问题描述】:

我有一个发布到页面的表单,但在从POST 数据中获取值时遇到了一个奇怪的问题。如您所见,我可以在运行条件之前检查image_idvotefb_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 的警报,它给了我正确的值。当我提交它时,我认为该值会丢失。

【问题讨论】:

  • 您是否尝试过将 $_POST['fb_id_form'] 放入警报中?或者只是自己回显 $_POST['fb_id_form']?
  • 你真的连接到数据库了吗?如果不是,mysqli-&gt;real_escape_string() 将返回一个空字符串。
  • 我已连接数据库,我将添加更多代码...
  • 我刚刚添加了更多代码。我已连接到数据库并且它工作正常,因为我可以在提交表单之前从数据库中回显值。提交后它会在某处丢失...
  • 您也可以使用 isset(var1,var2,var3)isset(var1) &amp;&amp; isset(var2) 进行对比,仅供参考

标签: php javascript forms post if-statement


【解决方案1】:

变量在被赋值时被设置(isset() 为真)而不是 NULL。这意味着包含空字符串 ("") 的变量实际上是 的。见documentation

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

【讨论】:

    【解决方案2】:

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

    isset vs empty link

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

    【讨论】:

      【解决方案3】:

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

      echo "&lt;script&gt;alert(".$fb_id_form.");&lt;/script&gt;";

      echo "&lt;script&gt;alert(".$_POST['fb_id_form'].");&lt;/script&gt;";

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          From the manual:

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

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

          image_id=&vote=&fb_id_form=
          

          您需要额外的数据验证,您可以为此使用PHP filter functions。检查$_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-&gt;real_escape_string 不会验证您的数据。

          【讨论】:

          • 所以使用 GET 值而不是 POST 值?我理解正确吗?
          • 不,我从来没有这么说过。不要与我使用的代码之类的“查询字符串”混淆。 POSTed 到服务器的数据看起来与查询字符串完全一样。
          • 好的,这是指有人向我的页面发布数据?我想我对为什么 fb_id_form 没有返回值但 image_id 和 vote 更感兴趣。我理解正确吗?
          • 这可能只是因为传递了一个空字符串作为 fb_id_form 的值。 (i) 空字符串与 NULL 不同/未设置 (ii) $a = ""; var_dump(isset($a)) 产生 true
          • 就像我说的那样,我在表单之前回显了 $fb_id 的警报(这是表单上 fb_id_form 的值),它有一个整数值。这就是让我困惑的地方。
          猜你喜欢
          • 1970-01-01
          • 2013-05-11
          • 1970-01-01
          • 2014-05-24
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 2014-01-24
          相关资源
          最近更新 更多