PHP--学习笔记---09数据库抽象层PDO

1.支持PDO的驱动及相应的数据库列表

在这里插入图片描述

2.创建PDO对象

PDO对象的构造方法
__construct(dsn,username,password,driver_options)
第一个参数:数据源名(DSN)用来定义一个确定的数据库和必须用到的驱动程序。
PDO命名管理为PDO驱动程序名,后面加个冒号,在后面是可选的驱动陈旭的数据库连接变量信息,如主机名、端口、数据库名
如:
mysql:host=localhost;dbname=testdb//mysql:驱动前缀,主机localhost,数据库:testdb
第二个参数:username,
第三个参数:passwrod
第四个参数:driver_options,数组,指定连接所需的所有额外选项(调优信息等。)

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
try {
	$dbh = new PDO ( $dsn, $user, $password );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
}
?>
3.创建PDO对象—将参数存放在本地或远程文件中
try {
	$dbh = new PDO ( "uri:file:///d:/dbconnect","root","password" );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
}
4.创建PDO对象—使用php.ini中的别名

在php.ini为dsn指定别名,如:
pdo.dsn.XXX=“OCI:dbname=//localhost:152/mydb;charset=utf-8”

try {
	$dbh = new PDO ( "XXX","root","tiger" );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
}
5.创建PDO对象—与连接有关的选项(第四个参数)

在这里插入图片描述
在这里插入图片描述
设置选项名为下标组成的关联数组,作为驱动程序特定的连接选项,传递给PDO构造方法的第四个参数。

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt=array(PDO::ATTR_PERSISTENT=>true);
try {
	$dbh = new PDO ( $dsn, $user, $password$opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
}
?>
6.PDO对象中的成员方法

当PDO对象创建成功以后,以数据库的连接已经建立,就可以使用该对象了,PHP与数据库服务之间的交互都是通过PDO对象中的成员方法实现的,该对象中的全部成员方法如下:
在这里插入图片描述
PDO扩展类库为php访问数据库定义了一个轻量级的,一致性的接口,提供了一个数据访问抽象层,这样,无论使用什么事数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据库的操作,并能够屏蔽不同数据库之间的差异。

7.调整PDO的行为属性

通过PDO对象中的setAttribute()和getAttribute方法设置和获取属性值
1.getAttribute();

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}

echo "\n PDO是否关闭自动提交功能:" . $dbh->getAttribute ( PDO::ATTR_AUTOCOMMIT ) . "<BR/>";
echo "\n 错误处理模式:" . $dbh->getAttribute ( PDO::ATTR_ERRMODE ) . "<BR/>";
echo "\n 表字段字符的大小写转换:" . $dbh->getAttribute ( PDO::ATTR_CASE );
echo "\n 与连接状态相关特有信息:" . $dbh->getAttribute ( PDO::ATTR_CONNECTION_STATUS ) . "<BR/>";
echo "\n 空字符串转换为SQL的null:" . $dbh->getAttribute ( PDO::ATTR_ORACLE_NULLS ) . "<BR/>";
echo "\n 应用程序提前获取数据大小:" . $dbh->getAttribute ( PDO::ATTR_PERSISTENT ) . "<BR/>";
echo "\n 与数据库特有服务器信息:" . $dbh->getAttribute ( PDO::ATTR_SERVER_INFO ) . "<BR/>";
echo "\n 数据库服务器版本号信息:" . $dbh->getAttribute ( PDO::ATTR_SERVER_VERSION ) . "<BR/>";
echo "\n 数据库客户端版本号信息:" . $dbh->getAttribute ( PDO::ATTR_CLIENT_VERSION ) . "<BR/>";

?>

结果:
PDO是否关闭自动提交功能:1
错误处理模式:0
表字段字符的大小写转换:0 与连接状态相关特有信息:127.0.0.1 via TCP/IP
空字符串转换为SQL的null:0
应用程序提前获取数据大小:1
与数据库特有服务器信息:Uptime: 115771 Threads: 3 Questions: 692 Slow queries: 0 Opens: 456 Flush tables: 3 Open tables: 214 Queries per second avg: 0.005
数据库服务器版本号信息:8.0.19
数据库客户端版本号信息:mysqlnd 7.4.4

2.getAttribute();

两个参数,第一个参数为属性名,第二个参数为属性值
$dbh->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERROMODE_EXCEPTION ) ;

