0

0

pdo操作数据库入门教程

php中文网

php中文网

发布时间:2016-05-25 12:57:32

|

1463人浏览过

|

来源于php中文网

原创

我们开始构造第一个pdo应用,建立一个pdo.php教程文件在web文档目录下.pdo功能确实强大,另外还有一些内容我没有讲到,比如绑定参数、预处理、存储过程、事务处理等等功能,另外还有不同数据扩 dsn的构造,oracle数据库自己很多特殊的东西,都需要深入去学习理解,这篇文章就只是简单的描述了一些入门知识,算是对pdo一个简单的了解吧.

先来看一下实例代码:

$dsn = "mysql:host=localhost;dbname=test"; 
$db = new PDO($dsn, 'root', ''); 
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()"); 
echo $count; 
$db = null;

不明白啥意思,这行:$dsn = "mysql:host=localhost;dbname=test";

就是构造我们的DSN(数据源),看看里面的信息包括:数据库类型是mysql,主机地址是localhost,数据库名称是test,就这么几个信息,不同数据库的数据源构造方式是不一样的.

$db = new PDO($dsn, 'root', '');

初始化一个PDO对象,构造函数的参数第一个就是我们的数据源,第二个是连接数据库服务器的用户,第三个参数是密码,我们不能保证连接成功,后面我们会讲到异常情况,这里我们姑且认为它是连接成功的.

$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()");
echo $count;

调用我们连接成功的PDO对象来执行一个查询,这个查询是一个插入一条记录的操作,使用PDO::exec() 方法会返回一个影响记录的结果,所以我们输出这个结果,最后还是需要结束对象资源:$db = null;

默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:

$db = new PDO($dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));

一次操作就这么简单,也许跟以前的没有太大区别,跟ADOdb倒是有几分相似.

继续了解:如果我们想提取数据的话,那么就应该使用数据获取功能,下面用到的$db都是上面已经连接好的对象.

foreach($db->query("SELECT * FROM foo")){ 
 print_r($row); 
}

我们也可以使用这种获取方式:

$rs = $db->query("SELECT * FROM foo"); 
while($row = $rs->fetch()){ 
 print_r($row); 
}

如果想一次把数据都获取到数组里可以这样:

$rs = $db->query("SELECT * FROM foo"); 
$result_arr = $rs->fetchAll(); 
print_r($result_arr);


Array 
([0] => Array( 
 [id] => 1 
 [0] => 1 
 [name] => heiyeluren 
 [1] => heiyeluren 
 [gender] => 男 
 [2] => 男 
 [time] => 2006-10-28 23:14:23 
 [3] => 2006-10-28 23:14:23 
)


我们看里面的记录,数字索引和关联索引都有,浪费资源,我们只需要关联索引的:

$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); 

$rs = $db->query("SELECT * FROM foo"); 

$rs->setFetchMode(PDO::FETCH_ASSOC); 

$result_arr = $rs->fetchAll(); 

print_r($result_arr); 

看上面的代码,setAttribute() 方法是设置部分属性,主要属性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等等,我们这里需要设置的是 PDO::ATTR_CASE,就是我们使用关联索引获取数据集的时候,关联索引是大写还是小写,有几个选择:

PDO::CASE_LOWER -- 强制列名是小写

PDO::CASE_NATURAL -- 列名按照原始的方式

PDO::CASE_UPPER -- 强制列名为大写

我们使用setFetchMode方法来设置获取结果集的返回值的类型,同样类型还有:

PDO::FETCH_ASSOC -- 关联数组形式

成新网络商城购物系统
成新网络商城购物系统

使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888

下载

PDO::FETCH_NUM -- 数字索引数组形式

PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的

PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()

当然,一般情况下我们是使用PDO::FETCH_ASSOC,具体使用什么,按照你自己的需要,其他获取类型参考手册,除了上面这种获取数据的方式,还有这种:

$rs = $db->prepare("SELECT * FROM foo"); 
$rs->execute(); 
while($row = $rs->fetch()){ 
 print_r($row); 
}

其实差不多,如果你想获取指定记录里一个字段结果的话,可以使用 PDOStatement::fetchColumn():

$rs = $db->query("SELECT COUNT(*) FROM foo"); 
$col = $rs->fetchColumn(); 
echo $col;

一般使用fetchColumn()来进行count统计或者某些只需要单字段的记录很好操作.

简单的总结一下上面的操作:

查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作,PDO::exec()主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档.

获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、 PDOStatement::fetchALL()。PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段。PDOStatement::fetch() 是用来获取一条记录,PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过 PDOStatement::setFetchMode来设置需要结果集合的类型。

另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。 PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对 PDO::exec()方法和SELECT操作无效。

错误处理:如果程序中碰到错误咋办?我们这里描述PDO类的错误信息和异常处理。

1. 面向对象的方式

先看看如果连接错误等的处理,使用面向对象的方式来处理:

try { 
 $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
 $db = null; 
} catch (PDOException $e) { 
 print "Error: " . $e->getMessage() . "
";  die(); }

这里利用我们PHP 5面向对象的异常处理特征,如果里面有异常的话就初始化调用PDOException来初始化一个异常类.

PDOException异常类的属性结构:

class PDOException extends Exception 
{ 
 public $errorInfo = null; // 错误信息,可以调用 PDO::errorInfo() 或 PDOStatement::errorInfo()来访问 
//开源代码phprm.com 
 protected $message; // 异常信息,可以试用 Exception::getMessage() 来访问 
 protected $code; // SQL状态错误代码,可以使用 Exception::getCode() 来访问 
}

这个异常处理类是集成PHP 5内置的异常处理类,我们简单的看一下PHP 5内置的异常处理类结构:

class Exception 
{ 
 // 属性 
 protected $message = 'Unknown exception'; // 异常信息 
 protected $code = 0; // 用户自定义异常代码 
 protected $file; // 发生异常的文件名 
 protected $line; // 发生异常的代码行号 
 
 // 方法 
 final function getMessage(); // 返回异常信息 
 final function getCode(); // 返回异常代码 
 final function getFile(); // 返回发生异常的文件名 
 final function getLine(); // 返回发生异常的代码行号 
 final function getTrace(); // backtrace() 数组 
 final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息 
}

相应的,在代码中可以合适的调用 getFile() 和 getLine() 来进行错误定位,更方便的进行调试.

2. 使用面向过程的方法,先看代码:

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
$rs = $db->query("SELECT aa,bb,cc FROM foo"); 
if ($db->errorCode() != '00000'){ 
 print_r($db->errorInfo()); 
 exit; 
} 
$arr = $rs->fetchAll(); 
print_r($arr); 
$db = null;

PDO和PDOStatement对象有errorCode() 和 errorInfo() 方法,如果没有任何错误,errorCode() 返回的是:00000,否则就会返回一些错误代码,errorInfo() 返回的一个数组,包括PHP定义的错误代码和MySQL的错误代码和错误信息,数组结构如下:

Array 
( 
 [0] => 42S22 
 [1] => 1054 
 [2] => Unknown column 'aaa' in 'field list' 
)

每次执行查询以后,errorCode() 的结果都是最新的,所以我们可以很容易自己控制错误信息显示.


教程网址:

欢迎收藏∩_∩但请保留本文链接。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

52

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

25

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

7

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

413

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

232

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

197

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

150

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.3万人学习

Django 教程
Django 教程

共28课时 | 3.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号