2014-02-05 116 views
0

因此,我學習了很多關於PHP的知識,並且從基礎開始,即使其中一些已被棄用。現在我已經掌握了知識,我正在重寫我爲使用PDO和課程所做的一切。現在我從來沒有用過,但我慢慢地(緩慢地)慢慢地理解,並且讓我的頭轉過來。我想問的是,如果我正確的做到了,如果不是,我會在哪裏錯?將變量轉變爲類'

我基本上有這樣的功能:

function user_exists($username) { 
    $username = sanitize($username); 
    $query = mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"); 
    return (mysql_result($query, 0) == 1) ? true : false; 
} 

而且我希望把它變成一個類:

class user { 
    function exists($username) { 
     $username = $username; 
     $query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"); 
     $results = $query->fetchAll(PDO::FETCH_ASSOC); 
    } 
} 

我在正確的軌道上,我應該在功能使得變量(方法)私有的「存在」方法?

我打算用「存在」,「禁止」,「管理員」等方法創建「用戶」類。我認爲這是我應該做的?

謝謝如果有人回答這個問題。

+0

'$ username = $ username;'_特別錯誤。首先它沒有效果,其次是命名不好。也許你的意思是'$ this-> name = $ name;',其中'name'是一個類屬性。 –

+0

糾正我,如果我錯了,但在一個類中的'屬性'只是意味着可變的權利?像'方法'的意思是功能? 我在我的函數中有什麼是當用戶登錄時檢查用戶名是否存在,因此它將它解析爲查詢中要使用的函數。那麼你在說什麼是正確的? 另外,如果你可以回答; pdo querys是否安全?只有插入,ect很容易sql注入,應該準備好嗎? – user3245541

回答

1
class User { 
    public $name; 

    private $db; 

    function __construct($name) { 
     $this->name = $name; 

     $this->db = get_me_a_db_connection(); 
    } 

    public function exists() { 
     $query = $this->db->query('SELECT COUNT(user_id) FROM users WHERE username = "' . $this->name . '"'); 
     $results = $query->fetchAll(PDO::FETCH_ASSOC); 

     return some_code_that_extracts_the_count_from_$results; 
    } 
} 

但是: 1)$db不應該是一個類屬性。它至少應該在工廠。所以,你extract it in a factory

class Factory { 
    public static function db() { 
     return get_me_a_db_connection(); 
    } 
} 

public function exists() { 
    $query = Factory::db()->query(...); 
    ... 
} 

這樣,你不基礎的代碼那麼多污染你domain models

2)通過那麼多上面我的意思是可以實現的基礎結構代碼之間的數據庫連接和您的域模型總解耦(,查詢)。那裏有tons of libraries就是這麼做的。我會從Laravel's Eloquent開始。

3)如果您使用prepared statements,PDO查詢是安全的。像上面鏈接到的那些庫都使用預先準備好的語句。作爲一個noob,我會建議你通過研究其中之一開始學習。

+0

謝謝這真的很有幫助,謝謝你解釋。我會看看使用該庫;我以前從來沒有使用過,但它看起來像是帶走了大量的批量,比如查詢並將其放入模型中?我想我需要閱讀更多內容......但我慢慢了解它。再次感謝。 – user3245541

0

也許你沒有太多走出軌道,這是一個好的開始。但是你需要學習如何進入面向對象編程。我會從一個簡單的課程開始,例如用戶以及真實用戶的信息,無論用戶需要爲所有您嘗試創建的方法所需的信息。

您需要的私有變量總是您需要的各種方法的信息。就像用戶名和其他任何你需要知道的信息一樣。

也許$結果可能是最後一次返回信息的變量,或者只是像第一個示例那樣返回它。

在寫下課程之前,你需要先考慮你真正需要的東西。

+0

所以你說要做一堂課,一切都是靜態的?所以我的類會有$ this-> username = $ username,$ this-> first_name = $ first_name,並且全部解析爲方法user($ username,$ first_name)?我已經在OOP中讀了很多東西,它只是讓我的大腦思考很多東西,讓我的頭腦變得與衆不同,因爲它與舊式相比有很大的變化。如果在我走路之前碰到試圖跑步的情況,我會通過試驗和錯誤學到最好的東西。 – user3245541

+0

也許這只是我的編程方式。我通常會做所有事情,而不是嘗試錯誤的方式。有時候它更加令人滿意,並且總是這樣,這是最重要的部分,是你知道整體事情是如何工作的,它確實有助於解決問題並在程序中做出進一步的改變。 – Hotwer

+0

這不是OOP。 OOP不需要類。在類中編寫代碼並不能保證你在做OOP。首先做出這種區分。 –