PHP学习笔记5——PDO

PDO介绍

PDO概述

PDO简介

  • PDO就是PHP Data Object
  • PDO主要用来代替数据库操作类
  • PDO就是一个系统类
  • PHP同时可以操作多个数据库,例如:MySQL、SQL Server、Oracle、Db2等
  • PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,无论使用什么数据库,都可以通过一致的函数(方法)来执行查询和获取数据。
  • PDO是一个数据访问抽象层,作用是统一各种数据库的访问接口,与MySQL和MSSQL函数库相比,PDO让跨数据库的使用更具亲和力,与ADODB和MDB2相比,PDO更高效。

1.开启PDO扩展

修改php配置文件php.ini代码如下:

extension=php_pdo_mysql.dll
//获取Apache、MySQL、PHP、GD等配置信息
phpinfo();

开启PDO扩展后

2.PDO连接MySQL

  1. 描述:创建一个表示数据库连接的PDO实例。
  2. 语法:PDO::__construct(string $dsn[,string $username[,string $password]])
  3. 参数:
    • $dsn数据源名称:包含了连接数据库的基本信息;
      • 格式:$dsn=“dbtype:host=主机名;port=端口号;dbname=数据库名;charset=字符集”
      • dbtype参数:代表要连接的额数据库类型,例如:mysql、mssql、oracle等;
      • host参数:数据库服务器地址,可以是域名,也可以是IP地址;
      • port参数:数据库端口号,mysql的端口号:3306;
      • dbname参数:数据库名称;
      • charset参数:字符集,例如:utf8等;
    • $username数据库的用户名
    • $password数据库的用户密码

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//创建PDO对象
$pdo=new PDO($dsn,$username);
var_dump($pdo);

PDO对象常用方法

1. exec()

  1. 描述:执行一条 SQL 语句,并返回受影响的行数
  2. 语法:int PDO::exec ( string $statement )
    注意:执行select语句,将返回0。

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)插入一条记录
$sql="INSERT INTO student VALUES(null,"小明","",24)";
$records=$pdo->exec($sql);
echo "共插入{$records}条记录";

2. query()

  1. 描述:执行SELECT、SHOW语句,并返回一个结果集对象(PDOStatement)
  2. 语法:public PDOStatement PDO::query ( string $statement )

代码例子:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据并返回结果集对象
$sql="SELECT * FROM student";
$PDOstatement=$pdo->query($sql);
//(4)遍历对象
foreach ($PDOstatement as $arr) {
	print_r($arr);
}

3. lastInsertId()

  1. 描述:获取插入记录的ID号
  2. 语法:string PDO::lastInsertId (void )

代码例子:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)插入一条记录
$sql="INSERT INTO student VALUES(null,"小明","",24)";
$pdo->exec($sql);
//(4)获取插入的记录的ID值
echo "id=".$pdo->lastInsertId()."记录插入成功";

4.setAttribute()

  1. 描述:设置属性。
  2. 语法:bool PDO::setAttribute ( int $attribute , mixed $value )
  3. 参数:。。。

代码例子:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//设置默认的提取数据的模式
$pdo->setAttribute(PDO::ATTR_DEFALT_FETCH_MODE,PDO::FETCH_ASSOC)
//(3)插入一条记录
$sql="INSERT INTO student VALUES(null,"小明","",24)";
$pdo->exec($sql);
//(4)获取插入的记录的ID值
echo "id=".$pdo->lastInsertId()."记录插入成功";

PDOStatement结果集对象常用方法

1.fetch()

  1. 描述:从结果集中获取一行,并将指针下移
  2. 语法:mixed PDOStatement::fetch ([ int $fetch_style] )
  3. 参数:
    • PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组
    • PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组
    • PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。
    • PDO::FETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则类名由第一列的值决定
    • PDO::FETCH_INTO:更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性
    • PDO::FETCH_LAZY:结合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建供用来访问的对象变量名
    • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
    • PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象

代码例子:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student WHERE id=48";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取一条记录
$arr=$PDOStatement->fetch(PDO::FETCH_ASSOC);
print_r($arr);

2.fetchAll()

  1. 描述:返回一个包含结果集中所有行的二维数组
  2. 语法:array PDOStatement::fetchAll ([ int $fetch_style ] )
  3. 参数:。。。

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取一条记录
$arrs=$PDOStatement->fetchAll(PDO::FETCH_ASSOC);
print_r($arrs);

