PHP连接数据库:使用类和函数两种方式

PHP连接数据库是非常常用的功能,在初学时,一般使用函数来连接。

$conn=mysqli_connect("localhost","username","password","DB_name");
if(!$conn){
        echo "连接数据库localhost失败,具体错误是:".mysqli_connect_error();
    }else{
        echo "连接数据库localhost成功。";
    }
mysqli_close($conn);

函数的方式非常简单,如果不需要报错信息的话,只有2行代码,加上报错信息,也只有6行而已。

我们尝试定义一个类来连接数据库,如下所示:

class Db{
    private $Db_host;
    private $Db_user;
    private $Db_pswd;
    private $Db_name;
    private $link;
    public function __construct($config=array())
    {
        $this->Db_host = $config["Db_host"];
        $this->Db_user = $config["Db_user"];
        $this->Db_pswd = $config["Db_pswd"];
        $this->Db_name = $config["Db_name"];
        $this->connectDb();
        $this->selectDb();
    }

    private function connectDb(){
        if(!$this->link = mysqli_connect($this->Db_host,$this->Db_user,$this->Db_pswd)){
            echo "连接数据库{$this->Db_host}失败,具体错误是:".mysqli_connect_error();
            die();
        }
    }
    private function selectDb(){
        if(!mysqli_select_db($this->link,$this->Db_name)){
            echo "选择{$this->Db_host}数据库失败,具体错误是:".mysqli_connect_error();
            die();
        }
    }
    public function __destruct()
    {
        mysqli_close($this->link);
    }
};
$arr=array(
    "Db_host" => "localhost",
    "Db_user" => "username",
    "Db_pswd" => "password",
    "Db_name" => "DB_name"
);
$obj= new Db($arr);

好家伙,直接变成了41行代码,而且概念也麻烦了很多,要定义类,定义成员属性,写构造函数,析构函数,成员方法......似乎并不实用。

如果只停留在“连接”数据库上,那么直接使用函数连接,速度最快。

如果完善一下Db类,将增删改查功能封装进去,那么功能性、代码可读性、可维护性都会提高非常多。

假设我们封装了“增删改查”的公共成员方法,分别是insert_query、delete_query、update_query、select_query,那么操作将是这样的。

include_once "class.php";
$arr=array(
    "Db_host" => "localhost",
    "Db_user" => "username",
    "Db_pswd" => "password",
    "Db_name" => "DB_name"
);
$obj= new Db($arr);
$obj->insert_query("INSERT INTO tablename(列名…) VALUES(列值)");
$obj->delete_query("DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]");
$obj->update_query("UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
[ORDER BY 子句] [LIMIT 子句]");
$obj->select_query("SELECT * FROM table_name");

不仅可读性强,而且每次操作数据库后,都会即时输出执行结果、写日志、卸载资源、关闭数据库,操作很规范,性能很节约。

如果用函数连接呢?

$conn=mysqli_connect("localhost","username","password","DB_name");
if(!$conn){
        echo "连接数据库localhost失败,具体错误是:".mysqli_connect_error();
    }else{
        echo "连接数据库localhost成功。";
    }
$conn_log=mysqli_connect("localhost","username","password","DB_name");// 日志数据库
if(!$conn_log){
        echo "连接数据库localhost失败,具体错误是:".mysqli_connect_error();
    }else{
        echo "连接数据库localhost成功。";
    }
mysqli_close($conn);
$result=mysqli_query($conn,"INSERT INTO tablename(列名…) VALUES(列值)");
echo $result;//输出结果
unset($result);//卸载变量
mysqli_query($conn_log,"INSERT INTO tablename(列名…) VALUES(列值)");//写日志

mysqli_close($conn);

对比可知,类的方式4行就做了4个任务,而没有使用类的话,4行才做了1个任务。

随着任务越来越多,使用了类的代码的优势会越发凸显——干净、快捷、可读、易用。