查询构造器的底层,用的是PHP数据库抽象层的PDO扩展。
为什么使用PDO?
PHP有两大类操作数据库的扩展,一类是专用扩展mysql、sqlite3等,一类是抽象层,如PDO等。
专用扩展如下(mysql为例):
$link = mysqli_connect("localhost","user","pwd","mydb");//固定为mysql数据库
$sql = "insert into users(name,pass) values('xiaoming','123456')";
mysqli_query($link,$sql); //一次性数据设定和编译
PDO如下
// dsn(data source name) mysql 或者 sqlite3 或者其他数据库 以mysql为例
$dsn = "mysql:host=localhost;dbname=mydb";
$pdo = new PDO($dsn,"user","pwd"); //不同数据库不同参数,后边操作一样
$sql = "insert into users(name,pass) values(:name,:pass)";
$pdo->prepare($sql); //预编译
$pdo->execute(['name'=>'xiaoming','pass'=>'123456']);//数据添加
数据库专用扩展和抽象层的区别,选择抽象层的好处?
1,单一接口 vs 统一接口
专用扩展只是针对一种数据库开发的,当更改数据库时,就要重新安装相应数据库扩展,也需要对代码重构。
而抽象层针对多种数据库提供统一接口,当更改数据库时,代码部分只需要修改少许链接配置(dsn)
2, sql注入 vs 避免sql注入
专用扩展是一次性完成sql语句、编译和数据添加,所以容易受到sql注入。
而PDO将sql语句的编译和数据添加分离,避免sql注入。
3,效率
由于第2点提到的预编译特点,sql命令预先编译,提高多次执行同一条操作命令时的速度。
$sql = "insert into users(name,pass) values(:name,:pass)";
$pdo->prepare($sql); //预编译
$pdo->execute(['name'=>'xiaoming','pass'=>'111111']);//数据添加
$pdo->execute(['name'=>'xiaohong','pass'=>'222222']);//数据添加
...