博客列表 >PHP PDO

PHP PDO

Lon
Lon原创
2021年10月25日 11:24:33707浏览

PHP PDO

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)

一、PDO连接

连接是通过创建 PDO 基类的实例而建立的。不管使用哪种驱动程序,都是用 PDO 类名。

1、连接到 MySQL

  1. <?php
  2. //1.实例化PDO类,创建PDO对象
  3. $pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
  4. ?>

2、处理连接错误

  1. <?php
  2. try{
  3. //1.实例化PDO类,创建PDO对象
  4. $pdo = new PDO('mysql:host=localhost;dbname=test','root','123456');
  5. // 在此使用连接
  6. ...
  7. // 现在运行完成,在此关闭连接
  8. $pdo = null;
  9. }catch(PDOException $e){
  10. //抛出错误
  11. die('数据库错误:'.$e->getMessage());
  12. }

注意
连接数据成功后,返回一个 PDO 类的实例给脚本,此连接在 PDO 对象的生存周期中保持活动。
要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。
如果不这么做,PHP 在脚本结束时会自动关闭连接。

3、封装PDO函数

  1. /**
  2. * 数据库连接
  3. * @param $db
  4. * @return PDO
  5. */
  6. function connect(){
  7. $db = array(
  8. 'type' => 'mysql', //数据库类型
  9. 'host' => '127.0.0.1', //数据库主机名
  10. 'user' => 'root', //数据库连接用户名
  11. 'pass' => '123456', //对应的密码
  12. 'name' => 'test' //使用的数据库
  13. 'charset' => 'utf8', //字符集
  14. 'port' => 3306, //端口号
  15. );
  16. $dsn = "{$db['type']}:host={$db['host']}; dbname={$db['name']}; charset={$db['charset']}; port={$db['port']}";
  17. try {
  18. //1.实例化PDO类,创建PDO对象
  19. $pdo = new PDO($dsn,$db['user'],$db['pass']);
  20. } catch (PDOException $e) {
  21. die('数据库错误:'.$e->getMessage());
  22. }
  23. return $pdo;
  24. }

二、PHP PDO 类与PDOStatement 类

1、PDO::prepare

PDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象

  1. // 2.预处理sql语句
  2. $pre = $pdo -> prepare('SELECT * FROM `tp_user`');
  3. var_dump($pre);

为 PDOStatement::execute() 方法准备要执行的SQL语句,SQL语句可以包含零个或多个命名(:name)或问号(?)参数标记,参数在SQL执行时会被替换。

不能在 SQL 语句中同时包含命名(:name)或问号(?)参数标记,只能选择其中一种风格。

2、PDOStatement::execute

PDOStatement::execute — 执行一条预处理语句

  1. // execute() 执行sql语句(读/写)
  2. // 3.执行sql语句
  3. $exe = $pre -> execute();

执行预处理过的语句。如果预处理过的语句含有参数标记,必须选择下面其中一种做法:

  • 调用 PDOStatement::bindParam 绑定 PHP 变量到参数标记:如果有的话,通过关联参数标记绑定的变量来传递输入值和取得输出值
  • 或传递一个只作为输入参数值的数组

3、PDOStatement::bindParam

PDOStatement::bindParam — 绑定一个参数到指定的变量名

  1. $pre -> bindParam(':username',$username,PDO::PARAM_STR);
  2. $pre -> bindParam(':age', $calories, PDO::PARAM_INT);

绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符。

4、PDOStatement::fetchAll

PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组

  1. // 4.返回结果集
  2. $pre = $pdo -> prepare('SELECT * FROM `user`');
  3. $exe = $pre -> execute();;
  4. $data = $pre -> fetchAll();
  5. print_r($data);

5、PDOStatement::fetch

PDOStatement::fetch — 从结果集中获取下一行

  1. //5.fetch() 查询出来是一维数据
  2. $pre = $pdo -> prepare('SELECT * FROM `user` WHERE `id`=25');
  3. $exe = $pre -> execute();
  4. $data = $pre -> fetch();
  5. print_r($data);

三、PHP PDO 预处理语句

什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:

  • 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。
  • 提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

