【问题标题】:php session not working, tried all sortsphp会话不起作用,尝试了各种
【发布时间】:2012-05-11 18:04:48
【问题描述】:

在过去的 3 个小时里,我一直被一个问题所困扰,这让我对 PHP 会话充满了思考。 Iv 从 session_is_registered 转到 $_SESSION 并且它不想工作。

请参阅下面的代码(在我想通过登录保护的页面的最顶部的所有文件中):

    <?php

     session_start();

     if(!isset($_SESSION['user']))
         header("location: login.php");

    ?>

在另一个页面 access.php 我有一个带有两个输入框和提交按钮的表单来检查输入并与 db 交叉引用它。当输入不正确的值时,我收到消息“无效登录”,这是正确的。但是当我输入正确的详细信息时,我会回到 login.php 页面,要求登录。

我正在保存会话并检查详细信息如下:

    <?php
    session_start();
    include("dbfile.php");

    $sql = mysql_query("SELECT id FROM myTable WHERE user=$username AND pass=$pass");

    if(mysql_num_rows($sql)==1){

             $_SESSION['user'] = "Test";
             header("location: account.php");
    }else{

             header("location: login.php");      
    }
     ?>

不幸的是,我在一个已关闭 register_globals 的共享服务器上,但不确定这是否是问题所在。如果我在其他页面上回显会话的输出,我什么也得不到。就像它甚至没有注册/保存会话一样。

我在浏览器上启用了 cookie/js。事实上,我已经在 4 个浏览器上进行了测试,但结果相同。谁会成为这个的救命稻草..

【问题讨论】:

  • 它在哪里结束,如果语句是从那里进入 login.php 还是进入 account.php?也许你有不止一行从 db 返回?
  • 如果找到一条匹配的记录,它将转到我的帐户页面,否则转到 login.php。数据库中的用户名'设置为唯一,因此消除了重复的可能性。
  • 你能从 phpinfo() 发布 PHP 配置部分吗?
  • 你能不能 var_dump($_SESSION) 然后死掉;让我知道它显示了什么?
  • var_dump($_SESSION) 是否给你输出???

标签: php session variables global-variables


【解决方案1】:

在查询中尝试$_POST['username']$POST['pass'],如果register_globals 关闭,变量$username$pass 将不存在。 (他们应该是。)

如果您想查看会话是否正常工作,请尝试以下操作:

<?php
    session_start();
    var_dump($_SESSION);
    $_SESSION['works'] = 'yes';
?>

在第二个页面视图中,您应该会在屏幕上看到结果。 :)

【讨论】:

  • 它确实有效 ["works"]=> string(3) "yes" 但为什么我无法访问任何其他页面.. 我在顶部有 session_start 但将 ne 发送回登录
  • 那是因为register_globals 被关闭并且你的代码依赖于它被打开。因此,正如我发布的那样,使用 $_POST['username]$_POST['pass'] 获取登录值。
  • 另外,看看推荐mysql_real_escape_string的其他答案。如果你使用这个功能,那是一个很大的进步!
  • 它的工作伙伴!我坚持使用 $user,这是一个愚蠢的错误.. 我在包含的文件(标题)中有一个具有相同名称的 anotehr 查询我更改了名称,现在一切都像魅力一样工作.. 你的转储变量就像一个直通球大声笑。 . 非常感谢!
【解决方案2】:

试试这个当你在查询中使用invariable并且数据类型是整数时,你必须写“.$variable_name”。如果变量是数据类型是 varchar 那么你必须写成 "'.$varable_name.'"

<?php
    session_start();
    include("dbfile.php");

    $sql = mysql_query("SELECT id FROM myTable WHERE user="'.$username.'" AND pass="'.$pass.'" ");

    if(mysql_num_rows($sql)==1){

             $_SESSION['user'] = "Test";
             header("location: account.php");
    }else{

             header("location: login.php");      
    }
     ?>

【讨论】:

    【解决方案3】:

    试试这个

    $sql = mysql_query("SELECT id FROM myTable WHERE user='$username' AND pass='$pass'");
    
    if(mysql_affected_rows()>0){
    
             $_SESSION['user'] = "Test";
             header("location: account.php");
    }else{
             // die(mysql_error()); use this if you think maybe there is an error
             header("location: login.php");      
    }
    

    【讨论】:

      【解决方案4】:

      如果您遇到问题,例如您的 php 会话无法在您网站的所有页面上运行,请不要担心,如果您的问题与我以前在我的网站中遇到的问题相匹配,那么您可以轻松解决您的问题。

      所以假设在您的登录页面中,您以...开始您的会话

      session_start();
      $_SESSION['islogin'] = 'true';
      

      但您的“登录”会话不适用于除少数页面外的所有页面。比您的网址可能有问题。请检查您的网址中是否有“www”。如果不是,请在您的网址中添加“www”,然后重试。如果您想使用 htaccess 文件在您的网址中添加“www”,请尝试以下操作。

      RewriteEngine On
      RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
      RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
      

      在您的 .htaccess 文件中添加这三行代码。

      也许这些改变可以解决你的问题。

      【讨论】:

        猜你喜欢
        • 2019-12-15
        • 2022-08-03
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 2013-02-09
        • 2014-02-08
        • 1970-01-01
        相关资源
        最近更新 更多