PDO - 数据抽象层

 PDO - 数据抽象层
 PDO:PHP DATA OBJECT(数据访问抽象层,统一各种数据访问的接口)
1、编码一致性
2、灵活性
3、高效能
4、面向对象特性

PDO的配置与启用:
1、配置php配置文件,开启相应拓展:
开启:extension=php_pdo.dll,就是把前面的封号去掉就可以了。
    请注意,我用的是xampp,可能是因为某些原因,在php.ini中找不到extension=php_pdo.dll这个文件,包括我的xampp开启的时候,也是不需要开启php它就会默认开启的。这个我之后再了解哦。

2、开启相应数据库的拓展(以MySQL为例)
extension=php_pdo_mysql.php,把前面的封号去掉即可。

 

3、通过phpinfo()来查看pdo拓展的详细信息,
创建phpinfo.php文件,在里面写上:
<?php 
phpinfo();
?>
放在根目录下(即127.0.0.1的目录下)即可。 

我的电脑的显示:
 

 

老师的电脑显示(老师是自己装的mysql):
 
PDO连接数据库的方式:
1、通过参数的形式连接。代码如下:(建议使用)


上面的写法与下面这种一样:

 

结果如下:

 

2、通过URL的连接方式
只是把$dsn通过链接的方式链接进来了而已,如下:

 



3、通过配置文件来连接数据库:
第三种不是很好用,要修改配置文件,并且这样就写死了,所以不好用就不写了。

 
PDO对象的方法

PDO的方法:请对应这张表好好用一下功能。 
 

 



通过query和prepare都能返回PDOStatement对象,返回对象后处理的方法如下:

PDOStatement类中的全部成员方法如下所示:
PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
PDOStatement::bindParam — 绑定一个参数到指定的变量名
PDOStatement::bindValue — 把一个值绑定到一个参数
PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
PDOStatement::columnCount — 返回结果集中的列数
PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
PDOStatement::execute — 执行一条预处理语句
PDOStatement::fetch — 从结果集中获取下一行
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
PDOStatement::getAttribute — 检索一个语句属性
PDOStatement::getColumnMeta — 返回结果集中一列的元数据
PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
PDOStatement::setAttribute — 设置一个语句属性
PDOStatement::setFetchMode — 为语句设置默认的获取模式。
 
rowCount:select返回的是查询到的结果数,对于insert、delete、update返回的是影响的行数。

exec对于select是不起作用的。
 采用PDO一次性向数据库插入3条数据,并获取条数和最后的ID号:
以下是$pdo->exec和$pdo->lastInsertId的用法: 

 

errorCode和errorInfo的使用方法,以下我们故意写错了数据表:

 

query方法的使用,也就是select的使用。exec方法对select无效:

 

预处理返回PDOStatement的时候,把里面的数据取出来,采用fetchAll方法,或者用fetch,然后再用while循环出来。

 


以下的例子是PDO中的rowCount的使用:
1.html部分的代码:

 

pdo_connect部分的代码:

 



那么在输入了正确的账号密码之后,就会返回值1,也就是返回了上一条sql语句影响的行数。

 


但是,这时候,你可以在账号里面输入' or 1=1 #,然后你会发现密码随便输入,能返回结果,也就是sql注入了,全部都可以查询了。

 

所以,接下来我们要介绍pdo->quote方法,这个方法能过滤用户输入的特殊字符,返回带引号的字符串。如下:

 


这时候你输出,会发现有特殊字符的多了反斜杠,并且最后的数字变成了零,也就是说查出来的是0条记录。
 

 

以上的方法不建议使用。
我们可以通过预处理语句防止sql注入。预处理语句有很多的好处,比如执行次数少,效率高。
预处理方式是先采用占位符的形式先进行预处理,然后再把参数传进去,以保证语句不被改变。如下

 

在这个例子中,?就是占位符,当然,占位符可以采用其他,不再详诉。然后我们在进行预处理之后,会返回一个PDOStatement的对象,这时候,我们在用execute方法,把参数穿进去执行就可以了。【能返回PDOStatement的有两种,一个是预处理,即$pdo->prepare(),这种采用占位符。另一个是直接执行语句,即$pdo->query($sql),这种直接执行。】


以下是bindParam,即绑定参数到指定的变量名的方法的使用。

 



以下是采用?占位符进行绑定参数(bindParam)。

 

以下是PDO中,bindValue,即把一个值绑定到一个参数的方法的使用。bindValue和bindParam的区别在于,bindParam只能绑定变量,而bindValue可以绑定变量和值。那你肯定会问,为什么不直接使用bindValue呢?因为处于效率的考虑。


以下是bindColumn的用法,即绑定一列到PHP变量。
 


返回的结果:把每一个auname和aupass都显示出来。

 


事务:把好几件事情一起处理,成功了就是一起成功,否则就是回滚到处理前的状态,保证数据的一致性和完整性。比如转账,应该是A多了100,B就少了100。必须是同时完成的,如果有一个不成功,就必须回滚。
当使用事务的时候,我们的存储引擎必须是INNODB的形式。当然,默认的好像也是innodb
PDO对象的方法(事务):
beginTransaction():启动一个事务。
commit():提交一个事务
rollBack():回滚一个事务
inTransaction():检测是否在一个事务内。

首先,try和catch指的是,要执行的代码放在try中,如果try中有任何一条执行错误,则直接跳到catch捕获并执行catch中的语句。
事务的例子如下:

 

当你发现没有回滚的时候,应该检查一下你的引擎是不是INNODB,

以下的代码是进行测试使用pdo和使用mysql连接数据库那个更快的。


测试结果PDO连接数据库时间慢挺多。如果是数据插入数据库,是差不多的。

 

转载于:https://www.cnblogs.com/windyet/articles/6667025.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值