【问题标题】:Trying to send data between PHP pages; Post/cURL not working and Sessions getting messy试图在 PHP 页面之间发送数据; Post/cURL 不起作用,会话变得混乱
【发布时间】:2012-04-19 12:07:52
【问题描述】:

我最近问了这个问题Posting data with curl - actually refreshing to the next page,但我很快意识到这个解决方案并不是很好......

所以我在几个地方的 PHP 页面之间传递数据。这是我目前的问题:

我依赖于 cookie,因此我会在每个页面的顶部检查是否启用了 cookie:

session_start();
if (!isset($_COOKIE['PHPSESSID'])) {
    if ($_GET['rd'] == '1') {
        header('Location: *redirect url*');
    } else {
        *refresh the page, setting 'rd' to '1'*
    }
}

但是,由于这是每个页面上的“标题”,因此它必须是通用的。例如,任何发送给它的帖子或获取数据(从另一个页面或表单)都应该发送到重定向页面。

获取很容易,因为我可以将它包含在 url 中,但是我在使用 Post 时遇到了问题。

我开始使用 cURL 将 Post 数据发送到下一页,但我意识到它实际上并没有转到该页面

$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'myvar=something');
curl_exec($ch);
curl_close($ch);$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'myvar=something');
curl_exec($ch);
curl_close($ch);

cURL 之后不会加载 $url;它返回它

所以有人建议我使用 Sessions,但我很快意识到这不是一个很好的解决方案;

  1. 重定向时,如果我将Post数据设置为Session变量(存储数据),那么每个使用Post数据的页面都需要检查数据是在Post还是Session中。
  2. 效率不高 - 我在两个页面之间发送数据,不一定是有关会话的信息。

关于数字 2,我设置了另一个会话变量来告诉下一页是否已将 Post 数据移动到 Session。但是,每次我都必须重新设置该变量,这只会让事情变得复杂和不整洁。

示例: 我有一个将表单数据发送到验证页面的注册页面。这两个都有检查cookie是否启用的标题。

发布数据被发送到验证页面,如果出现问题,我无法将数据发布回验证页面(告诉用户问题出在哪里),我必须设置一个会话变量注册错误。每次,我都必须取消设置注册错误变量。

目前我认为验证页面不需要cookie,但我不希望有任何漏洞,也不知道以后会添加什么。

回到问题

  1. 我需要检查每个页面是否启用了 cookie。
  2. 我不知道是否 我当前的应用程序是最有效的方式(重定向);它是 肯定会造成很多问题
  3. 如果有人能告诉我如何 在不重定向的情况下检查 cookie(并且不与 其他任何东西),这和 解决方案
  4. 我不想依赖 javascript 或隐藏表单;我想掌控体验
  5. 我需要在两个页面之间发送数据 有效率的。不喜欢某些应用程序的会话,因为我 需要设置和取消设置 每个页面的变量。

我知道这是一项艰巨的任务,但如果有人能提供帮助,将不胜感激!

【问题讨论】:

  • 更准确地说,您想要做什么?为什么“在两页之间发送数据”?用户将在页面之间移动,您需要每个页面都知道另一个页面上的数据吗?这只是为了完成表单,还是您正在做一些更复杂的事情?
  • 假设我有两个页面:一个表单和另一个验证。表单通过一个表单发送发布数据,另一个则检查错误。如果有错误,则必须将错误发送回表单以显示它们。我可以使用会话,但数据仅用于 1 页,每次我在两页之间发送数据时,我都必须设置和取消设置会话变量。在此示例中,如果我将两个页面放在一起,它会起作用,但还有其他情况;最重要的是检查 cookie 并保留帖子数据 - 阅读我在底部的帖子,它解释了我的主要问题

标签: php session post curl


【解决方案1】:

如果所有中间页面都在验证表单数据,则将其废弃;只需在同一个 PHP 脚本中执行此操作。最简单的情况是:

<?php
    $yourkey = 'goeshere';
    if (!isset($_COOKIE[$yourkey])) {
        setcookie($yourkey, $value, $expires);
    }

    if (isset($_POST['submit'])) {
        $errors = array();
        // do validation here
        // iterate over your fields and add any errors to $errors array
        if (empty($errors)) {
            // redirect if there are no errors, if you really need to
            header('Location: success.php');
            exit;
        }
    }
?>
<html>
  <body>
    <form method="post" action="">
      <label for="name">Your name:</label>
      <input type="text" name="name" value="<?php echo isset($_POST['name']) ? $_POST['name'] : ''; ?>" id="name" />
      <input type="submit" name="submit" value="Submit" />
    </form>
  </body>
</html>

在您的 HTML 页面中有一个 XSS 漏洞echoing POST 数据,但我将把它留给您来确保安全。

【讨论】:

  • 这实际上并不能解决原来的问题,但我会接受你的建议。我的主要问题是,有代码检查是否设置了 cookie(即启用了 cookie)。如果没有,它会尝试设置一个并重定向到同一页面。我的意思是,从技术上讲,用户第一次访问我的网站时,它应该在一些通用页面上,例如“registration.php”,但我正在尝试使其可扩展,以便如果由于某种原因在验证之间丢失了 cookie页面,在重定向期间仍将保留帖子数据。我知道这很复杂,我不认为我是在解释它的最佳方式......
  • @Raeki 您确实意识到您可以在同一页面上执行此操作;你不需要重定向?您可以检查 cookie 并将其设置在 HTML 上方的 PHP 块中,就像我在示例中所做的那样。只需将 cookie 代码放在表单验证上方即可。
  • 我花了一周的时间; cookie 直到后续页面才会显示。所以那个代码。如果 cookie 被禁用,那么该代码每次都会尝试设置 cookie。它让我困惑了很长时间,我做了很多测试。只有下一页可以检查cookie是否设置成功
  • @Raeki 错了。只需在脚本中设置一个变量。只需在设置后检查 cookie:如果存在,您可以假设用户的浏览器支持 cookie;如果不是,那么它不会。你真的不需要重定向到其他脚本;那是非常低效的。
【解决方案2】:

我不确定这是否有帮助,但也许您可以尝试限制页面数量?我通常做的是将表单和验证放在一个 php 页面上。您检查用户是否在开始时发送了某些内容,如果发送了,请检查并显示任何错误。如果没有,请出示表格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2012-02-10
    • 2015-04-15
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多