面向对象php学习笔记21:PDO[PDO基本应用,PDO写操作,PDO查询操作,PDO事务]

PDO

  • PDO类:统一的数据库的初始化操作,包括连接认证和执行sql指令
  • PDOStatement类:数据解析操作,主要针对数据结果操作(有数据结果返回)
  • PDOException类:异常处理操作,针对所有PDO操作可能出现的错误采用的异常模式处理

一.PDO扩展

定义:PDO扩展,即PDO提供了1套帮助用户实现多数据库操作的统一接口,通过使用PDO,开发人员不需要额外自定义数据库对应的操作类,从而简化开发过程

1. PDO在php5以前要手动加载扩展,PHP5以后自动加载无须配置

2. PDO是多数据库扩展.需要在php.ini中配置对应的数据库,例如mysql

3. 加载扩展之后须重启服务器.然后使用PHPinfo()函数查看pdo,及PDO_MYSQL是否加载

二.pdo操作

 PDO手册查阅

官方PDO手册参考

PDO类基本应用

定义:PDO是php data object的简称.代表php数据对象,是一种纯面向对象的方式实现的数据库操作扩展.

1. PDO类 虽然提供了很多方法,但是常用的方法有以下几个.

PDO :: errorInfo()返回有关此数据库句柄执行的上一个操作的错误信息数组。 该数组至少包含以下字段:
[0] SQLSTATE错误代码(ANSI SQL标准中定义的五个字符的字母数字标识符)。
[1]特定于驱动程序的错误代码。
[2]特定于驱动程序的错误消息

2.PDO实例化对象:使用构造方法__construct(string $dsn, string $user, string $pass, [array $drivers])实现,构造方法由4个参数组成,其中一般前三个为必须参数,第四个为可选参数.

$dsn:一个数据库基本信息字符串,包含数据库产品,主机地址等

  • 驱动名字(数据库产品):使用英文:分隔.例如mysql:表示使用mysql数据库
  • 驱动选项(主机地址):使用host=具体主机地址,跟着驱动名字之后,如'mysql:host=localhost'
  • 驱动选项(端口),使用port=端口号,默认为3306可以不写.在驱动名字后,不区分先后顺序.如'mysql:host=localhost;port=3306'或者'mysql:port=3306;host=localhost',使用分号和驱动分开
  • 驱动选项(数据库名字),使用dbname=数据库名字(可以事先没有)

$user:用户名,如果数据库允许匿名用户出现,可以没有参数(只有$dsn)

$pass:密码,与用户名一样

$drivers:PDO属性设置,是关联数组,利用PDO内部的常量进行设置

3.得到对象后,利用该PDO对象调用相关方法执行sql操作:exec执行数据返回sql,query执行有结果返回sql

4.如果PDO对象执行SQL指令出错,即SQL本身有错误,那么可以通过pdo类提供的errorCode()和errorInfo()

总结

PDO写操作

定义:写操作,即使用PDO实现数据库增删改操作,操作过程中要考虑sql本身可能出现的错误处理,以及对结果的操作处理.

1.初始化PDO,每次操作都需要POD实例化:封装执行

2.SQL通常应该是外部传入,外部需要的只是结果,不考虑过程,所以在实际开发时要考虑二次封装.即外部传入sql,内部执行并控制错误,最终返回结果

3.具体写操作

注意:一般写操作都是受影响行数,但是如果是插入操作,有时候需要新增记录的自增长ID,可以通过PDO::lastInsertID()来获取.

总结:

PDO查询操作

定义:查询操作即通过执行SQL指令后从数据库获得相应的数据,然后对数据加工变成php可识别的模式

1.查询是建立在连接之上,因此需要使用到前面封装的初始化功能

2.查询的sql也是可能出问题的部分,因此同样需要进行错误检查.另外PDO查询使用的是PDO::query()方法实现

