0

0

求教关于PDO使用的问题

php中文网

php中文网

发布时间:2016-06-23 13:51:13

|

1294人浏览过

|

来源于php中文网

原创

相关的数据库是这样的:

CREATE TABLE `session` (  `skey` char(32) CHARACTER SET ascii NOT NULL,  `data` text COLLATE utf8mb4_bin,  `expire` int(11) NOT NULL,  PRIMARY KEY (`skey`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;


相关的PHP代码大致如下(,我隐藏掉了一些无关的代码):
define('DNS', 'mysql:host=localhost;dbname=db;charset=utf8mb4');define('USR', 'usr');define('PWD', 'pwd');define('MAXLIFETIME', 1440);function write($id, $data) {	try {		$dbh = new PDO(DNS, USR, PWD, array(			PDO::ATTR_PERSISTENT => TRUE,			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,			PDO::ATTR_EMULATE_PREPARES => FALSE		));		try {			$expire = time() + MAXLIFETIME;			$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '					. 'VALUES (:skey, :data, :expire) '					. 'ON DUPLICATE KEY UPDATE '					. '`data` = :data, `expire` = :expire';			$stmt = $dbh->prepare($sql);			$stmt->bindValue(':skey', $id, PDO::PARAM_STR);			$stmt->bindValue(':data', $data, PDO::PARAM_STR);			$stmt->bindValue(':expire', $expire, PDO::PARAM_INT);			$stmt->execute();			$dbh = NULL;		} catch (Exception $e) {			echo $e->getTraceAsString();		}	} catch (Exception $e) {		echo $e->getTraceAsString();	}}write('12345678', '87654321');


其中的关键似乎在
PDO::ATTR_PERSISTENT => TRUE,PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

这两句上。

只有注释掉这两句,运行OK,这两句中的任何一句生效,则发生异常。
请问,这是什么情况?求指点。

Deep Search
Deep Search

智能文献、网页检索与分析工具。AI赋能,洞悉万象,让知识检索与总结触手可及

下载

回复讨论(解决方案)

异常信息是什么?看看不就知道了

数据插进去了么,异常信息打印出来看看,还有try 里面 嵌套try 似乎没有这种写法。

异常信息是什么?看看不就知道了


抱歉,是我糊涂了。
异常信息大概是这样的:
#0 /***************/pdo.php(23): PDOStatement->execute() #1 /****************/pdo.php(33): write('12345678', '87654321') #2 {main}

数据插进去了么,异常信息打印出来看看,还有try 里面 嵌套try 似乎没有这种写法。



谢谢您指点,关于异常的处理,刚刚接触  :( 。
异常,主要应该是$stmt->execute();那一句。

以为对异常处理不熟悉,所以,还不大知道怎么打印更详细的异常信息。

你不是在寻求帮助吗?
藏藏匿匿的怎么行?

你不是在寻求帮助吗?
藏藏匿匿的怎么行?



抱歉,隐藏掉的时一些涉及到工程的注释和路径名称。
这些不方便公开又偷懒,抱歉了。
俺重新写一段测试代码上来,请稍等。

你不是在寻求帮助吗?
藏藏匿匿的怎么行?



代码如下:
<?phpini_set('display_errors', '1');error_reporting(-1);define('DNS', 'mysql:host=localhost;dbname=ping_brand;charset=utf8mb4');define('USR', 'root');define('PWD', '123456');define('MAXLIFETIME', 1440);function write($id, $data) {	try {		$dbh = new PDO(DNS, USR, PWD, array(			PDO::ATTR_PERSISTENT => TRUE,			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,			PDO::ATTR_EMULATE_PREPARES => FALSE		));		$expire = time() + MAXLIFETIME;		$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '				. 'VALUES (:skey, :data, :expire) '				. 'ON DUPLICATE KEY UPDATE '				. '`data` = :data, `expire` = :expire';		$stmt = $dbh->prepare($sql);		$stmt->bindValue(':skey', $id, PDO::PARAM_STR);		$stmt->bindValue(':data', $data, PDO::PARAM_STR);		$stmt->bindValue(':expire', $expire, PDO::PARAM_INT);		$stmt->execute();		$dbh = NULL;	} catch (Exception $e) {		echo $e->getTraceAsString();	}}write('12345678', '87654321');


异常信息如下:
#0 /Library/WebServer/Documents/php/phplearn/pdo.php(28): PDOStatement->execute() #1 /Library/WebServer/Documents/php/phplearn/pdo.php(35): write('12345678', '87654321') #2 {main}

如果注释掉7楼代码的14、15两行,则不再发生异常,也不报错,但运行代码后检查发现数据并没有插入到数据库中。

你的 SQL 指令需要 5 个参数,而你只给了 3 个!
echo $e->getTraceAsString();
改为
echo $e->getMessage() ;
你就可以看到:
Error!: SQLSTATE[HY093]: Invalid parameter number

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
启用异常处理模式
注释掉就是按默认错误处理模式,可通过 errorInfo 取得错误信息

PDO::ATTR_PERSISTENT => TRUE,
启用长连接
只在复用连接时会抛出异常

谢谢您的指点。代码修改成功了。

$sql = 'INSERT INTO `session` (`skey`, `data`, `expire`) '				. 'VALUES (:skey, :data, :expire) '				. 'ON DUPLICATE KEY UPDATE'				. '`data` = :data_updata, `expire` = :expire_updata';		$stmt = $dbh->prepare($sql);		$stmt->bindValue(':skey', $id, PDO::PARAM_STR);		$stmt->bindValue(':data', $data, PDO::PARAM_STR);		$stmt->bindValue(':expire', $expire, PDO::PARAM_INT);		$stmt->bindValue(':data_updata', $data, PDO::PARAM_STR);		$stmt->bindValue(':expire_updata', $expire, PDO::PARAM_INT);

头前以为,insert into 中的:data和on duplicate子句中的:data是同一个变量,只需要一个绑定呢。
看起来不能这么做。

关于原本的错误代码,为啥在初始化PDO对象的时候使用PDO::ATTR_PERSISTENT => TRUE,会导致异常呢?
关于“复用连接”的说法,是啥地方构成了复用连接呢?

再次感谢。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

chatgpt官网入口地址合集
chatgpt官网入口地址合集

本专题整合了chatgpt官网入口地址、使用教程等内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

4

2026.03.16

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

7

2026.03.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

114

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

141

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

396

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

65

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

111

2026.03.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.5万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 7.6万人学习

PHP数据库编程-MySQLi/PDO
PHP数据库编程-MySQLi/PDO

共11课时 | 1万人学习

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

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