8.PDO的错误处理模式

PDO一共提供了三种不同的错误处理模式
三种错误处理模式

  • PDO::ERRMODE_SILENT;
  • PDO::ERRMODE_WARNING;
  • PDO::ERRMODE_EXCEPTION;
9.使用PDO执行SQL语句

1、使用PDO::exec()方法
当执行insert,update,和delete等没有结果集的查询时,使用exec()方法执行。返回受影响的行数

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}

$query = "update student set sname='张三' where sname='zhangsan'";
$affected = $dbh->exec ( $query );
if ($affected) {
	echo '数据表中受影响的行数为:' . $affected;
} else {
	print_r ( $dbh->errorInfo () );
}
?>

成功时的结果
数据表中受影响的行数为:1
在这里插入图片描述
在这里插入图片描述
出错时的结果:
Array ([0] => 42S22[1] => 1054[2] => Unknown column ‘name’ in ‘where clause’ )

2、使用PDO::query()方法
有结果集时使用,返回一个PDOStatement对象。如果同时还向了解湖区的数据行总数,可以使用PDOStatement对象中的rowCount方法获取。

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}

$query = "select sname as '姓名',gender as '性别' from student";//使用字段别名也是可以的
try {
	$pdostatement = $dbh->query ( $query );
	echo '从表中获取的记录行数为:' . $pdostatement->rowCount () . '<br/>';
	// $pdostatement对象的获取到的是以字段名为键名的数组
	foreach ( $pdostatement as $value ) {
		echo $value ['姓名'] . '->' . $value ['性别'] . '<br/>';//使用字段别名做下标
	}
} catch ( Exception $e ) {
	$e->getMessage ();
}

?>

结果:
从表中获取的记录行数为:6
张三->男
李四->男
王二->女
赵六->男
孙七->女
王八->男

10.PDO对预处理语句的支持—PDOStatement对象

PDOStatement类对象是通过PDO对象的prepare()方法获取。这事一个查询对象,能第一和执行参数化的SQL命令。全部成员方法如下:
在这里插入图片描述
在这里插入图片描述

11.PDO对预处理语句的支持—准备语句(类似于javaEE中的prepareStatement)

PDO中两种占位符语法:“命令参数”和“问号参数”
命令参数
$dbh->parepare(" insert into student (‘sname’,‘gender’,‘age’) values(:name,:gender,:age)");
命令参数,每个命名参数需要冒号(:)开始,参数的命名一定要有意义,最好和对应的字段名称相同。
问号参数
$dbh->prepare(“insert into student (name, gender,age) values(?,?,?)”);

12.PDO对预处理语句的支持—绑定参数bindParam()

把参数变量绑定到准备好的展位符上,格式如下
bindParam(mixed parameter,mixed &variable,intdata_type可选,int length,mixed driver_options);
第一个参数必选项,名字参数字符串,或者问号展位符的列值占位符的索引偏移量
第二个参数variable也是必选项,提供赋值给第一个参数锁指定占位符的值,因为是按引用传递的,只能使用变量不能使用变量值
第三个参数data_type是可选项,显示式地为当前被绑定的参数设置数据类型。可能类型值为:

  • PDO::PARAM_BOOL:代表boolean类型数据
  • PDO::PARAM_NULL:代表null类型数据
  • PDO::PARAM_INT:代表integer类型数据
  • PDO::PARAM_STR:代表char,varchar类型和其他字符串类型数据
  • PDO::PARAM_LOB:代表大对象类型数据
    第四个参数length是可选项,用于指定数据类型的长度
    第五个参数driver_option是可选项,

命令参数示例

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}

$query = "insert into student (sname,gender,age) values(:name,:gender,:age)";//使用命令参数
$statement=$dbh->prepare($query);

//第二个参数要按照引用传递,所以需要变量作为参数
$statement->bindParam(":name", $name);
$statement->bindParam(":gender", $gender);
$statement->bindParam(":age", $age);
//给插入的变量赋值
$name="孙九";
$gender="男";
$age=23;

?>

问号参数示例

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}

$query = "inset into student (sname,gender,age) values(?,?,?)";//使用问号参数
$statement=$dbh->prepare($query);

