【问题标题】:How do I pass data between pages in PHP?如何在 PHP 中的页面之间传递数据?
【发布时间】:2010-11-13 20:29:19
【问题描述】:

简而言之,“page1.php”我有一个由 HTML 表单组成的计算器,然后 PHP 代码汇总输入并显示总价格。在价格下方,它还显示一个指向“page2.php”的链接,其中包含一个 HTML 表单,他们可以在其中输入他们的联系信息。提交表单后,他们在定价计算器中的“page1.php”上所做的选择以及“page2.php”上的联系信息都会通过电子邮件发送给我,并且它们会被重定向到主页。

在提交给我的电子邮件中,我收到了来自“page2.php”的联系信息,但我没有收到来自“page1.php”的任何信息,因此变量没有正确传递。除了每个页面上的 PHP 之外,我还在“page2.php”上的 HTML 表单中使用隐藏值来回显在“page1.php”上的 HTML 表单中输入的数据。我知道我的一个问题是当我的表单是“发布”时,我有几个 $_GET 字段。

但是,当我将其更改为 $_POST 时,计算器不再工作。我试图将其与其他人建议的不同 sn-ps 代码一起使用。 “page1.php”上的表单有13个字段,分别命名为“一”-“十三”。 $total 显示 1-13 的值。

<?php
  $submit = $_GET['submit'];
  if($submit == "true")
  {
    $total = ($_POST['one'] + $_POST['two'] + $_POST['three'] + $_POST['four']  + 
    $_POST['five'] + $_POST['six'] + $_POST['seven'] + $_POST['eight']+ $_POST['nine'] + 
    $_POST['ten']+ $_POST['eleven'] + $_POST['twelve']+ $_POST['thirteen']); 
    echo  " Your Price is \$ " .number_format ($total, 2, '.', ','). "<BR>";
    echo ('">Get Your Project Started</a>');
  }
?>

第二种形式使用隐藏值来回显来自 page1.php 的信息,并具有另外三个字段,分别名为“name”、“email”和“details”。

<?php
  $to = "jessica@designs.com";
  $message = "Pages:\t$_POST[one]\n";
  $message .= "Pages:\t$_POST[two]\n";
  $message .= "Pages:\t$_POST[three]\n";
  $message .= "Ecommerce:\t$_POST[four]\n";
  $message .= "No Ecommerce:\t$_POST[five]\n";
  $message .= "CMS:\t$_POST[six]\n";
  $message .= "No CMS:\t$_POST[seven]\n";
  $message .= "Audio or Video:\t$_POST[eight]\n";
  $message .= "Flash Intro:\t$_POST[nine]\n";
  $message .= "Image Gallery:\t$_POST[ten]\n";
  $message .= "Graphic Design or Logo:\t$_POST[eleven]\n";
  $message .= "Copy:\t$_POST[twelve]\n";
  $message .= "Images:\t$_POST[thirteen]\n";
  $message .= "Price Total:\t$_POST[total]\n";
  $message .= "Name:\t$_POST[name]\n";
  $message .= "Email:\t$_POST[email]\n";
  $message .= "\n";
  $message .= "\n";
  $message .= "Details:\t$_POST[details]\n";
  mail($to, $subject, $message, $headers) ;
  }
?>

那么正确的 PHP 应该放在“page1.php”和“page2.php”上吗?抱歉,代码太乱了,如果有人能指出正确的方向,那就太好了。

【问题讨论】:

  • BB 标签在这里不起作用。用四个空格缩进你的代码以很好地格式化它。
  • 要添加 [code] 在每行之前使用 4 个空格,并且忘记 [code] ubb 标签。 SO 使用其他格式。这是你的第一篇文章,所以我不会给它打分,但现在你知道了;)
  • 你真的应该对你的输入做一些验证。

标签: php html forms variables


【解决方案1】:

PHP 是无状态的,除非您将内容保存在会话中(这不安全吗?)

您需要让 page2.php 从 page1.php 读取所有值并将它们存储在服务器端状态(会话)或客户端状态(cookie 或表单中的隐藏字段)

如果您想要其中任何一个安全或秘密,那么您也必须考虑所有这些。我解释的任何内容都不是秘密或安全的。