3.fetchColumn()

  1. 描述:从结果集中的下一行返回单独的一列。
  2. 语法:string PDOStatement::fetchColumn ([ int $column_number = 0 ] )
  3. 参数:$column_number是列的索引值,默认为0

代码例子:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT count(id) FROM student";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取某个列的值
$records=$PDOStatement->fetchColumn(0);
echo "共有{$records}条记录";

4.rowCount()

  1. 描述:返回受上一个 SQL 语句影响的行数
  2. 语法:int PDOStatement::rowCount ( void )

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student";
$PDOStatement=$pdo->query($sql);
//(4)从结果集获取记录数
$records=$PDOStatement->rowCount();
echo "共有{$records}条记录";

PDO错误处理模式

错误处理概述

PDO错误报告模式:静默模式、警告模式、异常模式。

  • 静默模式(silent):当PDO执行SQL语句有错时,不显示任何错误(默认);
  • 警告模式(warming):当PDO执行SQL语句有错时,用错误 的等级来报告信息;
  • 异常模式(exception):当PDO执行SQL语句有错时,先抛出异常,再捕获异常。

1. 静默模式(silent)

获取错误信息函数PDO::errorCode()POD::errorInfo()

  • PDO::errorCode():获取错误状态码。如果状态码为“00000”,说明没有错。
  • POD::errorInfo()获取描述性信息。

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student WHERE id=abc";
$PDOStatement=$pdo->query($sql);
//(4)输出错误信息
echo "错误状态码".$PDOStatement->errorCode();
echo "<br>错误信息:";
print_r($PDOStatement->errorInfo());

2.警告模式(warming)

要想报告“警告模式错误”,必须先设置错误的报告模式。

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//设置PDO的报错模式为:警告模式
$pod->setAttribute(PDO::ATTR_ERRMODE,POD::ERRMODE_WARMING);
//(3)查询数据,并返回结果集对象
$sql="SELECT * FROM student WHERE id=abc";
$PDOStatement=$pdo->query($sql);

3.异常模式(exception)

要想报告“异常模式错误”,必须先设置错误的报告模式。

例子代码:

<?php
//声明页面字符集
header("content-type:text/html;charset:utf-8");
//(1)数据库的配置信息
$dsn="mysql:host=127.0.0.1;port=3306;dbname=itcast;charset=utf8";
$username="root";
//$password="root";
//(2)创建PDO对象
$pdo=new PDO($dsn,$username);
//设置PDO的报错模式为:警告模式
$pod->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//(3)查询数据,并返回结果集对象
try{
	//师徒正常运行的程序代码
	$sql="SELECT * FROM student WHERE id=abc";
	$PDOStatement=$pdo->query($sql);
}catch(PDOException $e){
	echo "错误行号:".$e->getLine();
	echo "<br>错误文件:".$e->getFile();
	echo "<br>错误状态码:".$e->getCode();
	echo "<br>错误描述信息".$e->getMessage();
}

SQL语句预处理

SQL语句的执行过程

SQL语句的执行,分成两个阶段:编译和执行。

  • 如果SQL语句是第一次执行,先编译再执行。编译过程十分复杂,耗用系统资源,相对不太安全;
  • 如果SQL语句(即相同的SQL语句)是第2次执行,直接从缓存中读取,无疑执行效率是最高的,也是比较安全的,可以有效避免SQL注入等安全问题;

PDO预处理的步骤

  1. 先提取相同结构的SQL部分(将数据部分,可变的部分去掉)
  2. 编译这个相同的结构,将编译结果保存
  3. 将不同的数据部分进行替换
  4. 执行

1.制作相同结构的SQL语句

//(1)使用占位符“:value”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:title,:content)";
//(2)使用占位符“:1”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:1,:2)";

2.预编译相同结构的SQL语句

//(1)使用占位符“:value”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:title,:content)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);

3.给占位符绑定真正的数据

/(1)使用占位符“:value”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(:title,:content)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue(":title","新闻标题");
$PDOStatement->bindValue(":content","新闻内容");
//(1)使用占位符“?”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(?,?)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue("1","新闻标题");
$PDOStatement->bindValue("2","新闻内容");

4. 执行绑定数据的SQL语句

//(1)使用占位符“:1”来代替真正的数据
$sql="INSERT INTO news(title,content) VALUES(?,?)";
//(2)预编译相同结构的SQL语句
$PDOStatement=$pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue("1","新闻标题");
$PDOStatement->bindValue("2","新闻内容");
//(4)执行预编译的SQL语句
$PDOStatement->execute();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值