PHP:如何在没有表单或按钮的情况下将变量从一个页面传递到另一个页面,而不使用会话变量?

时间:2014-08-04 02:25:28

标签: php session post cookies get

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

之情况: -

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

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

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

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

事情是教师使用question_edit_form编辑一个问题 - 即一个会话。学生在另一个课程中回答这个问题。 很明显,当向用户显示问题时,会话变量不可用于renderer.php (因为它是另一个会话)。

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

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

  

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

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

问题: -

在此场景中可以使用cookies吗?或者是否有另一种解决方案将变量传递给文件renderer.php?

1 个答案:

答案 0 :(得分:0)

可以使用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=/";
}

当答案a回答问题1时,可以调用函数来调整cookie的值 检索实际的cookie值并为当前答案附加一个键/值对,用&#34;&amp;&#34;:

分隔
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&1=a。我只是设置&#34;开始&#34;作为初始cookie值,不应该是必要的。我还没有检查建议的方法是否有效(但是 认为它应该),但是当它初始设置时,它可能只设置没有任何价值的cookie,当它的价值时 已更改,以检查quizCookieVal是否为空;如果它是空的,newQuizCookieVal = answer;如果不, newQuizCookieVal = quizCookieVal + "&" + 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方法的例子。