2014-10-12 99 views
0

所以,我有一个PHP类,它有一个更新会话变量$_SESSION['location']的方法。但问题是,每次调用该方法时,都找不到保存的会话变量,并告诉我它未设置。它应该存储一个位置ID,并且该方法根据会话变量从MySQL数据库中提取下一个位置,然后存储新的ID。但是SQL代码中应该包含变量的地方是空的。PHP会话在刷新时不保存

我确实在页面的开头有session_start()。我试过手动设置变量,它也没有做任何事情。还尝试从另一个PHP页面访问该变量,也没有运气。请帮忙。

我的代码的小样本:

class location { 
@session_start(); 
function compass($dir) { 
    $select = $_SESSION['location']; 

    if($dir == "north") { 
     $currentlat = mysql_result(mysql_query("SELECT `lat` FROM `locationdb` WHERE id=".$select), 0, "lat"); 
     $currentlon = mysql_result(mysql_query("SELECT `lon` FROM `locationdb` WHERE id=".$select), 0, "lon"); 
     $sql = "[THE SQL CODE THAT GETS THE NEXT LOCATION]"; 
     $id = mysql_result(mysql_query($sql), 0, "id"); 

     $_SESSION['location'] = $id; 

     $return['loc']  = $this->display_location($id); 
     $return['lat']  = $this->display_lat($id); 
     $return['long']  = $this->display_long($id); 
     $return['id']  = $id; 
    } 

    return $return; 
} 
} 
+1

请张贴您的代码。 – Ejaz 2014-10-12 01:14:00

+2

你应该把'session_start();'放在类外的页面顶部。它应该只在加载时包含在页面中。你在哪里设置'$ _SESSION ['location']'? – Rasclatt 2014-10-12 01:19:11

+2

这就是为什么很少使用错误抑制(@)并且仅用于非常特定的目的的一个示例。 – Devon 2014-10-12 01:20:48

回答

0

我已经在这个文件中测试你的代码

**不要使用session_start()。

对于简单测试,首先将其添加到compass()函数中。

$_SESSION['location'] .= 'World'; 

然后用这些代码创建一个php脚本。

<?php 
    session_start(); 
    $_SESSION['location'] = 'Hello'; 
    include_once('*your name of class file*'); 
    $obj = new location(); 
    $obj -> compass('north'); 
    echo $_SESSION['location']; 
?> 

运行此脚本

如果输出的 “HelloWorld”,那么你的$ _SESSION [ '位置']工作。

0

检查您的phpinfo(),以查看是否定义了会话保存路径。如果不是,请定义一个目录来存储会话。在您的代码中:

session_save_path('/ DIRECTORY IN YOUR SERVER');

然后再试一次。

+0

是的,所有的会话变量都在工作,除了这一个。 – Thomas 2014-10-12 08:26:21

0

这更接近你的方法应该看起来像。有一些设置可以帮助减少运行该功能时出现的错误。有了这个功能和其他建议,你应该能够消除你得到的错误。

class location 
    { 
     public function compass($dir = '') 
      { 
       // Set the $select by $_SESSION or by your function 
       $select = (isset($_SESSION['location']))? $_SESSION['location']: $this->myFunctionToSetDefault(); 

       // I set $dir to empty so not to throw error 
       if($dir == "north") { 
         $currentlat = mysql_result(mysql_query("SELECT `lat` FROM `locationdb` WHERE id=".$select), 0, "lat"); 
         $currentlon = mysql_result(mysql_query("SELECT `lon` FROM `locationdb` WHERE id=".$select), 0, "lon"); 
         $sql  = "[THE SQL CODE THAT GETS THE NEXT LOCATION]"; 
         $id   = mysql_result(mysql_query($sql), 0, "id"); 

         $_SESSION['location'] = $id; 
         $return['loc']   = $this->display_location($id); 
         $return['lat']   = $this->display_lat($id); 
         $return['long']   = $this->display_long($id); 
         $return['id']   = $id; 
        } 

       // This will return empty otherwise may throw error if $return is not set 
       return (isset($return))? $return:''; 
      } 
    }