//第二个参数要按照引用传递,所以需要变量作为参数
$statement->bindParam(1, $name,PDO::PARAM_STR);//$name是第一个问号代表的变量
$statement->bindParam(2, $gender,PDO::PARAM_STR);
$statement->bindParam(3, $age,PDO::PARAM_INT);//$age是第三个问号代表的变量
//给插入的变量赋值
$name="王石";
$gender="男";
$age=73;

?>
13.PDO对预处理语句的支持—执行准备好的查询execute()

使用PDOStatement类对象的execute()方法,反复执行在数据库缓存区准备好的语句

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}

$query = "insert into student (sname,gender,age) values(?,?,?)"; // 使用问号参数
$statement = $dbh->prepare ( $query );

// 第二个参数要按照引用传递,所以需要变量作为参数
$statement->bindParam ( 1, $name ); // $name是第一个问号代表的变量
$statement->bindParam ( 2, $gender );
$statement->bindParam ( 3, $age ); // $age是第三个问号代表的变量
                                   // 给插入的变量赋值
$name = "孙九";
$gender = "男";
$age = 23;
// 执行语句
$statement->execute ();

// 给插入的变量赋值
$name = "王石";
$gender = "男";
$age = 73;
$statement->execute ();

?>

结果:在这里插入图片描述

14.PDO对预处理语句的支持—执行准备好的查询execute(),使用数组快速带入参数

使用数组作为传入值,快速执行sql语句
命名参数形式

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}
$query = "insert into student (sname,gender,age) values(:name,:gender,:age)"; // 使用命令参数
 // $query = "insert into student (sname,gender,age) values(?,?,?)"; // 使用问号参数
$statement = $dbh->prepare ( $query );

// 执行语句
$statement->execute ( array (
		":name" => '茅十一',
		':gender' => '男',
		':age' => 34 
) );
$statement->execute ( array (
		":name" => '王二浪',
		':gender' => '女',
		':age' => 23 
) );

?>

结果:
在这里插入图片描述
问号参数形式

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}
$query = "insert into student (sname,gender,age) values(?,?,?)"; // 使用问号参数
$statement = $dbh->prepare ( $query );

// 执行语句
$statement->execute ( array (
		'十三姨',
		'女',
		24 
) );
$statement->execute ( array (
		'杨四郎',
		'男',
		25 
) );

?>

结果:
在这里插入图片描述

15.PDO对预处理语句的支持—获取数据(遍历结果集)

1.fetch()
PDOStatement实际就是一个结果集。fetch方法可以将结果集中当前行的记录以某种方式返回,并将结果集指针移至下一行,当达到结果集末尾时返回FALSE。
ftech(int fetch_style,int cursor_oriententation, iny cursor_offset);
第一个参数fetch_style是可选项,获得一行数据记录中,各列的引用方式取决于这个参数如何设置,可用的设置有以下6种。
PDO::FETCH_ASSOC:从结果集中获取以列名为索引的关联数组。
PDO::FETCH_NUM:从结果集中获取一个以列在行中的数据偏移为所以的值数组(顺序编号,索引数组)。
PDO::FETCH_BOTH:默认值,包含以上两者。
PDO::FETCH_OBJ:从结果集当前行的记录中获取属性对应各个列名的一个对象。
PDO::FETCH_BOUND:使用fetch()返回true,并将获取的列值赋给在bindParm()方法中指定的相应变量。
PDO::FETCH_LAZY:创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这三种接口中任选一种。

第二个参数cursor_orientation是可选项,用来确定当对象是一个可滚动的游标时应当获取哪一行
第三个参数cursor_offset也是可选项,需要提供一个整数值,表示要获取的行相对于当前游标位置的偏移。

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}
$query = "select sid,sname,gender,age from student"; // 使用问号参数
$statement = $dbh->query ( $query );

while ( list ( $sid, $sname, $gender, $age ) = $statement->fetch ( PDO::FETCH_NUM ) ) {
	echo $sid . " | " . $sname . " | " . $gender . " | " . $age . " <br/> ";
}

?>

结果:
1 | 张三 | 男 | 34
2 | 李四 | 男 | 32
3 | 王二 | 女 | 25
4 | 赵六 | 男 | 34
5 | 孙七 | 女 | 32
6 | 王八 | 男 | 23
7 | 孙九 | 男 | 23
8 | 王石 | 男 | 73
9 | 茅十一 | 男 | 34
10 | 王二浪 | 女 | 23
11 | 十三姨 | 女 | 24
12 | 杨四郎 | 男 | 25

