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文件,在里面写上:
放在根目录下(即127.0.0.1的目录下)即可。
我的电脑的显示:
老师的电脑显示(老师是自己装的mysql):
上面的写法与下面这种一样:
只是把$dsn通过链接的方式链接进来了而已,如下:
3、通过配置文件来连接数据库:
第三种不是很好用,要修改配置文件,并且这样就写死了,所以不好用就不写了。
PDO的方法:请对应这张表好好用一下功能。
通过query和prepare都能返回PDOStatement对象,返回对象后处理的方法如下:
PDOStatement类中的全部成员方法如下所示:
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连接数据库时间慢挺多。如果是数据插入数据库,是差不多的。