2015-04-12 123 views
0

我对PHP比较陌生,正在构建我的网站的登录部分。我试图让代码工作无济于事,变得非常无奈。当我提出一个有效的用户名&密码,我得到上述致命错误:调用未定义的方法stdClass :: _ setSession()第58行

Fatal Error: Call to undefined method stdClass::_setSession() on line 58

我从代码的其余部分测试查询单独的错误并反馈变量,因为他们会从形式(即$User= "..." & $Pass="...")和供给身份验证通过。此外,数据库中不存在的数据不会找到用户(通过php日志进行验证)。

我在这个错误上做了大量的搜索,我似乎无法做出任何我找到的答案适合这个实例(请参阅下面的其他信息,我尝试了一些有意义的东西我)。我已经在下面列出了相关的文件。提前感谢您提供的任何帮助!

附加信息:

  1. 我试图删除“新stdClass的”定义为$这其中产生了以下错误:“警告:创建默认对象从空值”指的是第一$此遭遇。
  2. 我试图将stdClass定义更改为“用户”并收到以下错误:“致命错误:达到最大函数嵌套级别'100',中止!”指的是“新用户”这一行。

相关文件:

class User { 
public $Id; 
public $Email; 
public $FirstName; 
public $LastName; 
public $Address; 
public $City; 
public $State; 
public $Zip; 
public $Phone; 
public $PhoneType; 
public $IsLoggedIn = false; 
function __construct() { 
if (session_id() == "" || !isset($_SESSION)) { 
session_start(); 
} 
$_SESSION['IsLoggedIn'] = false; 
if (!isset($This)) {$This = new stdClass();} 
$This->IsLoggedIn = false; 
if (isset($_SESSION['IsLoggedIn']) && $_SESSION['IsLoggedIn']== true) { 
$This->_initUser(); 
} 
} //end __construct 
public function authenticate($User,$Pass) { 
$mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB); 
    if ($mysqli->connect_errno){ 
     error_log("Cannot connect to MySQL: " .$mysqli->connect_error); 
     return false; 
           } 
$hasher= new PasswordHash(8, false); 
$SafeUser = $mysqli->real_escape_string($User); 
$SafeUser = strtolower($SafeUser); 
$IncomingPassword = $mysqli->real_escape_string($Pass); 
$Stored_hash= "*"; 
$Query = "SELECT * FROM donors"; 
$QueryUser = $mysqli->query($Query); 
while ($FindUserRow = $QueryUser->fetch_array()){ 
    if ($FindUserRow['Email']== $SafeUser){ 
     $Stored_hash = $FindUserRow['Password']; 
      if ($hasher->CheckPassword($IncomingPassword, $Stored_hash)) { 
       $Check = 'Authentication succeeded';} 
      else { error_log("Passwords for {$User} don't match"); 
       $Check = 'Authentication failed'; 
       return false;} 
     if (!isset($This)) {$This = new stdClass();} 
     $This->Id = $FindUserRow['Id']; 
     $This->Email = $FindUserRow['Email']; 
     $This->FirstName = $FindUserRow['First_Name']; 
     $This->LastName = $FindUserRow['Last_Name']; 
     $This->Address = $FindUserRow['Street']; 
     $This->City = $FindUserRow['City']; 
     $This->Zip = $FindUserRow['Zip']; 
     $This->State = $FindUserRow['State']; 
     $This->Phone = $FindUserRow['Phone']; 
     $This->PhoneType = $FindUserRow['Phone_Type']; 
     $This->IsLoggedIn = true; 
     $This->_setSession(); 
     return true;} 
    else{ 
     error_log("Cannot retrieve account for {$User}"); 
     return false;}} 
} //end function authenticate 
private function _setSession() { 
if (session_id() == '' || !isset($_SESSION)) { 
session_start(); 
} 
$_SESSION['Id'] = $This->Id; 
$_SESSION['Email'] = $This->Email; 
$_SESSION['FirstName'] = $This->FirstName; 
$_SESSION['LastName'] = $This->LastName; 
$_SESSION['Address'] = $This->Address; 
$_SESSION['City'] = $This->City; 
$_SESSION['Zip'] = $This->Zip; 
$_SESSION['State'] = $This->State; 
$_SESSION['Phone'] = $This->Phone; 
$_SESSION['PhoneType'] = $This->PhoneType; 
$_SESSION['IsLoggedIn'] = $This->IsLoggedIn; 
} //end function setSession 
private function _initUser() { 
if (session_id() == '' || !isset($_SESSION)) { 
session_start(); 
} 
$This->Id = $_SESSION['Id']; 
$This->Email = $_SESSION['Email']; 
$This->FirstName = $_SESSION['FirstName']; 
$This->LastName = $_SESSION['LastName']; 
$This->Address = $_SESSION['Address']; 
$This->City = $_SESSION['City']; 
$This->Zip = $_SESSION['Zip']; 
$This->State = $_SESSION['State']; 
$This->Phone = $_SESSION['Phone']; 
$This->PhoneType = $_SESSION['PhoneType']; 
$This->IsLoggedIn = $_SESSION['IsLoggedIn']; 
} //end function initUser 

回答

0

你已经做了它额外的复杂。 错误的语法if (!isset($This)) {$This = new stdClass();}这是一个错误的做法。 $this with lowercase t是当前类的默认对象。

您正在尝试覆盖用户对象($这个)与stdClass的,所以解析器正在_setSession()stdClass而不是User成员方法,因此它是由明显不确定的。尝试删除不良语法,并使用$this->_setSession()replace $This to $this以便更好地理解。

+0

很好的解释。赞赏。 –

相关问题