PHP中安全传递数据库连接$conn至库函数的替代方案咨询
数据库连接安全传递方案咨询
我有一个连接数据库的PHP脚本,它会调用library.php文件中的预定义函数。
Script.php 代码示例:
... require("library.php"); $conn=pg_connect(.....); $_SESSION['conn']=$conn; $ret_json=get_this_or_that($json_query); .....
library.php 文件示例:
.... function get_this_or_that ($json_query) { ... $conn =$_SESSION["conn"]; ######### $SQL="SELECT ...."; $result_set=pg_query($conn,$SQL); #more code return $json; } .... function (...
显然,使用SESSION变量或全局变量传递$conn并不安全。我不想通过get_this_or_that($conn,$json_query);这种方式在调用函数时传入$conn,请问还有哪些可行方案?需要找到将$conn对象传递给其他PHP例程的方法。
可行方案
1. 单例模式封装数据库连接
创建一个数据库连接类,通过单例模式确保全局仅存在一个连接实例,库函数可直接调用类的静态方法获取连接:
// db/Connection.php class DBConnection { private static $instance = null; private $conn; private function __construct() { $this->conn = pg_connect(.....); } public static function getInstance() { if (self::$instance === null) { self::$instance = new self(); } return self::$instance->conn; } }
在library.php的函数中调用:
function get_this_or_that ($json_query) { $conn = DBConnection::getInstance(); $SQL="SELECT ...."; $result_set=pg_query($conn,$SQL); // 后续业务代码 return $json; }
2. 简单依赖注入容器
实现一个轻量容器类存储连接实例,库函数从容器中直接获取:
// Container.php class Container { private static $services = []; public static function set($key, $value) { self::$services[$key] = $value; } public static function get($key) { return self::$services[$key] ?? null; } }
在Script.php中初始化并存入连接:
require("library.php"); require("Container.php"); $conn=pg_connect(.....); Container::set('db_conn', $conn); $ret_json=get_this_or_that($json_query);
在library.php中获取连接:
function get_this_or_that ($json_query) { $conn = Container::get('db_conn'); $SQL="SELECT ...."; $result_set=pg_query($conn,$SQL); // 后续业务代码 return $json; }
3. 类封装+构造函数注入
将library.php中的数据库操作函数封装成类,在实例化类时传入连接,类内部方法直接使用成员变量调用连接:
// library.php class DataHandler { private $conn; public function __construct($dbConn) { $this->conn = $dbConn; } public function get_this_or_that ($json_query) { $SQL="SELECT ...."; $result_set=pg_query($this->conn,$SQL); // 后续业务代码 return $json; } // 其他数据库操作方法 }
在Script.php中使用:
require("library.php"); $conn=pg_connect(.....); $dataHandler = new DataHandler($conn); $ret_json=$dataHandler->get_this_or_that($json_query);
内容的提问来源于stack exchange,提问作者Pablo Marques
相关产品推荐
相关产品推荐

