如何解决Slim 4 Framework Dynamic PDO Connections 使用从 master 数据库获取的数据库连接信息
在有人说这个问题已经得到回答之前,请注意,虽然在容器中定义多个 pdo 连接已经解释了 here 和 here,但我的问题更多地是关于构建的最佳方法来自从主数据库获取的 json 对象的动态 pdo 连接。
我使用以下 Database 类创建我需要的任何数据库连接,无论何时何地都需要它们。
class Database {
private static $dbs = array();
# we declare as static so the state is kept between function calls to connect
# this allows to connect just once to the database and then just return the connection
# on future function calls
private static $conn = null;
# now since we dont want to reinstiate the class anytime we need it,lets also set the constructor to private
private function __construct(){}
# get the database connection
public static function connect( $name,$opt,$struct,$key = null ) {
if( empty( self::$dbs[$name] ) ) {
try {
$struct['username'] = ( null === $key ) ? $struct['username'] : Security::XORDecrypt( $struct['username'],$key );
$struct['password'] = ( null === $key ) ? $struct['password'] : Security::XORDecrypt( $struct['password'],$key );
switch( $struct['type'] ) {
case 'sqlsrv': # MSSQL
self::$conn = new PDO( "sqlsrv:server=" . $struct['hostname'] . ";" . "ConnectionPooling=1;" . "database=" . $struct['database'],$struct['username'],$struct['password'],array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::SQLSRV_ATTR_QUERY_TIMEOUT => intval( $struct['timeout'],10 ) ) );
break;
}
self::$dbs[$name] = self::$conn;
return self::$conn;
}
catch( PDOException $ex ) {
if( $opt == 1 )
echo "<p class='bg-danger'>Connection error: " . $ex->getMessage() . "</p>";
else
die( json_encode( array( 'outcome' => false,'message' => 'Unable to connect' ) ) );
}
}
return self::$dbs[$name];
}
public static function disconnect( $name ) {
if( self::$dbs[$name] != NULL ) {
self::$dbs[$name] = NULL;
}
}
}
每当我需要连接到数据库时,它都是这样完成的
$pre = '_' . $app_id; $$pre = '';
$conn = Database::connect( $pre,$env['options']['env'],$apps['db_conns'][$app_id],$i_key );
在上面:
$app_id
:存储正在请求数据的应用程序实例的 id
$env['options']['env']
:存储我们正在运行的环境、开发/生产等。
$apps['db_conns'][$app_id]
:是一个多关联数组,用于存储每个数据库的数据库连接详细信息(用户名/密码/端口)等
$i_key
:存储用于加密连接详细信息的哈希值(从另一个进程获取)
然后将 $conn
传递给执行请求的数据库操作的类。当不再需要连接时,我使用
Database::disconnect( $pre );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。