3.此时查询的结果是一个PDOStatement对象,不能提供任何php可访问的数据结果,还需要对结果进行处理.而我们查询数据的时候通常是两种操作:根据具体条件获取一条记录或多条记录,因此返回的数据是不同的.解决方案也有多种方式:①创建多个函数来实现不同效果;②创建1个函数,但是通过参数来控制实现不同效果

4.此时从功能上来讲,只要顺序调用以上几个方法即可完成

 

5.PDOStatement::fetch(),PDOStatement::fetchall()方法默认返回的数据是重复的:数字下标索引和K-V关联方式的数组各出现一次.可设置fetch系统的条件fetch_style来实现

fetch_style:控制下一行如何返回给调用者。此值必须是 PDO::FETCH_* 系列常量中的一个,缺省为 PDO::ATTR_DEFAULT_FETCH_MODE 的值 (默认为 PDO::FETCH_BOTH )。

  • PDO::FETCH_ASSOC:返回结果集为K-V关联的数组

  • PDO::FETCH_BOTH(默认):返回结果集列为2个数组:1个K-V关联的数组,1个数字下标(从0开始)的数组.

  • PDO::FETCH_NUM:返回结果集为数字下标(从0开始)的数组

总结

PDO事务

定义:php将mysql支持的事务操作进行一定封装实现.注意:事务是否执行成功是由mysql对应的存储引擎是否支持决定的.

1.事务功能回顾:事务是指改变默认的一次操作一次写入数据表的机制,而是通过事务日志记录操作,在最后通过一次性操作写入到数据表.事务过程如下

  • 开启事务: start transaction,写操作停止直接写入数据表,而是记录到事务日志
  • 事务操作:具体的写操作,通常多个步骤多条指令
  • 提交事务:即事务操作结束
  1. 成功提交: commit,所有事务日志同步到数据表,并清空当前事务日志
  2. 失败回滚: rollback,直接清空当前事务日志

2.PDO类中提供1套方案来实现事务操作

3.在事务操作中,有一种回滚点机制,在PDO中没有实现,如果有必要,可以通过sql指令具体实现

总结

自主封装的PHP ORM框架,面向对象PDO数据库操作,API框架,支持Get/Post/Put/Delete多种请求方式。 代码示例: <?php use Models\User; require '../application.php'; require '../loader-api.php'; //适合查询,如:获取用户列表或者单个用户信息 execute_request(HttpRequestMethod::Get, function() { $action = request_action(); //判断是否存在 if ($action == 1) { list($type, $value) = filter_request(array( request_int('type', 1, 2, 3), //1.用户名 2.邮箱 3.手机号 request_string('value'))); $type_field_map = array( 1 => User::$field_username, 2 => User::$field_email, 3 => User::$field_phone ); if ($type == 2 && !is_email($value) || $type == 3 && !is_mobilephone($value)) { die_error(USER_ERROR, $type_field_map[$type]['name'] . '格式无效'); } $user = new User(); $user->set_where_and($type_field_map[$type], SqlOperator::Equals, $value); $result = $user->exists(create_pdo()); echo_result($result ? 1 : 0); //存在返回1,不存在返回0 } //查询单条信息 if ($action == 2) { list($userid) = filter_request(array( request_userid())); //查询单条数据 $user = new User($userid); //set_query_fields可以指定查询字段,下面两种法均可 //$user->set_query_fields('userid, username, email'); //$user->set_query_fields(array(User::$field_userid, User::$field_username, User::$field_email)); //还可设置where条件进行查询 //$user->set_where_and(User::$field_status, SqlOperator::Equals, 3); //$user->set_where_and(User::$field_truename, SqlOperator::IsNullOrEmpty); //$user->set_where_and(User::$field_age, SqlOperator::In, array(27, 29)); //$user->set_where_and(User::$field_regtime, SqlOperator::LessThan, '-6 month'); //创建数据库连接 $db = create_pdo(); $result = $user->load($db, $user); //也可以用Model类的静态方法 //$result = Model::load_model($db, $user, $user); if (!$result[0]) die_error(PDO_ERROR_CODE, '获取用户信息时数据库错误'); if (!$user) di
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值