【问题标题】:PHP: How to pass variable from one page to another without a form or button, and without using session variable?PHP:如何在不使用表单或按钮且不使用会话变量的情况下将变量从一个页面传递到另一个页面?
【发布时间】:2014-08-04 02:25:27
【问题描述】:

这是这个问题的后续问题:How to access a variable from one PHP page to another, without a form, link, or button?

场景:-

如第一个问题所述,在名为question_edit_form.php 的文件中定义了一个form。此表单的action 设置为名为@9​​87654326@ 的文件。 所以表单中的所有数据显然都传递给了question.php。

但是我在表单中添加了一个select 元素,我希望将这个元素的数据传递给另一个名为renderer.php 的文件。这个文件负责在测验中向学生展示问题,以便他们写出答案。

第一个提议的解决方案 - 会话变量:-

所以第一个解决方案是使用会话变量。它在一个场景中有效,但在另一个“实用”场景中失败了。

问题是question_edit_form 被老师用来编辑一个问题——这是一个会话。一名学生在另一节课中回答该问题。 很明显,当 renderer.php 向用户显示问题时,会话变量对它不可用(因为它是另一个会话)。

第二个提议的解决方案 - Cookie:-

另一种解决方案是使用 cookie。但是reading up on cookies here tells me那个

cookie 是服务器嵌入在用户计算机上的一个小文件。每次同一台计算机通过浏览器请求页面时,它也会发送 cookie。

所以服务器会将变量放在用户的计算机上。但是学生将在同一会话中尝试许多问题,并且每个问题的变量值都会不同。

问题:-

那么cookies可以用在这个场景中吗?还是有另一种解决方案将变量传递给文件renderer.php?

【问题讨论】:

  • 把它放在URL里怎么样?
  • @zerkms 谢谢。是否可以提供给与question_edit_form.php 没有直接链接的renderer.php
  • 我不确定你在说什么。但是 URL 及其所有数据可供处理它的脚本使用。
  • 要扩展 URL,请使用 get 请求将您的信息从一个页面传递到另一个页面。请注意,它也是客户端重定向,这意味着用户可以修改请求。如果它很敏感,请使用会话
  • @zerkms 问题是表单的action 属性设置为一个名为question.php 的文件(它的URL 类似于localhost/moodle/question/question.php)。我要访问的文件是另一个文件(URL 为localhost/moodle/mod/quiz/attempt.php)。那么我可以将变量添加到尝试.php 文件的 URL 中吗?

标签: php session post cookies get


【解决方案1】:

可以使用 cookie 来满足此要求 - 可以为每个问题设置不同的 cookie 或将所有问题/答案存储为单个 cookie 的值。 不知道完整请求只是一个示例:如果测验是多项选择,其中要存储为答案的值只是数字或字母,则 cookie 值可以 只需从 1=a(对于问题 1,回答 a)、1=a&2=c 等开始。此外,可以解析 cookie 值以检查是否已经给出答案,以防万一 允许更改第一个答案,并相应地调整 cookie 值。 为简单起见,仅以每个问题只允许回答一次的情况为例。

首先,检查 cookie 是否已经存在。例如。使用名为 _quizCookie 的 cookie:

function checkQuizCookie() {
  var i,x,y,ARRcookies = document.cookie.split(";");
  for (i = 0; i < ARRcookies.length; i++) {
    x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
    y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
    x = x.replace(/^\s+|\s+$/g, "");
    if (x.indexOf("_quizCookie") != -1) {
        return false;
    }
   }
 }

页面加载时调用prepareQuizCookie()

function prepareQuizCookie() {
  if (false != checkQuizCookie()) {
     setQuizCookie();
  }
}

所以如果 _quizCookie 已经存在,它不会被覆盖;如果它不存在,它将被创建:

function setQuizCookie() {
  var now = new Date(),
      expireDate = new Date();
  expireDate.setTime(now.getTime() + (10 * 365 * 24 * 60 * 60 * 1000));
  document.cookie = "_quizCookie=start" + "; expires=" + expireDate.toUTCString() + "; path=/";
}

当问题 1 的答案为 a 时,可以调用函数来调整 cookie 的值 它检索实际的 cookie 值并为当前答案附加一个键/值对,用“&”分隔:

function changeQuizCookie(answer) {
  var now = new Date(),
      expireDate = new Date(),
      quizCookieVal = getQuizCookieValue(),
      newQuizCookieVal = quizCookieVal + "&" + answer;
  expireDate.setTime(now.getTime() + (10 * 365 * 24 * 60 * 60 * 1000));
  document.cookie = "_quizCookie=" + newQuizCookieVal + "; expires=" +   expireDate.toUTCString() + "; path=/";
}

因此,对于问题 1 的答案为 a 的示例,请致电 changeQuizCookie("1=a")。然后 cookie 值将 是start&amp;1=a。我只是将“开始”设置为不必要的初始 cookie 值。我没有检查建议的方法是否有效(但是 认为应该),但是当它最初设置时,可以只设置没有任何值的cookie,当它是值时 已更改,以检查 quizCookieVal 是否为空;如果是空的,newQuizCookieVal = answer;如果不, newQuizCookieVal = quizCookieVal + "&amp;" + answer.

并获取当前cookie值:

function getQuizCookieValue() {
  var name = "_quizCookie=",
      ca = document.cookie.split(';');
  for(var i=0; i<ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1);
    if (c.indexOf(name) != -1) {
        return c.substring(name.length, c.length);
    }
  }
  return "";
}

这只是作为如何使用 cookie 处理所需功能的示例,正​​如您询问是否可以使用 cookie 时提到变量 每个问题都会改变。所以这不应该是一个问题,只需检索当前的 cookie 值并通过保留以前的值来覆盖它 cookie 值并仅附加当前问题/答案键/值。其他方法是为每个问题/答案设置一个 cookie,但只是 想举一个单cookie方法的例子。

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多