【问题标题】:PHP / Ajax : How to show/hide DIV on $_SESSION variable value?PHP / Ajax:如何在 $_SESSION 变量值上显示/隐藏 DIV?
【发布时间】:2013-10-01 07:45:26
【问题描述】:

我在网上搜索了很多很多关于会话变量以及如何通过 Ajax 从 Javacript 获取它们的主题。但是,虽然我已经能够这样做,但这并不能完全解决我的问题。

目标

在线提供在线库存管理。

约束

  • 只有经过身份验证的用户才能管理在线库存
  • 库存管理控件对未经身份验证的用户隐藏
  • 每个部分都必须独立获知身份验证,以便相应地显示/隐藏其控件

代码示例

  • 认证.php
  • project.js
  • index.php
  • atv.php
  • atv-inventory-list.php
  • sectionhandler.php

index.php

<?php session_start(); ?>
<html>
...
    <div id="newAtvDialog" title="Input information on the new ATV">
        <form id="newAtvAjaxForm" action="addNewAtv.php" method="post">
        ...
        </form>
    </div>
    <div id="section">
        <$php echo file_get_contents("inventory-sections.html"); ?>
    </div>
...
</html>

authenticate.php

<?php
require_once "data/data_access.php";

$userName = "";
$password = "";

if (isset($_REQUEST["userName"])) $userName = $_REQUEST["userName"];
if (isset($_REQUEST["password"])) $password = $_REQUEST["password"];

$isAuthentic = isAuthenticUser($userName, $password);
$_SESSION["isAuthentic"] = $isAuthentic;
echo $isAuthentic;

// I try to use the below-written function where ever I need to show/hide elements.
function isCurrentUserAuthenticated() { 
    return isset($_SESSION["isAuthentic"]) && $_SESSION["isAuthentic"]; 
}
?>

project.js

$(document).ready(function() {
    $("#newAtvDialog").dialog({
        autoOpen: false,
        closeOnEscape: true,
        modal: true,
        width: 1000
    });

    $("#newAtvAjaxForm").ajaxForm(function(data) {
        $("#newAtvDialog").dialog("close");
        $("#section").load("sectionhandler.php?section=atv&type=-1&make=0&year=0&category=0", function(event) { $("button").button(); }); 
    });
});

atv.php

<div id="newAtvButton"> <!-- This DIV is to be hidden when not authenticated -->
    <button id="addNewAtvButton">Add New ATV</div>
</div>
<div id="criterion">
    ...
</div>
<div id="atv-inventory">
    <?php include ('atv-inventory-list.php'); ?>
</div>

atv-inventory-list.php

<?php 
$type = -1;
$make = 0;
$year = 0;
$category = 0;

if (isset($_REQUEST["type"])) $type = $_REQUEST["type"];
...

$atvs = getAllAtvs($type, $make, $year, $category);
foreach ($atvs as $value=>$atv):
?>
<div class="inventory-item">
    <img src="<?php echo utf8_decode($atv->getPathToImage())">
    <div class="item-title">
    ...
    </div>
    <div id="commands">
    <!-- This is the way I have tried so far, and it doesn't seem to work properly. -->
        <button id="removeAtvButton" 
           class="<?php echo isCurrentUserAuthenticated() ? 'show' : 'hide'; ?>">
           Remove ATV
        </button> 
    </div>
</div>

sectionhandler.php

$section = "";
if (isset($_REQUEST["section"])) $section = $_REQUEST["section"];

$type = -1;
$make = 0;
$year = 0;
$category = 0;

// getting values from $_REQUEST[]

$activatedSection = "";

switch($section) {
    case "atv": $activatedSection = "atv.php";
    ...
}

$file = $url.raw_url_encore($activatedSection);
include $file;

补充想法

我想设置一个布尔会话变量,该变量将在用户不活动大约 20 分钟后过期,迫使他再次登录。

