PHP 中的会话变量会发生变化


Session variables change in PHP

我在PHP编码中遇到了一个令人困惑的问题。 这是我在过去 2 年创建网站中第一次看到这样的事情。

假设我有以下两页:

1)指数.php2)检查.php

现在在index.php中,我有以下代码:

session_start();
// 5 digit number for my captcha system
$_SESSION['my_code'] = rand(10000, 99999);

现在这是check.php中的代码:

session_start();
echo $_SESSION['my_code'];

有时check.php页面中$_SESSION['my_code']的值与index.php页面中的值不同。我可以每 4 或 5 次说一次满分10次。

如果我在index.php中为我的会话变量分配一个常量值,我再也看不到这个问题了。

第 1 页 (sessions_a.php)

首先,从随机生成的数字中为会话数组分配一个变量。

<?php 
session_start();
// 5 digit number for my captcha system
$_SESSION['my_code'] = rand(10000, 99999);
$var = $_SESSION['my_code'];
echo $var; // echo'd example 67859
?>
<a href="sessions_b.php">Sessions B number</a>

然后在第 2 页 (sessions_b.php) - 检查它是否已设置并执行相同的操作。它将回显第 1 页中的相同数字。

<?php 
session_start();
if (isset($_SESSION['my_code'])) {
    $var = $_SESSION['my_code'];
}
echo $var; // will have echo'd from example 67859

这已经成功测试,可以将第一页上生成的相同数字回显到第二页 20 次。


您还可以在第 2 页中添加session_destroy()以在回显会话后销毁该会话。

这将回显第 1 页中的数字,但如果之后重新加载第 2 页,则不会回显它。
例如:有人在数字被回显后从第 1 页进入后重新加载第 2 页。

<?php 
session_start();
if (isset($_SESSION['my_code'])) {
 session_destroy();
   echo $_SESSION['my_code']; // will only echo once, not on reloading that page
}
else{
   echo "Session's timed out.";
}
  • 它也可以作为"一次性使用",但是你需要使用更广泛的数字数组才能使其唯一,并添加一个UNIX时间戳microtime(),以及uniqid(),以确保你不会得到任何类型的重复。

引用:

  • http://php.net/manual/en/function.microtime.php
  • http://php.net/manual/en/function.time.php
  • http://php.net/manual/en/function.uniqid.php

每当呈现索引.php时,您都会更改会话的值

 $_SESSION['my_code'] = rand(10000, 99999);

在常量的情况下,您将限制该值。这就是您查看不同值的原因。

您可以在索引上分配一个特定的值,如果会话已经设置,请不要再次设置它......使用 PHP 的 ISSET 函数。

每次

访问index.php时,您都会$_SESSION['my_code']新的东西。

你可以做的是:

if (!isset($_SESSION['my_code'])) {
    $_SESSION['my_code'] = rand(10000, 99999);
}
然后,如果未设置,

它将是一个随机数,如果已设置,则不会重新选择数字。

我花了很多时间在这个问题上,但是我找到了解决方案。问题是没有有效 URL 的图片。我为图像分配了正确的 URL,问题已解决。