如何将打开的数据库连接传递给php中的每个函数

时间:2014-02-23 13:39:14

标签: php mysql

我有一个单独的配置文件来设置db参数。

<?php
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "aa");
?>

当用户输入用户名和密码时,我打开数据库连接并在另一个php文件中验证用户。

<?php
include("config.php");
include("database.php");
$dbo = database::getInstance();
$result=$dbo->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME);
if($result){
$un = $_POST['username'];
$pw=$_POST['password'];
$dbo->validte_User_Login($un,$pw);
}
else
print "false";?>

接下来我想在另一个php文件中对数据库进行一些操作。在这里我如何在不包含配置文件的情况下再次设置已经打开的数据库连接,并通过再次传递参数来调用connect方法?

我的数据库连接功能如下。

function connect($host, $user, $pass, $dbName)
 {
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->dbName = $dbName;

$db_handle = mysql_connect($this->host, $this->user,$this->pass);
$db_found = mysql_select_db($this->dbName, $db_handle);

if ($db_found) {
print "Database Found<br/>";
return true;                                 
}
else
print "Database  not Found<br/>";
return false;
}

1 个答案:

答案 0 :(得分:1)

我认为您的代码目前存在2个缺陷:

  1. 不要在新代码中使用mysql_*个函数 - 它们是deprecated。有关详细信息,请参阅this answer

  2. 您可以混合使用功能和面向对象的代码。使用数据库时,调用::getInstance()意味着我得到了一个有效的实例 - 如果一个旁观者已经连接了,他们应该怎么知道,更重要的是他为什么要关心。

  3. 两者都可以很快解决,让我们来看看这个getInstance()方法:

    class database {
    
        private $instance = NULL;
    
        public static function getInstance() {
            if (self::$instance === NULL) {
                include 'config.php';
                self::$instance = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
            }
    
            return self::$instance;
        }
    
        //etc.
    
    }
    

    现在,您可以在代码

    中使用任何地方这样的代码
    $db = database::getInstance();
    $result = $db->query("...");
    while ($row = $result->fetch_array()) {
    
    }
    

    因为实例已经连接,如果您有多次调用getInstance(),它只会连接一次。

    当然,这只显示了一些可以在某些方面进行改进的片段,例如:加载数据库数据或处理错误时。