1、执行一条使用命名占位符的预处理语句

  1. <?php
  2. /* 通过绑定的 PHP 变量执行一条预处理语句 */
  3. $sql = 'INSERT INTO `user` SET `username`=:username,`phone`=:phone,`sex`=:sex,`age`=:age,`addtime`=:addtime';
  4. $pre = $pdo -> prepare($sql);
  5. // bindParam 参数绑定
  6. // // 1. 站位符名
  7. // // 2. 要给值得变量,绑定上,现在可以没值
  8. // // 3. 常量,pdo预定义常量,可以设置这个值的类型 ,访问方式: PDO:: ,类里的常量访问方式
  9. $pre -> bindParam('username',$username,PDO::PARAM_STR);
  10. $pre -> bindParam('phone',$phone,PDO::PARAM_STR);
  11. $pre -> bindParam('sex',$sex,PDO::PARAM_STR);
  12. $pre -> bindParam('age',$age,PDO::PARAM_STR);
  13. $pre -> bindParam('addtime',$addtime,PDO::PARAM_STR);
  14. $username = '小北';
  15. $phone = '1534874623';
  16. $sex = 0;
  17. $age = '18';
  18. $addtime = time();
  19. $exe = $pre -> execute();h->bindParam('age', $age, PDO::PARAM_INT);
  20. $sth->execute();
  21. if(!$exe){
  22. //将错误信息打印出来
  23. print_r($pre->errorInfo());
  24. }else{
  25. // rowCount 获取是否成功,影响数量
  26. echo $pre -> rowCount();
  27. echo '<hr>';
  28. // lastinsertId 获取这次自增的id,类是用的链接的类pod
  29. echo $pdo -> lastInsertId();
  30. }
  31. ?>

2、执行一条使用问号占位符的预处理语句

  1. <?php
  2. $sql = 'INSERT INTO `user` SET `username`=?,`phone`=?,`sex`=?,`age`=?';
  3. $pre = $pdo -> prepare($sql);
  4. $pre -> bindParam(1,$username,PDO::PARAM_STR);
  5. $pre -> bindParam(3,$phone,PDO::PARAM_STR);
  6. $pre -> bindParam(4,$sex,PDO::PARAM_STR);
  7. $pre -> bindParam(5,$age,PDO::PARAM_STR);
  8. $username = '小北';
  9. $phone = '1534874623';
  10. $sex = 0;
  11. $age = '18';
  12. $exe = $pre -> execute();
  13. if(!$exe){
  14. //将错误信息打印出来
  15. print_r($pre->errorInfo());
  16. }else{
  17. // rowCount 获取是否成功,影响数量
  18. echo $pre -> rowCount();
  19. echo '<hr>';
  20. // lastinsertId 获取这次自增的id,类是用的链接的类pod
  21. echo $pdo -> lastInsertId();
  22. }
  23. ?>

3、明文占位,数组传值,并且不需要绑定数据,直接在execute 传数组

  1. $sql = 'INSERT INTO `user` SET `username`=:username,`phone`=:phone,`sex`=:sex,`age`=:age,`addtime`=:addtime';
  2. $pre = $pdo -> prepare($sql);
  3. $exe = $pre -> execute([
  4. ':username' => 'zhangsan',
  5. ':phone' => 13146529855,
  6. ':sex' => 1,
  7. ':age' => 25,
  8. ':addtime' => $time
  9. ]);
  10. if(!$exe){
  11. print_r($pre->errorInfo());
  12. }else{
  13. echo $pre -> rowCount();
  14. echo '<hr>';
  15. echo $pdo -> lastInsertId();
  16. }

4、? 号占位,数组传值,并且不需要绑定数据,直接在execute 传数组

  1. $sql = 'INSERT INTO `user` SET `username`=?,`phone`=?,`sex`=?,`age`=?,`addtime`=?';
  2. $pre = $pdo -> prepare($sql);
  3. $exe = $pre -> execute([
  4. '小北2',
  5. 13416265984,
  6. 1,
  7. 20,
  8. $time
  9. ]);
  10. if(!$exe){
  11. print_r($pre->errorInfo());
  12. }else{
  13. echo $pre -> rowCount();
  14. echo '<hr>';
  15. echo $pdo -> lastInsertId();
  16. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议