PHP学习笔记5——PDO

mac2024-07-13  52

PHP学习笔记5——PDO

PDO介绍PDO概述PDO简介1.开启PDO扩展2.PDO连接MySQL PDO对象常用方法1. exec()2. query()3. lastInsertId()4.setAttribute() PDOStatement结果集对象常用方法1.fetch()2.fetchAll()3.fetchColumn()4.rowCount() PDO错误处理模式错误处理概述1. 静默模式(silent)2.警告模式(warming)3.异常模式(exception) SQL语句预处理SQL语句的执行过程PDO预处理的步骤1.制作相同结构的SQL语句2.预编译相同结构的SQL语句3.给占位符绑定真正的数据4. 执行绑定数据的SQL语句

PDO介绍

PDO概述

PDO简介

PDO就是PHP Data ObjectPDO主要用来代替数据库操作类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();

2.PDO连接MySQL

描述:创建一个表示数据库连接的PDO实例。语法:PDO::__construct(string $dsn[,string $username[,string $password]])参数: $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()

描述:执行一条 SQL 语句,并返回受影响的行数语法: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()

描述:执行SELECT、SHOW语句,并返回一个结果集对象(PDOStatement)语法: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()

描述:获取插入记录的ID号语法: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()

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

代码例子:

<?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()

描述:从结果集中获取一行,并将指针下移语法:mixed PDOStatement::fetch ([ int $fetch_style] )参数: 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()

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

例子代码:

<?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()

描述:从结果集中的下一行返回单独的一列。语法:string PDOStatement::fetchColumn ([ int $column_number = 0 ] )参数:$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()

描述:返回受上一个 SQL 语句影响的行数语法: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预处理的步骤

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

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)