我开发了一个简单Wizard
的 ,操作就像使用 a tabs
,只是隐藏和显示div
步骤中的 。
<div id="step1" class="step">
</div>
<div id="step2" class="step">
</div>
<div id="step3" class="step">
</div>
内容按照step through显示,var step = <?php echo $step ?>;
如果变量javascript/jquery
有如下信息var step = 3;
,则显示id的内容step3
,即如下:
<div id="step3" class="step">
</div>
为了保存用户当前所处的步骤,从而避免倒退,我使用会话PHP
向用户显示我离开的步骤而不是从头开始,为此我有三个文件PHP
:
保存临时文件
<?php
session_start();
$step = isset($_GET['step']) ? $_GET['step'] : 1;
$_SESSION['datos_form'] = $_POST;
include 'php/libs/validate.php';
header('Content-Type: application/json');
$json = array(
'radio' => $radio,
'step' => $step
);
echo json_encode($json);
?>
向导.php
<?php
//session_start();
if (isset($_GET['p'])) {
session_destroy();
session_start();
}
include 'validate.php';
$r =array(
1 => 'Transferencia Bancaria',
2 => 'PayPal',
3 => 'Tarjeta de credito',
);
?>
验证.php
<?php
$datosForm = (isset($_SESSION['datos_form']) && is_array($_SESSION['datos_form'])) ? $_SESSION['datos_form'] :array();
$sPaso = isset($datosForm['__step__']) ? $datosForm['__step__'] : 1;
$step = isset($step) ? $step : $sPaso;
$radio = isset($datosForm['radio']) ? $datosForm['radio'] : 1;
$_SESSION['datos_form']['__step__'] = $step;
?>
我现在通过以下方式恢复保存的步骤:
<script type="text/javascript">
var step = <?php echo $step ?>;
var radio = <?php echo $radio ?>;
</script>
我提出的问题是在购买结束时,我试图删除步骤的会话$step
以在第 1 步重新启动它们,使用以下功能unset
:
if($payment === 'Completed'){
session_start();
unset($_SESSION['datos_form']);
unset($_SESSION['__step__']);
unset($_SESSION['formid']);
unset($_SESSION['sPaso']);
unset($_SESSION['Pending']);
unset($_SESSION['radio']);
unset($_SESSION['p']);
unset($_SESSION['step']);
unset($step);
unset($radio);
}
我已经做了一个var_dump($_SESSION);
和一个print_r($GLOBALS);
获得以下信息:
[_SESSION] => Array
(
[datos_form] => Array
(
[__step__] => 3
)
[4b228aaae2a6a7ce403bc4ecbc481de6] => ../libro.pdf
[cart] => Array
(
[0] => 11
)
[qty] => Array
(
[0] => 1
)
[formid] => 64da7c62c643f40684f573acffb144eba6bfaf63
[id_user] => 1
)
)
var_dump
array(6) { ["datos_form"]=> array(1) { ["__step__"]=> string(1) "3" }
当我转到第 1 步时,我得到以下更改:
[datos_form] => Array
(
[__step__] => 1
)
array(6) { ["datos_form"]=> array(1) { ["__step__"]=> string(1) "1" }
当我转到第 2 步时,我得到以下更改:
[datos_form] => Array
(
[__step__] => 2
)
array(6) { ["datos_form"]=> array(1) { ["__step__"]=> string(1) "2" }
我认为你的错误是你的应用程序的流程,因为正如 Byro 在另一个答案中评论的那样,简单地执行 unset 或 session_destroy 应该可以工作。这就是为什么我会告诉你如何根据你的文件和某些修改使其工作。
我以 wizzard.php 脚本为起点,因为它是负责包含 validate.php 脚本的脚本,并且由于后者是创建变量 $step 和 $radio 以在 html 中使用它们的脚本,这似乎很方便对我来说(这对我的测试来说仅此而已),离开:
这里要提一下,由于 validate.php 使用会话,所以我将 session_start() 留在开头,所以从这里我直接启动会话,无论发生什么。我不知道你用 isset($_GET['P']) 表示什么,显然你想在你有参数 P 时销毁会话,但除此之外,我现在看不到流程。另一个细节是 html 将其称为 index.phtml 并从向导中将其包含在最后,这样当您指示时如下所示:
那些 $step 和 $radio 变量已经使用初始值创建。
然后其他一切都是一样的,不像 pay1.php 是这样留下的:
同样,此时,我要做的第一件事是启动会话,在下面销毁它,从中添加或删除数据是另一回事,我启动它是因为要销毁它必须启动它,如文档中所示:
session_destroy()
考虑到它说的是“当前会话”,因此您必须登录才能知道要销毁哪个会话。
他们还评论说不应该使用 unset ,因为这是用于过时的 php 代码:
现在,如果您查看流程,首先要启动会话并创建必要的变量,然后每个步骤的应用程序都会启动会话并修改它的变量,保存它所在的步骤以及何时它进入最后一步,开始会话,如果付款已完成,则销毁会话。在我们使用会话的所有脚本中,首先是它的初始化。
我将带有执行指令的代码留在存储库中:
向导和会话 github
我更新了github上的代码,留下pay1.php文件:
编辑:交谈后我们看到这确实是应用程序流程的问题,index.php 所做的第一件事是包含 validate.php,它创建了变量 $step 和 $radio(检查它们是否存在于会话中之前),那么如果步骤是数字3,则包含success_paypal.php文件,该文件修改了会话变量(或未设置),然后使用变量$step的值创建step和radio javascript变量和之前创建的 $ radio,最后执行了一个 javascript 函数,该函数从先前的变量中获取数据,向 saveTemp.php 发送请求,这反过来又使用接收到的变量创建了会话变量。题目有条不紊
顺序错误:
正确的顺序:
干杯!
$_SESSION
是一个不需要使用保留字的超全局变量global
。在函数内部创建一个全局unset()
变量只会将值从本地副本中删除到函数上下文中。取消设置会话变量更精确: