PHP多请求连接


PHP Multiple Require Connections

我四处看了看,但找不到答案。

如果我正在创建一个类,我需要查询MySQL的不同功能的类,是否有一种方法来要求一个conn.php文件只一次用于所有的功能?

到目前为止,我在每个函数中都需要一个连接文件,但是在整个类中多次要求连接似乎资源昂贵。

…编辑……就像这样?

private $conn;
function __construct() {
$this->conn = new mysqli("", "", "", "");
}
function insert() {
    $sql = "";
    $query = $this->conn->prepare($sql);
    $query->bind_param();
    $query->execute();
    $query->free_result();
    $query->close();
}
function update() {
   $sql = "";
   $query = $this->conn->prepare($sql);
   $query->bind_param();
   $query->execute();
   $query->free_result();
   $query->close();
}

这个工作得很好。这有什么缺点吗?有没有更专业的方法?

您可以在类的构造函数中设置到MySQL的连接,并将连接分配给成员变量,如下所示:

private $oConnection = null;
public function __construct() {        
    $this->oConnection = mysqli_connect("12.34.56.789", "db_username", "db_password");
}

则可以在该类的任何其他函数中使用该成员变量。例如:

public getDataResult() {
    $sSql = 'select * from my_table limit 10';
    $oResult = @mysqli_query($this->oConnection, $sSql);
    return $oResult;
}

尽量避免在代码中使用全局变量,特别是当它们引用了您不希望整个程序访问的潜在危险值(特别是数据库连接)时。

也就是说,您可以使用一个简单的数据库类来解决这个问题,就像@mynx建议的那样,或者使用依赖注入并将数据库变量作为参数传递给您的各个函数,如果您想采用过程方法的话。无论哪一种方法(面向对象或过程)都能帮助你更容易地管理代码,而不是声明全局变量,如果你不小心,全局变量可能会导致整个代码混乱。

既然你似乎要走向面向对象的方向,你可以结合@mynx的答案,然后将实例化的数据库类作为依赖传递给可能需要访问数据库的其他类,这是创建可维护和可调试代码的好方法。

try this

class mydb{
private $true = false;
function __construct($host,$dbname,$user,$password){
$this->true = mysqli_connect($host,$buser,$password,$dbname);
}

function queries($query){
if($this->true){
if(preg_match('/(UPDATE|DELETE FROM|INSERT INTO|DROP TABLE|CREATE TABLE|ALTER TABLE)/',$query)){
if($rv = mysqli_query($this->true,$query))
return true;
}elseif(preg_match('/(update|delete from|insert into|drop table|create table|alter table)/',$query)){
if($rv = mysqli_query($this->true,$query))
return true;
}else{
if($results = mysqli_query($this->true,$query)){

$result = array();
while($obj = mysqli_fetch_object($results))

$result[] = $obj;
return $result;
}
}
}
}
$mydb = new mydb($database_host,$database_name,$database_user,$database_password);
 call the query
$result = $mydb->queries($sql);

在其他函数使$mybd全局示例

function ,,,,,,.....(){

global $mydb;

}

如果您的数据库连接存在于全局作用域中,那么您只需在每个函数中声明它为全局。

$db = mysqli_connect(...);
function getData(){
    global $db;
    $sql = 'SELECT * FROM table';
    $result = mysqli_query($db, $sql);
    return $result;
}

如果你的函数都是基于类的,正如你提到的'__construct()'听起来就像它们,那么@mynx的答案就是你的解决方案。