2011-08-09 14 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,等...

希望帮助......再说,我不是专家。