gpt4 book ai didi

php - 推送/弹出当前数据库

转载 作者:行者123 更新时间:2023-11-29 04:29:03 27 4
gpt4 key购买 nike

我有一个简单的 PHP/MySql 应用程序,它通常会选择几个数据库之一(假设每个客户一个)进行操作。但是,经常调用访问公共(public)数据库的实用程序函数。

我不想在我的代码中散布 USE 子句,所以看起来我应该在每个实用程序函数的开头推送当前数据库并在结尾再次弹出它。像这样的事情(从我的头顶开始,所以很可能行不通,但会给出一个想法)。

function ConnectToDatabase($db)
{
global $current_database;
$current_database = $db;
odb_exec('USE ' . $db); // etc. Error handling omitted for clarity
}

function UtilityFunction()
{
odb_exec('USE common_db'); // etc. Error handling omitted for clarity
// do some work here
global $current_database;
ConnectToDatabase($current_database);
}

也许我可以通过组合 global $current_database; 让它更漂亮; ConnectToDatabase($current_database);PopCurrentDb 函数中,但你明白了。

这在 PHP 中做得更好吗?是否有 MySql 解决方案(但后来我想成为 ODBC 兼容的,所以也许 PHP 更好)。别人是怎么做到的?


更新:最后我决定始终完全限定访问权限,
例如从 $ 数据库中选择 *。 '.' . $表

最佳答案

您为什么不创建某种数据库管理器类并将其推广?将所有数据库名称/连接存储集中在一个实体中。这样你就有了一个清晰的 api 来访问它,你可以通过名称使用数据库。

class MultiDb
{

/*
* Array of PDO DB objects or PDO DSN strings indexed by a connection/dbname name
*
* @var array
*/
protected $connections = array();

/*
* The connection name currently in use
* @var string
*/
protected $currentConnection;

/*
* The Defualt connection name
*
* @var string
*/
protected $defaultConncetion;

/*
* @param array $connections Any array DSN or PDO objects
*/
public function __construct(array $connections);

public function getConnection($name);

// i would set this up to intelligently return registered connections
// if the argument matches one
public function __get($name)

// same with __set as with __get
public function __set($name, $value);

// proxy to the current connection automagically
// if current isnt set yet then use default so things
// running through this would actually result in
// call_user_func_array(array(PDO $object, $method), $args);

public function __call($method, $args);

}

所以用法可能看起来像

// at the beginning of the app

$db = new MultiDb(array(
'util' => array('mysql:host=localhost;dbname=util;', 'user', 'pass');
'default' => array('odbc:DSN=MYDSN;UID=user;PWD=pass;');
));


// some where else in the app we want to get some ids of some entities and then
// we want to delete the associated logs in our shared utility DB

// fetch the ids from the default db

$ids = $db->default->query('SELECT c.name, c.id FROM some_table c')
->fetchAll(PDO::FETCH_KEY_PAIR);

// assume we have written a method
// to help us create WHERE IN clauses and other things
$in = $db->createQueryPart($ids, MultiDb::Q_WHERE_IN);

// prepare our delete from the utility DB
$stmt = $db->util->prepare(
'DELETE FROM log_table WHERE id IN('.$in['placeholder'].')',
$in['params']
);

// execute our deletion
$stmt->execute();

关于php - 推送/弹出当前数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com