2012-11-07 47 views
3

我開始一個新的苗條項目與枝支持,我想使用PDO作爲數據庫層,是什麼方式來整合?或者只使用GLOBAL $ db?在瘦身框架中如何使用PDO?

謝謝。

+0

通常,這就是我所做的。雖然它不是正確的做法,但就OOP而言,這很容易。當然,您需要非常小心地將代碼與其他可能使用相同變量名稱的庫混合使用。請參閱glasz答案,瞭解如何正確執行此操作。 – Brad

回答

4

我對抗可變全局變量。如果你要處理更多的這樣的問題,考慮登記處(見this one

function db() { 
    static $db = null; 
    if (null === $db) 
    $db = new PDO(...); 
    return $db; 
} 

:你可以使用一個簡單的工廠方法返回的連接。

關於可變全局:

我反對這樣的事情,因爲,他們很容易突變。
如果在程序流程中,情況意外改變,會發生什麼情況?
事情打破。

如果你是唯一一個在這個項目上工作的人,全局變量可能沒問題。
但是根據我的經驗,即使在這種情況下,跟蹤全局變量也會變得麻煩並且冒犯您的代碼的邏輯組織。
如果您想與其他將覆蓋此類全局的其他人分享您的代碼,該怎麼辦?

此外,全局矛盾在seperation of concerns背景下data encapsulation的方法。

所有這些都是軟件架構的大科學。

此外,在此特定情況下使用工廠可確保您只保留對數據庫連接的單一引用。

+0

不錯的參考。你能解釋爲什麼你反對可變全局變量? :) –

+1

@ Wolfpack'08增加了我在上述全局上的位置。 – glasz

+0

$ sth = $ this-> db-> prepare($ sql); $ sth-> execute(); $ silos = $ sth-> fetchAll(); $ sth = null; 我的PDO對象會被'$ sth = null;'關閉嗎? –

3

看看這個項目:Slim-PDO(github上)

文檔is here

通過作曲家安裝:$ composer require slim/pdo

簡單的用法:

$app->container->singleton('database', function() use ($app) { 
    return new \Slim\PDO\Database($app->config('db.dsn'), $app->config('db.usr'), $app->config('db.pwd')); 
}); 

// SELECT * FROM users WHERE id = ? 
$selectStatement = $app->database->select() 
         ->from('users') 
         ->where('id', '=', 1234); 

$stmt = $selectStatement->execute(); 
$data = $stmt->fetch(); 

// INSERT INTO users (id , usr , pwd) VALUES (? , ? , ?) 
$insertStatement = $app->database->insert(array('id', 'usr', 'pwd')) 
         ->into('users') 
         ->values(array(1234, 'your_username', 'your_password')); 

$insertId = $insertStatement->execute(false);