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 工具链二进制文件是不是在有或没有异常的情况下构建?

在有或没有 OSGi 的情况下使用 JPA 的区别

如何在有或没有 SIMD 内在函数的情况下从 Zig 构建和链接到 CGLM

Laravel 5.5 Ajax 注销没有重定向

如何不让用户在不注销的情况下返回 login.php?

JavaFx 离线能力?