前言
PHP
是一门古老而强大的语言,在早期,PHP
本身并没有连接MySql
的能力,PHP 2
才开始引进MySql
扩展,后来随着版本的迭代,逐步出现了mysqli
和PDO
。这也就带来了后来长久困扰着新手的问题,它们之间有什么区别,到底应该选择哪一个?
因此,在连接数据库之前,很有必要先理清它们之间的关系。
1. 比较
1.1 MySql扩展
MySql
扩展是从PHP 2
才开始引入的,是以第三方扩展的形式存在的。虽然解决了PHP
不能连接数据库的问题,但是,它本身也存在着很明显的缺点:
- 不支持预处理语句,容易受到
SQL
注入攻击,安全性差; - 不支持MySql新的功能和特性,如存储过程等。
基于这些原因,官方已经不推荐使用了,而且,MySql
扩展已经在PHP 5.5
中被废弃,并在PHP 7.0
中被移除,所以,该扩展现在已经不用再考虑了。
1.2 mysqli
基于对MySql
的强烈需求以及MySql
扩展明显缺陷,从PHP 5
开始,PHP
的核心团队对PHP
的扩展进行了重构和整合,mysqli
成为了PHP
核心的一部分,而不再是作为一个单独的扩展存在。
mysqli
有如下几个明显的优点:
MySql
扩展的改进版本,同时支持面向对象和面向过程两种方式;- 基本用法与
MySql
扩展相同,学习和老项目改造成本低; - 支持预处理语句,解决了
SQL
注入攻击的问题,安全性高; - 支持MySql新的功能和特性。
但是,mysqli
也有缺点,其中最重要的一个就是它仅适用于MySql
,如果还想支持sqlite
,pgsql
等数据库,mysqli
就爱莫能助了。
1.3 PDO
首先要说明的是,PDO
并不是mysqli
的替代品或者升级版,而是另一种选择。从PHP 5.1
开始,PDO
就已经是PHP
核心的一部分了,并且一直与mysqli
共存,其最大的优点就是支持多种数据库,并允许你在不更改PHP
代码的情况下更换数据库引擎。当然还有一些其它小的优点,如:
- 和
mysqli
相比,用法更加简洁,实现相同的功能,需要更少的代码; - 不像
mysqli
中面向对象与面向过程混杂,PDO
的面向对象接口更加一致和现代化,更利于扩展。
当然,不难想到,更多的封装与更好的扩展性必然伴随着性能的下降,实现相同的功能,PDO
理论上性能会略低于mysqli
,不过在当前这个时代背景下,这点性能差异完全可以忽略不计,更多的缺点还是语法上有较大的改变,对老项目的兼容性较差,改造成本较高。
至此,该怎么选,我想你心里应该有数了吧?通常情况下,考虑到兼容性,我们会两个扩展都启用,但在使用时,会根据实际情况选择,如果没有特别限制的话,还是尽可能选择PDO
吧!
2. 启用扩展
启用mysqli
和pdo_mysql
扩展方法很简单,只需要修改php.ini
配置文件即可。
2.1 修改php.ini
打开php.ini
文件,取消extension=mysqli
和extension=pdo_mysql
两处的注释,效果如下:
;extension=curl
;extension=ffi
;extension=ftp
;extension=fileinfo
;extension=gd
;extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=mbstring
;extension=exif ; Must be after mbstring as it depends on it
extension=mysqli
;extension=oci8_12c ; Use with Oracle Database 12c Instant Client
;extension=oci8_19 ; Use with Oracle Database 19 Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite
;extension=pgsql
;extension=shmop
然后检查一下extension_dir = "ext"
的注释是否已取消,如果没有,也需要取消,效果如下:
; Directory in which the loadable extensions (modules) reside.
; https://php.net/extension-dir
;extension_dir = "./"
; On windows:
extension_dir = "ext"
2.2 验证
调用phpinfo()
,启动Web服务,如果浏览器中出现下图,则说明配置成功了。
3. 连接数据库
连接数据库的前提是先安装MySql数据库,可以参考《开发日志(5):使用Docker快速部署MySql数据库》这篇文章,我这里就不做赘述了。
根据前面的介绍,我们不难想到,连接数据库有三种方式,分别是:
mysqli
面向过程连接mysqli
面向对象连接PDO
面向对象连接
3.1 mysqli面向过程连接
<?php
$hostname = "localhost"; //数据库服务器名称
$username = "root"; //MySQL用户名
$password = "123456"; //MySQL密码
// 连接数据库
$connect = mysqli_connect($hostname, $username, $password);
if (!$connect) {
die("数据库连接失败" . mysqli_connect_error());
} else {
echo "数据库连接成功!";
}
// 关闭连接
mysqli_close($connect);
面向过程的用法通常是为了兼容老项目,现在一般不这么用。
3.2 mysqli面向对象连接
$hostname = "localhost"; //数据库服务器名称
$username = "root"; //MySQL用户名
$password = "123456"; //MySQL密码
// 连接数据库
$connect = new mysqli($hostname, $username, $password);
if ($connect->connect_error) {
die("数据库连接失败" . $connect->connect_error);
} else {
echo "数据库连接成功!";
}
// 关闭连接
$connect->close();
不难看出,调用过程和面向过程几乎一样,只是把函数改成了对象,因此,mysqli
从面向过程改成面向对象相对而言比较容易。
3.3 PDO面向对象连接
<?php
$dbms = 'mysql'; //数据库类型
$hostname = "localhost"; //数据库服务器名称
$username = "root"; //MySQL用户名
$password = "123456"; //MySQL密码
$dsn = "$dbms:host=$hostname;";
try {
$db = new PDO($dsn, $username, $password); //初始化一个PDO对象
echo "数据库连接成功!";
$db = null;
} catch (PDOException $e) {
die("数据库连接失败:" . $e->getMessage());
}
用法与mysqli
完全不同,而且这里连接用完也不需要手动关闭,设置为null
,是为了明确告诉PHP
可以回收了。
结语
到这里,PHP
项目已经可以连上MySql
数据库了,接下来就可以尝试用PHP
做一些具体的数据库操作了!
评论0
暂时没有评论