php 用户在有或没有 AJAX 的情况下注销
Posted
技术标签:
【中文标题】php 用户在有或没有 AJAX 的情况下注销【英文标题】:php user logging out with or without AJAX 【发布时间】:2015-10-26 21:19:38 【问题描述】:我和我的同事很难解决这个问题。我们有一种特殊的网店,因为我们有客户和子客户。如果登录的人是子客户,我们希望在我们的页面上显示一些额外的 html。这行得通,但是如果子客户注销,而普通客户登录,额外的 html 仍然可见,但我们不明白这是怎么可能的。反之亦然:如果先登录的是普通用户,然后退出,再有子用户登录,多余的html是不可见的。
1. loginck.php
//用户输入邮箱结束密码后,判断是普通用户还是子用户。
如果是普通用户,则 => $_SESSION['multiklant'] = 0;
else 子用户 then => $_SESSION['multiklant'] = 1;
否则$_SESSION['multiklant'] = 0; //user not found
2。 index.php
if ($_SESSION['multiklant'] == 1)
$userid = $_SESSION['userid'];
echo "<div class='col-md-3'>";
echo "<label for='leveradres'>Leveradres*:</label><br/>";
echo "<select id='leveradres' class='form-control'>";
echo "<option value='0'>Selecteer...</option>";
$qry = "SELECT * FROM LEVERADRESSEN WHERE LA_EMAIL = '" . $_SESSION['klemail'] . "'";
$res = mysqli_query($link, $qry);
while ($row = mysqli_fetch_assoc($res))
echo "<option value='" . $row['LA_ID'] . "'>" . $row['LA_NAAM'] . "</option>";
echo "</select>";
echo "</div>";
3.1 注销点击index.php
$("#logout").click(function ()
var lgout = $.get("logout.php");
lgout.done(function (data)
$(".show-2").trigger("click");
$("#logout").addClass("hidden");
);
);
3.2 logout.php
<?php
session_start();
$_SESSION = array();
session_unset();
session_destroy();
header("Location:index.php");
exit();
?>
如您所见,我们在这里使用了 AJAX,但即使没有问题仍然存在。如果可能,我们希望保留 AJAX,但如果没有,可以将其删除。也是一种组合,重定向不在 de php 中,而是在 javascript 部分中。
这可能是缓存问题吗?因为如果我们在没有缓存的情况下重新加载浏览器,它就可以工作。
我们已经在互联网上搜索了 6 个小时,包括这个网站...
在 MAC 上的 Chrome 和 Windows 上的 Internet Explorer 11 中测试的代码没有区别。
【问题讨论】:
您是否在页面上开始了会话? ` session_start();` 是的,并且没有错误日志表明会话是在发送标头后开始的 检查每一页上的var_dump($_SEESION[])
..这样你就会知道什么是问题..
那么如果在浏览器中手动访问logout.php url,问题是否依然存在?
如果它确实是一个缓存问题,您可以通过添加时间戳作为 url 参数轻松解决它,如下所示: $.get("page.php?cache_bust=" + new Date().getTime( ))
【参考方案1】:
注销后查看响应头并检查“缓存控制”。 我认为缓存有问题。
【讨论】:
你认为? It's not hard to earn enough rep to make comments.【参考方案2】:您的注销在退出时执行标题位置。换句话说:$.get('logout.php')
完成了吗?
你为什么做一个重定向服务器端?所以整个页面和脚本将被重新加载!而你正在等待“完成”。这样做:
删除带有标题的行并退出logout.php会话销毁后,页面准备就绪,将执行 .done 回调。
【讨论】:
可能的方法?为什么OP应该“试试这个”?一个好的答案总是会解释所做的事情以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者。【参考方案3】:是的!
在搜索了很长时间并尝试了您的一些建议(我们对此表示感谢,我对最有用的建议投了赞成票)之后,我们找到了解决方案。 在阅读this 之后,一切都变得(更)清楚了。 Index.php 是我们唯一有内容的页面。所以是的,我们在那里开始一个会话,但是如果我们之后通过 AJAX 更改会话变量,index.php 不会跟踪这些更改。
这就是为什么我们在注销后尝试刷新页面的原因,所以会话变量会被刷新到。那没有用。直到我们在登录后也进行了刷新,它仍然有效,尽管为用户刷新了一些页面。
所以我们将这些代码块放在单独的 php 文件中,并在需要时使用 AJAX 进行检查
这是我们的解决方案:
1.当用户登录时:
$("#blockleveradressen").load("leveradressen.php");
var testmultiklant = $.get("testmultiklant.php");
testmultiklant.done(function (data)
if(data == 3)
$("#een").removeClass().addClass("col-md-3");
$("#twee").removeClass().addClass("col-md-3");
$("#drie").removeClass().addClass("col-md-3");
else
$("#een").removeClass().addClass("col-md-4");
$("#twee").removeClass().addClass("col-md-4");
$("#drie").removeClass().addClass("col-md-4");
);
2。杠杆作用.php
include "include/session.php";
include "include/MyConnect.php";
if ($_SESSION['multiklant'] == 1)
$userid = $_SESSION['userid'];
echo "<div class='col-md-3'>";
echo "<label for='leveradres'>Leveradres*:</label><br/>";
echo "<select id='leveradres' class='form-control'>";
echo "<option value='0'>Selecteer...</option>";
$qry = "SELECT * FROM LEVERADRESSEN WHERE LA_EMAIL = '" . $_SESSION['klemail'] . "'";
$res = mysqli_query($link, $qry);
while ($row = mysqli_fetch_assoc($res))
echo "<option value='" . $row['LA_ID'] . "'>" . $row['LA_NAAM'] . "</option>";
echo "</select>";
echo "</div>";
3. testmultiklant.php
include "include/session.php";
if ($_SESSION['multiklant'] == 1)
echo 3;
else
echo 4;
4. index.php
<div id="blockleveradressen">
</div>
<div id="een" class="col-md-4">
<label for="datepicker">Leveringsdatum*:</label><br/>
<input type="text" id="datepicker" readonly="readonly"/>
<input type="hidden" id="datepickerAlt" readonly="readonly" visible="false">
</div>
<div id="twee" class="col-md-4">
<label for="timepicker">Leveringstijdstip*:</label><br/>
<input type="text" id="timepicker" class="time"/>
</div>
<div id="drie" class="col-md-4">
<label for="betaalMethode">Betaalmethode*:</label><br/>
<select id="betaalMethode" class="form-control">
<option value="Overschrijving">Overschrijving</option>
<option value="Visa">Visa</option>
<option value="Cash">Cash</option>
</select>
</div>
只需要清理代码,但这行得通。刚刚学到了另一个教训:单页网站和 php(更具体的会话)不是最好的朋友 :-)
【讨论】:
以上是关于php 用户在有或没有 AJAX 的情况下注销的主要内容,如果未能解决你的问题,请参考以下文章
默认情况下,Android NDK 工具链二进制文件是不是在有或没有异常的情况下构建?