最近再做一些小的项目,又用到了php+mysql数据库,偷懒复制老代码到服务器上执行,发现提示警报说建议使用mysqlli或pdo方式连接数据库,趁着最近在家办公,花时间了解一下这两个数据引擎
PDO是什么呢?
通俗说就是别人写的一个“数据库操作工具类”,它非常强大,可以应对市面上几乎所有主流数据库,
具体应用时候有这样一个关系:
即,要操作某种数据,就得去“打开”对应的pdo引擎。
在php.ini的配置文件中,无非就是一个“模块”而已,我们只需要把分号删掉就表示开启!如下:
改为
使用pdo连接mysql数据库
- $dsn = “mysql:host=服务器地址/名称;port=端口号;dbname=数据库名”;
- $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names 连接编码’);
- $pdo = new pdo($dsn, “用户名”, “密码”, $opt);
可见,返回的是一个pdo对象,
pdo对象的使用(常见方法)
$result = $pdo->query(“返回结果集的sql语句”);
结果:
成功:就是一个pdo结果集对象(见后续);
失败:false;
$result = $pdo->exec(“增删改的sql语句”);
结果: true(表示成功),false(表示失败);
$pdo = null; //销毁该对象;
其他操作
- $pdo->lastInsertId();
获取最后添加的id值
- $pdo->beginTransaction();:
开启一个事务
- $pdo->commit()
提交一个事务
- $pdo->rollBack();
回滚一个事务;
- $pdo->inTransaction();
判断当前行是否在事务中,返回true/false
- $pdo->setAttribute(属性名,属性值);
设置pdo对象的属性值;
举例:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
pdo的错误处理
静默模式
默认情况下,pdo采用“静默模式”处理错误:
就是发生了错误后,并不提示,而只是返回false。我们需要在程序中去判断返回是否为fale,然后,如果是false,再去“主动”获取错误信息。——跟mysql一样!
对比mysql:
$sql = “updateeeee tab set name = ‘abc’; ”;
$result = mysql_query($sql); //这里,执行该sql语句,肯定出错
if( $result === false){
echo “发生错误:” . mysql_error();
}
else{……}
则对pdo来说,大致如此:
$sql = “updateeeee tab set name = ‘abc’ ; ”;
$result = $pdo->exec ($sql); //这里,执行该sql语句,肯定出错
if( $result === false){
echo “发生错误:” . $pdo->errorInfo(); //这里只是示意;
//实际情况是:$pdo->errorInfo()返回的是一个“数组”,其中的下标为3的项,才是错误提示内容
}
else{……}
异常模式
可以简单理解为:适应面向对象语法的处理错误的一种语法结构。如下所示:
try{
在这里,可以执行“可能出错”的语句(多条也可以);
一旦发生错误,就会终止当前范围的后续程序执行,
而立即跳转到catch部分——处理错误!
}
catch( Exception $e ){
//一旦发生错误,就会进入这里,此时,并会生成一个“错误对象”;
//该错误对象,就是系统类Exception的一个实例:它包含了错误信息。
}
pdo要使用异常模式,就得专门设置(因为其默认是静默模式):
pdo的结果集对象(PDOStatement)
pdo的结果集对象从哪里来?
来自pdo对象执行“返回数据集的sql语句”并成功的时候,得到的就是pdo的结果集对象。
$stmt = $pdo->query(“select ….. “); //如果执行成功,则$stmt就是pdo的结果集对象
pdo结果集对象的常用方法
- $stmt = $pdo->query(“select …… ”);//这是获得结果集
- $stmt->rowCount() ; //得到结果集的行数
- $stmt->columnCount() ; //得到结果集的列数
- $stmt->fetch( [返回类型] ); //从结果集中取出“一行”数据;
取出的结果,由其中的“返回类型”来决定,常用的有:
PDO::FETCH_ASSOC:表示关联数组
PDO::FETCH_NUM:表示索引数组
PDO::FETCH_BOTH:表示前二者皆有,这是默认值
PDO::FETCH_OBJ:表示对象
- $stmt->fetchAll([返回类型]);一次性获取结果集中的所有数据,返回的是一个二维数组
- $stmt->fetchColumn( [$i] );获取结果集中的“下一行”数据的第$i个字段的值,结果是一个“标量数据”
- $stmt->fetchObject();
- $stmt->errorCode();:pdo结果集的错误代号
- $stmt->errorInfo(); pdo结果集的错误信息(是一个数组)
- $stmt->closeCursor(); 关闭结果集(相当于mysql_close() )
pdo中的预处理语法
什么叫预处理语法
就是,为了“重复执行”多条结构类似的sql语句,而将该sql语句的形式“进行预先处理”(编译);
该sql语句的“形式”中,含有“未给定的数据项”。
然后,到正式执行的时候,只要给定相应的形式上的“数据项”,就可以更快速方便执行。
比如(有两种预定义语法):
语法1:
$sql = “select * from tab where id = ? “; //这里这个“?”就是未给定的数据项;这里通常叫做“占位符”
//也可以是多个问好。
语法2:
$sql = “select * from tab where id = :v1 and name = :v2 “; //这里这个“:v1”和 “:v2” 就是未给定的数据项;通常这里叫做“命名参数”;
怎么使用?
分3步:
1,对含预处理语法的sql语句进行“预处理”:
$stmt = $pdo->prepare( $sql ); //
2, 对上述预处理的结果对象($stmt)的未赋值数据,进行赋值:
$stmt->bindValue( 数据项1, 值1);
$stmt->bindValue( 数据项2, 值2);
。。。。。。
3, 执行;
$stmt->execute();
这样之后,该sql语句就算正式完成!
pdo的好处是,以后如果更换了服务器平台例如更换数据库,只需要把pdo的链接口改一下,其它的东西都不用动的,这个算不算一劳永逸的最大优点!
更多资料:
PHP pdo连接
PHP pdo数据库
PHP的MySQL扩展(优缺点)
设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程 的接口;
并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数 ;
据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。
PHP的mysqli扩展
mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性;
mysqli扩展在PHP 5及以后版本中包含;
mysqli扩展有一系列的优势,相对于mysql扩展的提升主要有:面向对象接口、 prepared语句支持、多语句执行支持、事务支持、增强的调试能力、嵌入式服务支持。
PHP数据对象(PDO)
PHP数据对象,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以,使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器。
下面是几种数据库连接的方式:
Mysql连接:
Mysqli连接:
<?php
$conn = mysqli_connect(‘localhost’, ‘root’, ”, ‘bbs’);
if(!$conn){
die(“数据库连接错误” . mysqli_connect_error());
}else{
echo”数据库连接成功”;
}
?>
Pdo连接:
<?php
try{
$pdo=new
pdo(“mysql:host=localhost;dbname=bbs”,”root”,””);
}catch(PDDException $e){
echo”数据库连接错误”;
}
echo”数据库连接成功”;
?>
以下是 Mysql、Mysqli、Pdo三种方式的区别对比
****************************************************************************************************
PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,
提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性。
而 PDO (PHP Data Object) 则是提供了一个 Abstraction Layer 来操作资料库
1.mysql与mysqli
mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快.当然也更安全
mysql是非持继连接函数而mysqli是永远连接函数。也就是说
mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销 有些朋友在编程的时候,使用new mysqli(‘localhost’, usenamer’, ‘password’, ‘databasename’);总是报
错,Fatal error: Class ‘mysqli’ not found in d:\…
mysqli类不是php自带的吗?
不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。
一:Mysqli.dll是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易.
<?php
mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($dn_name);
$result = mysql_query(“SELECT `name` FROM `users` WHERE `location` = ‘$location'”);
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
echo
$row[‘name’];
}
mysql_free_result($result);
?>
其实背后有些学问… 这种方式不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string()来解决这个问题,不过这麽一搞,整个叙述会变得複杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…
在 PHP-MySQLi 中有了不少进步,除了透过 Bind Column 来解决上述问题,而且也多援 Transaction, Multi Query ,
并且同时提供了 Object oriented style (下面这段 PHP-MySQLi 范例的写法) 和 Procedural style
<?php
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
$sql = “INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)”;
$stmt = $mysqli->prepare($sql);
$stmt->bind_param(‘dsss’, $source_id, $source_name, $source_gender, $source_location);
$stmt->execute();
$stmt->bind_result($id, $name, $gender, $location);
while ($stmt->fetch()) {
echo $id . $name . $gender . $location;
}
$stmt->close();
$mysqli->close();
?>
但看到这边又发现了一些缺点,例如得 Bind Result,这个就有点多馀,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(Abstraction)的方法,所以当后端更换资料库的时候,就是痛苦的开始… 于是 PDO 就出现了
2.PDO与mysql
PDO是PHP5.1之后才支持的,他为访问数据库采用了一致性的接口。但是国内众多的开源程序都是
使用MySQL的extension所提供的function连接数据库,进行查询。PDO功能强大为何国内成熟的PHP系统都不使用呢?
问过几个朋友为啥用PDO,答案是“快”,PDO连接数据库会快么?为什么使用PDO?他们两种方式有什么区别?首先还是比较关心的性能问题.写了1个脚本测试向MySQL插入100万条数据。
USE MySQL extension: 95.233189106s
USE PDO : 99.1193888187s
在链接MySQL上几乎没有区别。PDO的性能损失完全可以忽略不计。
但是却有非常多的操作却是MySQL扩展库所不具备的:
1:PDO真正的以底层实现的统一接口数库操作接口
2:PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3:PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级.
PHP6默认也是使用PDO进行数据库链接,MySQL Extension会作为辅助。所以我们在日常项目中,如果环境允许,尽可能去使用PDO来进行MySQL数据库操作.
评论
评论已关闭!