我在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,问题已解决。