2017-06-16 127 views
1

我在我的PHP文件中收到此錯誤。PHP致命錯誤:未捕獲錯誤:調用成員函數prepare()null

我的登錄功能

<?php 
session_start(); 
include ("../dbConnection.php"); 


class login { 

    public $link; 

    function __construct() 
    { 
     $dbc = new dbConnection(); 
     $this->link = $dbc->Connect(); 
     return $this->link; 
    } 

    public function get_data($emailid,$password) 
    { 
     $q = $this->link->prepare("SELECT id from students WHERE emailid='$emailid' AND password='$password' AND active='Yes'"); 
     $q->execute(array(':emailid'=>$emailid,':password'=>$password)); 
     $counts = $q->fetch(); 
     if($counts['id'] > 0) 
     { 
      session_start(); 
      $_SESSION['userlogin'] = $counts['id']; 
      $encrypt_id1 = $this->encrypt_decrypt('encrypt', $counts['id']); 
      echo $encrypt_id1; 
     }    
    } 
} 

dbConnection.php

<?php 

public class dbConnection { 

    public $conn; 


    public $db_host = 'localhost'; 
    public $db_name = 'pte_mock'; 
    public $db_user = 'root'; 
    public $db_pass = ''; 

    public function Connect() 
    { 
     try{ 
      $this->conn = new PDO("mysql:host=".$this->db_host.";dbname=".$this->db_name,$this->db_user,$this->db_pass); 
      $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
     catch(PDOException $e) 
     { 
      echo 'ERROR: ' . $e->getMessage(); 
     }  
     return $this->conn; 
    } 
} 

我收到提示下面的語句

"$q = $this->link->prepare("SELECT id from students WHERE emailid='$emailid' AND password='$password' AND active='Yes'");" 

錯誤

"PHP Fatal error: Uncaught Error: Call to a member function prepare() on null" 

我不知道這是什麼問題。如果有人知道解決方案,請幫我解決這個問題。提前感謝。

+2

的可能的複製[致命錯誤:調用一個成員函數上的空製備()](https://stackoverflow.com/questions/28592400/fatal- error-call-to-a-member-function-prepare-on-null) –

+3

在php中的構造函數絕不能返回任何東西! – arkascha

+0

我嘗試過,但沒有解決我的問題。 –

回答

-1

與此更換你的代碼

$q = $this->link->prepare("SELECT id from students WHERE emailid='$emailid' AND password='$password' AND active='Yes'"); 

$q->execute(array(':emailid'=>$emailid,':password'=>$password)); 

的這一部分:

$q = $this->link->prepare("SELECT id FROM students WHERE emailid = :emailid AND password = :password AND active = 'Yes'"); 

$q->execute(array(':emailid'=>$emailid,':password'=>$password)); 
+0

不是從我downvote。然而,你指出的問題只是衆多的問題之一,而不是破壞代碼的問題之一。 – Paolo

0

當你定義一個類需要以初始化實例變量構造。

class dbConnection { 

    public $conn, 

      $db_host, 
      $db_name, 
      $db_user, 
      $db_pass; 

    public function __construct() 
    { 
     $this->conn = false; 

     $this->db_host = 'localhost'; 
     $this->db_name = 'pte_mock'; 
     $this->db_user = 'root'; 
     $this->db_pass = ''; 
    } 

    /* ... */ 

也是一類不能被定義public,應該在編譯時提出一個語法錯誤。

所以你只要class dbConnection {


我不知道這是導致問題,但construstors 不得返回值。實際上它們返回剛剛創建的實例(對象)

你必須到類login

function __construct() 
{ 
    $dbc = new dbConnection(); 
    $this->link = $dbc->Connect(); 
    // return $this->link; // <--- REMOVE THAT - YOU CANNOT RETURN VALUES HERE! 
} 

當你調用$lgn = new login()功能__construct()被調用,你進入$lgnlogin的新實例。如果構造函數返回任何被丟棄的東西!

所以,你應該重構你的代碼是這樣的:

$lgn = new login(); // <--- returns a new instance of the class login 
$the_link= $lgn->link; // <--- this way you access `link` instance variable 

最後這個

$q = $this->link->prepare("SELECT id from students WHERE emailid='$emailid' AND password='$password' AND active='Yes'"); 

不是構建爲你注入值代入事先準備好的聲明的正確方法查詢而不是指定佔位符。

行應該這樣寫

$q = $this->link->prepare("SELECT id from students WHERE emailid=:$emailid AND password=:password AND active='Yes'"); 
相關問題