2015-06-22 25 views
1

我試圖將我所有的mysqli轉換爲PDO,但我用PDO很綠,而且我的問題可能是基本的。我在切換的第一個查詢時遇到問題。我需要幫助在PHP中使用函數中的類

這是我的設置。在我的login.php,我調用一個函數,像這樣:

的login.php

$user = attempt_login($username, $password); 

我包含的功能頁面加載此:

funcs.php

function attempt_login($username, $password) { 
    $user = find_user_by_username($username); 
    if ($user) { 
     if (password_check($password, $user["salt"], $user["password"])) { 
    ... 
} 

然後它指的是給我所有錯誤的函數:

function find_user_by_username($username) { 
    $db = new Database(); 
    $db->dbc(); 
    $sql = "SELECT * FROM users WHERE username = :usr"; 
    $stmt = $db->prepare($sql);    // *** this is line 157 
    $stmt->bindParam('usr', $username, PDO::PARAM_STR); 
    $stmt->execute(); 
    $result = $stmt->fetch(PDO::FETCH_ASSOC); 
    return $result; 
} 

我的類來踢東西了:

db_connection.php

class Database 
{ 
    private $dbc; 

    public function __construct() 
    { 
     try { 
      $db_host = ' ';  // hostname 
      $db_name = ' ';  // databasename 
      $db_user = ' ';  // username 
      $db_pass = ' ';  // password 

      $dbc = new PDO('mysql:host='.$db_host.'; dbname='.$db_name, $db_user, $db_pass); 
      $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
     catch (PDOException $err) { 
      $err->getMessage(); 
     } 
    } 

    public function dbc() 
    { 
     return $this->dbc; 
    } 

} 

數據庫可以連接。我只是不想在我的函數中使用Globals,但是我覺得錯誤意味着我需要在我的函數頁面中使用globabls。以下是錯誤:

Fatal error: Call to undefined method Database::prepare() in funcs.php on line 157 

我的問題是,我這樣做都是錯的意思,我應該把我所有的功能類也,還是我只是簡單的東西?再次,我只是想在我的函數中使用PDO,並避免使用全局變量。

+0

其中是:usr?,它是您想要的變量,如$ db $ dbc之類的,而不是 - >數據庫中的一個類。你有一個$ db,$ dbc,有點搞砸了 – Drew

+0

在你的'Database :: __ construct()'你設置爲'$ dbc'而不是'$ this-> dbc'。然後在'function find_user_by_username($ username)'中,您需要將'$ db-> dbc();'更改爲'$ db = $ db-> dbc();' – Sean

+0

@Sean工作正常。但現在我需要處理VolkerK的建議。我以爲我可能會犯這樣的錯誤。 – Reveren

回答

0
$db->dbc(); 

因爲您沒有將返回值存儲在變量中,然後使用此變量對prepare()進行調用,所以這沒有效果。
另外,您並未將PDO對象存儲在成員變量中,而是存儲在構造函數方法中的局部變量中 - >構造函數存在時超出了範圍。
因爲你的Database類別只是傳遞一些參數給PDO的構造函數,所以它沒有任何意義 - 完全沒用;而班級「不做」的名字意味着什麼。我寧願在這裏建議使用dependency injection

+0

我做了兩個變化肖恩上面提到,它的工作,這是你在這裏提到的一部分。但現在我需要閱讀你提到的鏈接。我覺得我從一開始就做錯了。 – Reveren