编辑: 这里是 page1.php 的示例,它将 page1.php 的值作为 get 参数发送到 page2.php。您也可以使用隐藏字段、cookie 或会话来执行此操作。

需要记住的重要一点是 page2.php 完全不知道 page1.php,并且无法像编程那样获取值。当您看到一个完整的网页时,每个页面都会开始和结束它的生命,因此您必须使用一些额外的技巧来保持价值。这些技巧是会话、cookie、表单帖子或获取。

<html>
<head>
<title>Page 1</title>
</head>
<body>
<?php
//set defaults assuming the worst
$total = 0;
$one =0;
$two=0;

//verify we have that value in $__POST
if (isset($_POST['submit']))
{
    $submit = $_POST['submit'];
    //If it is true, try some math
    if($submit == "sub-total")
        {
            if (isset($_POST['one']))
            {   
                $one = $_POST['one'];
                //Add checks to see if your values are numbers
                if ( ! is_numeric($one)) { $one = 0;}
            }

            if (isset($_POST['two']))
            {
                $two = $_POST['two'];
                if ( ! is_numeric($two)) { $two = 0;}
            }
            $total = $one + $two;
            echo " Your Price is \$ " .number_format ($total, 2, '.', ','). "<BR>";
        }
    if($submit == "submit" )
    {
        //go to page two, with the total from page1.php passed as a $__GET value
        header("Location: page2.php?total=".$total);
    }
}
?>
    <form method="post" action="page1.php?submit=true">
        <input type="text" name="one" id="one" value="<?=$one?>"/>
        <input type="text" name="two" id="two"  value="<?=$two?>"/>
        <input type="submit" name="submit" value="sub-total" />
        <input type="submit" name="submit" value="submit" />
    </form>
</body>
</html>

【讨论】:

    【解决方案2】:

    您可以尝试使用$_REQUEST 代替$_GET$_POST - 它适用于两者。此外,如果您将 &lt;input type='hidden' 放在第 2 页的表格中,而您的变量从第 1 页发布,它们应该会立即传递。

    【讨论】:

      【解决方案3】:

      您的 php 页面没有状态,因此您必须获取已发布的变量,并通过隐藏的输入字段发送它们。

      <input type="hidden".....
      

      你也可以使用会话,但是如果你问我的话,将它们与表单一起使用会有点笨拙。

      【讨论】:

        【解决方案4】:

        这取决于您的 HTML formmethod 属性如何将变量传递给您的 PHP 脚本。

        在这种情况下,听起来page1.php没有任何副作用,只是传递值,所以page1.php上的表单应该使用method=get,而page2.php的代码读取这些字段可以在$_GET找到他们。

        page2.php 上的提交按钮(大概)在服务器端确实有副作用,所以它应该使用method=post,你可以从服务器端的$_POST 读回来。

        另外,在填写完第一页后,看看page2.php的HTML源代码,看看值是否传递正确。

        【讨论】:

          【解决方案5】:

          答案有点晚,是的,最好的方法是使用type=hidden,正如其他人已经提到的那样。

          page1 将 _POST 发送到 page2,它会将所有内容“保存”在隐藏字段中,因此它可以将所有内容一起发送到最终(或另一个)页面。

          但更重要的是,进入更广泛的主题,正在考虑为什么要使用页面来划分表单!

          很抱歉在这里碰了这个话题,我只是想给我的 2 美分。

          不要分页表单

          我想说最好的办法是尽可能避免分页,这样做的唯一充分理由是如果您需要服务器验证向后兼容不接受 javascript 的浏览器。

          改用较新的资源

          布局和设计都可以使用 javascriptCSS 来实现,它们都是为此而生的。即使您让用户“按下一步”,也请使用 dhtml 并将所有内容放在 1 个文件中。需要服务器验证? ajax

          除非您使用 HTML 框架(您可能不应该这样做),否则加载整个页面是一种多余且不必要的服务器和客户端加载,在使用和编程时需要更多时间(以处理从一个地方到另一个地方)。

          它远不是保存正在执行的状态的最佳方式。诚然,这本身就是一个复杂的主题,但同样,这里最好使用 ajax。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-06
            • 2018-09-13
            • 2014-04-22
            • 2012-09-12
            • 2012-02-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多