会话标记在Javascript中不起作用

时间:2014-09-01 09:21:00

标签: php jquery session

我在javascript中使用会话标志来表示IF功能。如果session标志为1,则javascript将在点击时显示特定的div。我手动尝试过,但代码似乎没有用。

这是我的JS代码:

$(document).ready(function(){
check = <?= $_SESSION['flag'] ?>;
$("#bag").click(function(){
    if(check==0){
        $("#login").show();
        $("#notlogin").hide();
    } else {
        $("#login").hide();
        $("#notlogin").show();
    }
});
}); 

这是html文件头部的会话:

<?php @session_start();
$_SESSION['flag']=0;
?>

请在小提琴中查看:http://jsfiddle.net/9mm5ougu/

配置-haslogin.php

<?php
error_reporting(E_ALL ^ E_NOTICE); 
ini_set("display_errors", 1);
mysql_connect("mysql.com","name","password") or die("cannot connect");
mysql_select_db("databasename") or die("Fail here");
$myemail= $_POST['myemail'];
$mypassword= $_POST['mypassword'];
$sql= "SELECT * FROM user WHERE myemail='".$myemail."' and mypassword='".$mypassword."'";
$result=mysql_query($sql);
$count=mysql_num_rows($result);
if($count==1)
{
echo "Login successful";
$_SESSION['flag']=0;
header("Location:index.php");
}
?>

3 个答案:

答案 0 :(得分:3)

您无法将PHP代码放入JavaScript文件,因为PHP在服务器端解释,而JavaScript在客户端解释(至少在你的用例中)。

如果你真的必须根据PHP $_SESSION值进行条件处理,你有多种选择(从最差到最好列出一个恕我直言):

解决方案1:使用动态JavaScript文件(最差)

PHP代码放入JavaScript文件中,但使用.php扩展名代替.js。您的JavaScript代码看起来像这样:

<强> file.js.php

$("#bag").click(function(){
    <?php if ($_SESSION['flag'] === 0): ?>
        $("#login").show();
        $("#notlogin").hide();
    <?php else: ?>
        $("#login").hide();
        $("#notlogin").show();
    <?php endif; ?>
});

您可以将此PHP文件包含为JavaScript文件:

<强>的index.php

<script src="file.js.php"></script>

这是最糟糕的解决方案: - 当您正在混合使用这两种语言时,您的文件很快就会变得不可读 - 因为该文件现在是动态的,用户的浏览器无法将其放在客户端缓存上 - 您使用PHP服务器的资源并不是必需的 - 您无法在CDN或专用于提供静态文件的简单服务器上部署文件 - 您无法缩小JavaScript文件

解决方案2:使用两个不同的JavaScript文件

创建两个不同的JavaScript文件,一个用于登录用户,另一个用于注销。使用$_SESSION值加载正确的文件。

<强> loggedOut.js

$("#bag").click(function(){
    $("#login").hide();
    $("#notlogin").show();
});

<强> loggedIn.js

$("#bag").click(function(){
    $("#login").show();
    $("#notlogin").hide();
});

<强>的index.php

<body>
    <!-- page content here -->


    <?php if ($_SESSION['flag'] === 0): ?>
        <script src="loggedIn.js"></script>
    <?php else: ?>
        <script src="loggedOut.js"></script>
    <?php endif; ?>

</body>

此解决方案优于第一个解决方案,因为它几乎解决了所有问题:文件缓存在客户端上,您不需要混合PHPJavaScript代码。但这不是您可以拥有的最佳解决方案,因为它会带来大量代码重复,并且维护代码库会更加困难。

解决方案3:启用模型客户端(或类型)

您可以将数据模型传递到JavaScript文件,并直接从那里使用它。例如,您可以在<body>标记上拥有一个取决于$_SESSION['flag']值的类名,并且您的JavaScript文件将根据此值执行不同的操作。这是一个例子:

<强>的index.php

<?php
$className = $_SESSION['flag'] ? 'logged-in' : 'logged-out';
?>

<body class="<?php echo $className; ?>">
    <!-- page content here -->

    <script src="yourFile.js"></script>
</body>

<强> yourFile.js

$(document).ready(function(){

    var isLoggedIn = $('body').hasClass('logged-in');

    $("#bag").click(function() {
        if (isLoggedIn)
        {
            $("#login").show();
            $("#notlogin").hide();
        }
        else
        {
            $("#login").hide();
            $("#notlogin").show();
        }
    });

});

如果此类仅由JavaScript代码使用(这意味着此类不会在CSS代码中使用),则应在其前面添加此js-以区分它来自真实的CSS班级名称。

答案 1 :(得分:1)

当您在Javascript中访问PHP变量时,请将其括在引号中,如

check = "<?= $_SESSION['flag'] ?>";

选中fiddle

答案 2 :(得分:1)

使用AJAX从服务器获取所需的数据。

例如,创建get-data.php:

<?php @session_start();
_SESSION['flag'] = 0;
json_encode(_SESSION['flag']);
?>

从ajax调用它:

$(document).ready(function(){ // your DOM loaded
    $.ajax({
        url: '/get-data.php',
        success: function(response){
            $("#bag").click(function(){
                if(JSON.parse(response) == 0){
                    $("#login").show();
                    $("#notlogin").hide();
                } else {
                    $("#login").hide();
                    $("#notlogin").show();
                }
                });

        },
        error: function(){
            alert('data not loaded');
        },
         complete: function(){

       }
    })

})