我知道我不会使用存储在数据库中的密码。这是本网站认证的第一步,我很快就会上线,因为客户很快就会要求交货。加密密码将是下一步。但首先,我需要显示/隐藏功能才能正常工作。

我也考虑过 cookie,而且对 Web 开发还很陌生,我不太确定最好的方法是什么。就我而言,最简单的就是最好的,只要它意味着最低限度的安全性。这毕竟不是 NASA 的网站! ;-)

感谢大家的投入! =)

【问题讨论】:

  • "下一步将是加密密码。" - 安全不应该是事后的想法。
  • 我知道您不想要 Nasa-Security,但是您是否考虑过创建内容?而不是显示/隐藏,也许您可​​以使用附加/删除,以确保没有身份验证用户可以通过调试器看到您的隐藏数据(如 mozilla 中的 firebug)
  • 顺便说一句,你真的应该只发布相关代码sn-ps,有太多不相关的代码需要查看。
  • @RainFromHeaven:知道了。然后,只需编辑问题,以便那里只有相关代码!另外,至于安全性不是事后的想法,我同意。但是在深入一个洞之前,你应该先挖第一步。所以,与其批评,你能帮忙吗?
  • @Lan:谢谢你的想法,我只是没想过这个选项。能否请您给我一些示例代码,以便我可以了解操作方法?我一般不习惯 PHP 和 Web 技术。这东西对我来说很新鲜。提前致谢!

标签: javascript php jquery ajax session


【解决方案1】:

这是一个想法,但您可以根据它进行工作;

actionURL 是一个 php 文件,您可以在其中检查用户是否使用有效会话登录。

ajaxSession 函数在用户登录时返回真或假。

然后你可以每隔 X 秒/分钟调用一次这个函数来控制会话是否还在继续。

window.setInterval(function(){
  // call your function here
  if(ajaxSession(actionUrl)){
      //return true, user logged, append/show protected divs.

  }else{
      //return false, remove/hide protected divs and ask user to log.

  }    
}, 5000); //every 5 seconds.

ajaxSession 函数:

 function ajaxSession(actionUrl) {
        var sessionOK= false;

        $.ajax({
        async: false,
        url: actionUrl,
        success: function(msg) {
             // check the return call from the php file.
              if(msg== 'OK'){ 
                 sessionOK = true;
              }else{
                 sessionOk = false;
              }
        }});

        return sessionOK;
    }

编辑

我将为 actionUrl 添加一个示例代码,如果会话已设置,它将返回 ajaxSession 函数:

<?php
    session_start();

    // $_SESSION['reg'] is true when the user is logged in.
    if($_SESSION['reg'] == true){
        echo 'OK';
    }else{
        echo 'NO';
    }
?>

记得在 ajaxSession 函数中检查 Ajax 调用的结果。如果没问题,则 sessionOk = true,如果没有,则 sessionOk = false。

【讨论】:

  • 感谢您提供此示例。我会留意这个解决方案并让你知道。谢谢你的帮助。 =)
  • @WillMarcouiller 再次检查我的答案。我在 ajax 调用中添加了一些代码,并添加了一个用于检查用户是否登录的 php 文件示例。待办事项:如何在 jQuery 中显示/隐藏 div.. 提示:$("#div_id").show();跨度>
  • +1 提供大量样本以帮助将所有内容连接在一起。这似乎是一种有效的方法。现在仍然显示/隐藏 DIV 部分,这本身就是另一个挑战!如果您想到某事,请不要犹豫。我会很高兴学习! =)
  • 我尝试从我的 HTML 代码中删除所有按钮,并在 ajaxCallback 匿名函数成功时通过 $("#sectionId").html("&lt;button&gt;Hello!&lt;/button&gt;"); 添加它们,但它似乎不起作用。我将编辑我的问题以标记更改。
  • @WillMarcouiller,也许最好再提出一个问题,询问如何在通过 jquery 进行 ajax 调用后隐藏/显示 html 代码..
猜你喜欢
  • 2020-09-04
  • 2014-05-22
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多