工欲善其事必先利其器,好吧,说人话,先做前期的准备工作
第一步,做测试我们都要打印数组,对象等等,可是php自带的print_r,var_dump显示起来不好看
这看了都头疼,自己写一个打印函数,获取待打印的数据的类型 gettype (),别什么都var_dump;
测试一下,哦还不错,数组的结构清楚了.不得不说一句pre标签真的好用.顺便说下,打印string,integer类型的时候用echo而不用print,因为print有返回值(值为1),而echo没有,简而言之,快点
第二步,注册异常处理函数 set_exception_handler (),php自带的异常报错看起来真的不咋的,这颜色真的不舒服
我们自己写一个
结果如下
凑合着用吧
PDO的优点就不过介绍了,正式开工
PDO与数据库交互=>建立一个服务器连接并选择一个数据库,PDO通过构造函数完成
具体参数如下
那么开始,我的数据,库主机127.0.0.1,数据库app_ylts,用户名root,密码空.我的数据库采用utf8编码,下面是bs_node表中部分数据
开始连接数据库并且设置PDO的报错模式.
很多属性可以调整pdo的行为(具体参数有兴趣的朋友可以去查查),获取属性 getAttribute() ,设置属性 setAttribute()
这里说明一下为什么采取PDO::ERRMODE_EXCEPTION报错模式,因为PDO抛出的异常类PDOException继承的所有异常的基类Exception,而我们开始准备时注册了异常报错函数myException,方便我们查看以及记录错误(这功能没写),这也是我们一开始注册了异常报错函数的原因,一举两得.
下面查询(执行有结果集或者结果所影响的行数无关紧要时用 query() ,执行不返回结果集[insert,update,delete等]用 exec () 返回所影响的行数)
大功告成,截图
等等,不对啊,中文乱码,还返回了数组的 索引 ,明显不是我们想要的
先解决中文乱码的问题
$connect ->exec(‘SET NAMES utf8’);
乱码解决,PDO查询默认的返回结果集(我们查询的返回值$node_list是一个对象).在调用fetchAll()方法=>默认的话是返回既按列名索引又按在行中的数值偏移索引的值数组,如上图.这不是我们想要的,我们只需要返回列名索引的值数组,那么在调用 fetchAll() 方法时带参数[ PDO::FETCH_ASSOC] fetchAll()返回所有的结果集行(二维数组);fetch()结果集的下一行(一维数组),如果到末尾则 false
my_print($node_list->fetchAll(PDO::FETCH_ASSOC));
这里有引发了一个问题,我们不可能每次都这样带个参数吧?,其实在连接数据库是就可以通过参数 $driver_options (数组的形式)调整PDO的行为
fetch用法
对比fetchAll,清晰明了
PDO准备语句
每次发送查询给mysql服务器时,都必须解析该查询的语法,确保结构正确并且能够正确执行.我们大量数据的插入时,反复执行相同的查询.准备语句能在服务器上缓存查询的语法和执行过程,而服务器和客户端之间传输有变化的列值,以此来消除额外的开销
不使用prepare
使用prepare
结果
使用prepare还要慢点,你这是在逗我?
革命尚未成功,我在多测试几次.不对,测试的方法有问题,不可控因素太多;改变测试方法
数据
不使用prepare
使用prepare
数剧因为显示原因,没有贴出来完全.最后测试(多次测试取平均值),当插入数据越来越多的时候prepare的优势就会越来越明显,
现在正在考虑封装自己的数据操作类,以及实现连贯操作比如 Db::getInstance()->where($where)->orderBy($orderBy)->select() ,这种形式,可能下一篇会写,下周见!