2015-04-12 128 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

很好的解釋。讚賞。 –

相關問題