2011-08-09 16 views
1

所以我想要替換我的全局變量,我堅持如何讓這個通過。使這個執行沒有全局的pdo對象

我的代碼的一個小例子:

# index.php: 

include "dbc.php"; 
echo cName(1); 

# dbc.php: 

try{ 
$connect = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF8", DB_USER, DB_PASS, $driver_options); 
} 
catch(PDOException $pe) 
{ 
    die('Could connect to the database because: ' .$pe->getMessage()); 
} 
function cName($cID){ 
global $connect; 
$sql = $connect->prepare("SELECT name FROM cocos WHERE id=:id"); 
$sql->bindValue(":id", $cID); 
$sql->execute(); 
$sql = $sql->fetch(); 
return $sql["name"]; 
} 

正如你可以看到我做全球$功能CNAME()內連接。我對所有其他功能都做到了,看起來非常糟糕。

我不能做任何事情沒有它?它說未定義的函數,如果我沒有全局變量。

我知道我可以添加一個參數,CNAME($連接,1)

不過這對我來說,看起來像其他的馬虎。由於我有很多功能,我總是需要爲此連接添加一個額外的參數。

那麼我能做些什麼,沒有額外的參數或全局變量?

我想也許你可以做一個函數/類/對象來處理所有的數據庫通信,但我不知道從哪裏開始以及應該如何完成?

類似於:

dbQuery($ query);

但是再次,你不能指定bindValue(),在某些情況下,你需要綁定多於一個值比上面的例子。

真的希望這個解決方案的,由於在前進

請問意見,如果問題

+0

據我所知,沒有避免它。 – JMichelB

回答

0

怎麼樣使用哪個返回PDO的實例的靜態方法?它需要一行,與全球$連接相同,如果你將使用multiton而不是singleton,你可以選擇你想要的數據庫。

2

我將序言說我最好平均在PHP ....這就是說:

class Database 
{ 
    public $dbh; // handle of the db connexion 
    private static $dsn = 'mysql:host=localhost;dbname=DBNAME HERE'; 
    private static $user = 'DBUSERNAME HERE'; 
    private static $pass = 'PASSWORD HERE'; 


    public function factory() { 
     return $dbh = new PDO(self::$dsn,self::$user,self::$pass); 
    } 
} // end of Database Class 

然後在你的函數中,調用facotry()實例。

function cName($cID) 
{ 

    // call Database::factory, gives you access to methods and properties 
    $db= Database::factory(); 

    $sql = $db->prepare("SELECT first_name FROM users WHERE id=:id"); 
    $sql->bindValue(":id", $cID); 
    $sql->execute(); 
    $sql = $sql->fetch(); 

    // return the values 
    return $sql["first_name"]; 

} // end of cName function 

你可以擴展數據庫類,如果你想變得更加模塊化,更容易conifg,等...

希望幫助......再說,我不是專家。