2.fetchAll()
一次性取出集合中所有行,并赋给返回的二维数组
fetchAll(int fetch_style,int column_index)
第一个参数同上列:
第二个参数,可选,需要提供一个整数索引

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}
$query = "select sid,sname,gender,age from student"; // 使用问号参数
$statement = $dbh->prepare ( $query );
$statement->execute ();
$allRows = $statement->fetchAll ( PDO::FETCH_ASSOC );

foreach ( $allRows as $row ) {
	echo $row ['sid'] . ' | ' . $row ['sname'] . ' | ' . $row ['gender'] . ' | ' . $row ['age'] . '<br/>';
}

?>

结果:
1 | 张三 | 男 | 34
2 | 李四 | 男 | 32
3 | 王二 | 女 | 25
4 | 赵六 | 男 | 34
5 | 孙七 | 女 | 32
6 | 王八 | 男 | 23
7 | 孙九 | 男 | 23
8 | 王石 | 男 | 73
9 | 茅十一 | 男 | 34
10 | 王二浪 | 女 | 23
11 | 十三姨 | 女 | 24
12 | 杨四郎 | 男 | 25

3.fetchAll()取某一列

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}
$query = "select sid,sname,gender,age from student"; // 使用问号参数
$statement = $dbh->prepare ( $query );
$statement->execute ();
$allRows = $statement->fetchAll ( PDO::FETCH_COLUMN, 1 );
echo '结果中所有人得姓名'.'<br/>';
foreach ( $allRows as $row ) {
	echo $row . '<br/>';
}

?>

结果
结果中所有人得姓名
张三
李四
王二
赵六
孙七
王八
孙九
王石
茅十一
王二浪
十三姨
杨四郎

4.bindColumn()
该方法可以将一个列和一个指定的变量名绑定,这样在每次使用fetch()方法获取各行记录时,会自动将相应的列值赋值给该变量,但必须设置第一个参数值为PDO::FETCH_BOTH值才可以
bindColumn(mixed cloumn,mixed &param,int type)//设置绑定列值到变量上

<?php
$dsn = "mysql:dbname=testbase0331;host=127.0.0.1";
$user = "root";
$password = "密码";
$opt = array (
		PDO::ATTR_PERSISTENT => true 
);
try {
	$dbh = new PDO ( $dsn, $user, $password, $opt );
} catch ( Exception $e ) {
	echo '数据库连接失败' . $e->getMessage ();
	exit ();
}
$query = "select sid,sname,gender,age from student";

try {
	$statement = $dbh->prepare ( $query );
	$statement->execute ();
	$statement->bindColumn ( 1, $sid ); // 通过列位置偏移数绑定变量sid,偏移数从1开始
	$statement->bindColumn ( 2, $sname ); // 通过列位置偏移数绑定变量sname,偏移数从1开始
	$statement->bindColumn ( 'gender', $gender ); // 通过列名绑定变量gender,
	$statement->bindColumn ( 'age', $age ); // 通过列名绑定变量age
	
	while ( $statement->fetch ( PDO::FETCH_BOUND ) ) { // fetch方法传入特定的参数遍历
		echo $sid . "  " . $sname . "  " . $gender . "  " . $age . '<br/>';
	}
} catch ( Exception $e ) {
	echo $e->getMessage ();
}

?>

结果:
1  张三  男  34
2  李四  男  32
3  王二  女  25
4  赵六  男  34
5  孙七  女  32
6  王八  男  23
7  孙九  男  23
8  王石  男  73
9  茅十一  男  34
10  王二浪  女  23
11  十三姨  女  24
12  杨四郎  男  25

5.获取列的属性信息getColumnMeta()
columnCount()方法获取数据表中字段的数量,并且可以通过PDOStatement类对象的getColumnMeta()方法获取具体列的属性信息。

16.大数据对象的存取

PDO允许在bindParam()或bindClolumn()调用中通过PDO::PARAM_LOB类型代码来使用大型数据类型。PDO::PARAM_LOB告诉PDO将数据映射为流,所以可以使用PHP中的文件处理函数来操纵这样的数据
mysql的lob数据没用过,这里直接贴图书代码
在这里插入图片描述

17.PDO的事务处理

不太会,略过吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值