2014-02-07 49 views
0

所以我有一个我在web应用中使用的函数列表。然而,大多数函数调用数据库类。这里有两个功能,例如:为多个函数声明一个全局对象

function add_post($userid,$body,$cat_id,$user_link){   //This function inserts new posts into the db 

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 
$now = date("Y-m-d H:i:s"); 

$insertData = array(
    'user_id' => $userid, 
    'body' => $body, 
    'stamp' => $now, 
    'cat_id' => $cat_id, 
    'link' => $user_link 
    ); 

$db->insert('posts', $insertData); 

} 



function grab_username($userid){     //This function takes a user id, and returns the associated user_name 

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 

$params = array($userid); 
$results = $db->rawQuery("SELECT username FROM users WHERE id = ?", $params); 

//print_r($results); 

foreach($results as $arrays){ 

    foreach($arrays as $name){ 
     return $name; 
    } 
    } 

} 

的问题是,我经常写行:

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 

有没有一种方法,我可以在全球声明变量,有更多的东西是这样的:

$db = new MysqliDb('localhost', 'root', 'root', 'my_db'); 

function add_post($userid,$body,$cat_id,$user_link){   //This function inserts new posts into the db 

$now = date("Y-m-d H:i:s"); 

$insertData = array(
    'user_id' => $userid, 
    'body' => $body, 
    'stamp' => $now, 
    'cat_id' => $cat_id, 
    'link' => $user_link 
    ); 

    global $db->insert('posts', $insertData); 

} 

回答

0

有多种方式可以解决这个问题,但是最好的实现可以根据您的动作应用程序的结构和需求而变化。

你提到一个全局变量,它会工作,但通常被认为是结构不佳:

someFunction(){ 
    global $db; 
    $db->insert('posts', $insertData); 
} 

另一种方法,这是稍微干净,但仍然没有得到很好的组织是传递$db连接功能:

function myFunction($db, ...){ 
    $db->query(// etc); 
} 
myFunction($db); 

一个更好的版本,这将是组织中的一类的相关功能,然后注入数据库:

class Posts { 
    public function listPosts($db, ...){ 
    $db->query(// etc); 
    } 
    public function getPost($db, ...){ 
    $db->query(// etc); 
    } 
} 

$posts = new Posts(); 
$posts->listPosts(); 

但是,您也可以决定制作这些static方法,您可以将$db传递给类构造函数并存储它,这里有很多选择。

你也可以创建一个你自己的中心包装类来返回连接。有一百万个实现,但如果不知道更多关于应用程序结构的信息,您的类如何共享资源以及应用程序如何自动引导所有内容(如果有),就很难专门推荐一个。等

+0

我希望你是不严肃的。为每个类创建一个单独的数据库连接? –

+0

如果他只使用这个类的单个实例,就像我个人解释他的问题一样,这样可以。如果他使用多个实例,那么明显的依赖注入或获取单个数据库实例的一些中心方法会更好。 – helion3

+0

这不是他的应用程序中唯一的类。 –

-1

试试这个:

db.php中

class DB 
{ 

    public $conn; 
    private static $instance; 

    private function __construct() 
    { 
    $server = 'localhost'; 
    $user = 'root'; 
    $pass = 'root'; 
    $database = 'my_db'; 

    $this->conn = mysqli_connect($server,$user,$pass,$database); 
    } 

    public function query($sql) 
    { 
    $result = mysqli_query($this->conn,$sql); 
    return $result; 

    } 

    public static function getInstance() 
    { 
    if (!isset(self::$instance)) 
    { 
     $object = __CLASS__; 
     self::$instance = new $object; 
    } 
    return self::$instance; 
    } 
} 

现在,在任何页面,你可以这样做:

require("db.php"); 
$dbh = DB::getInstance(); 
$sql = "your sql query .."; 
$dbh->query($sql);