mysql_unbuffered_query pdo_pdo mysql错误:Cannot execute queries while other unbuffered queries are act...

本文探讨了在使用PHP PDO连接MySQL时出现的查询错误“Cannot execute queries while other unbuffered queries are active”。介绍了错误产生的原因,通常是在一次执行中包含多条SQL语句所导致。文中提供了解决方案,包括使用PDOStatement::fetchAll()和设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性。

运行环境:PHP 5.5.30-x64,MYSQL  5.6.27

错误代码:Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

网上的解释:

经过测试发现是因为在前一次 execute 里面执行了多条SQL语句(即通过分号分隔连续执行了多次的select/insert/update)。也就是说,未结束之前的查询而再次查询,这样是会出错地,所以要释放掉之前的查询。

手册上的代码:

if ( $db -> getAttribute ( PDO :: ATTR_DRIVER_NAME ) == 'mysql' ) {

$stmt = $db -> prepare ( 'select * from foo' ,

array( PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY => true ));

} else {

die( "my application only works with mysql; I should use \$stmt->fetchAll() instead" );

}

//http://www.cnblogs.com/osfipin/

?>

If this attribute is set to TRUE on a PDOStatement, the MySQL driver will use the buffered versions of the MySQL API. If you're writing portable code, you should use PDOStatement::fetchAll() instead.

测试了很多次还是有问题。。。。。

代码运行多个query,OPTIMIZE TABLE,DELETE操作。发现是OPTIMIZE TABLE导致的此错误。注释掉后代码运行无误。

使用OPTIMIZE TABLE:

class database extends PDO{

//表前缀

public $prefix = '';

//一些代码

//优化表

function optimize($table){

$stmt = $this -> prepare ('OPTIMIZE TABLE `'.$this->prefix.$table.'`',array( PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY => true ));

return $stmt -> execute();

}

//一些代码

}

啦啦啦。。。

php PDO mysql

php PDO写法连接mysql: $db=new PDO("mysql:host=localhost;dbname=sql","root","roo ...

PHP PDO的错误处理模式

PDO默认的错误处理方式是返回一个数组格式的错误代码.如果想要判断SQL有没有出错时,就需要写一组代码来检测这个返回的数组.觉得这样有些麻烦.还好PDO还提供了另外两种处理方式,只要根据需要设置一下就 ...

PHP开发者常犯的MySQL错误

PHP开发者常犯的MySQL错误   数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初学者也可以几个小时内就 ...

mysql错误:Error Code: 1175. You are using safe update mode and you tried to update a table……

今天遇到一个mysql错误:   Error Code: . You are using safe update mode and you tried to update a table withou ...

跟着百度学PHP[14]-PDO的错误处理模式&PDO执行SQL

我们在使用PDO去执行sql语句的时候并不会报错.如下案例所示: <?php try { //$pdo = new pdo("mysql:host=主机;port=端口;dbname= ...

inux php pdo mysql 扩展

今天在本机部署了一个pdo项目,发现一些问题,真没想到pdo mysql,不容易装啊,哈哈,我说的不容易,是因为php5.3以前版本,yum源里面根本没有.部署后就报,Undefined class ...

mysql错误代号大全

B.1. 服务器错误代码和消息 服务器错误信息来自下述源文件: · 错误消息信息列在share/errmsg.txt文件中."%d"和"%s"分别代表编号和字符 ...

MySql错误处理--错误代码和消息

附录B:错误代码和消息 目录 B.1. 服务器错误代码和消息 B.2. 客户端错误代码和消息 本章列出了当你用任何主机语言调用MySQL时可能出现的错误.首先列出了服务器错误消息.其次列出了客户端 ...

随机推荐

java观察者模式

像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

简单深入SpringMvc

简单深入SpringMvc 一.如何让一个普通类成为Controller? 方案一:实现接口Controller解析:handleRequest(request,response) 方案二:继承Abs ...

802&period;11MAC基础

做无线网络测试已经大半年了,在这过程中发现<802.11权威指南>真是以本好书,在这里分享一下学习到的知识,也帮助我记忆. 1.MAC: mac(媒介访问控制层),它位于物理层之上,控制着 ...

Android -- Home按键

游戏中常常需要监听android HOME键,当HOME键下压时,往往需要做一些状态保存,音效停止等操作,那么如何做,才能监听到HOME键呢?我们知道HOME是系统键,app中无法通过onKey这些函 ...

Jquery学习笔记:操作form表单元素之二(复选框和单选框)

在上面文章的基础上,我们介绍如何操作表单元素中的 复选框和单选框. 一.复选框

<think>首先,用户的问题是关于“m_port.open(QIODevice::ReadWrite | QIODevice::Unbuffered)”的使用方法及注意事项。我需要参考提供的引用内容来回答。 回顾引用内容: - 引用[1]和[2]描述了QIODevice的枚举值,包括ReadWrite和Unbuffered。 - ReadWrite:以读写方式打开 - Unbuffered:忽略缓存 - 引用[3]提到了open(mode)函数用于打开设备并设置读写模式,模式如ReadOnly,WriteOnly,ReadWrite。 - 引用[4]详细说明了open函数的签名:virtual bool QIODevice::open(QIODevice::OpenMode mode),返回true如果成功,false如果失败。 - 引用[5]概述了Qt文件系统,提到QIODevice提供对I/O设备的抽象。 用户的具体代码是“m_port.open(QIODevice::ReadWrite | QIODevice::Unbuffered)”。这里的“m_port”很可能是一个QSerialPort对象或其他QIODevice子类,因为在Qt中,串口设备常用QSerialPort,它继承自QIODevice。 关键点: - QIODevice::ReadWrite:允许读写操作。 - QIODevice::Unbuffered:禁用缓存,意味着读写操作直接与设备交互,不使用内部缓冲区。这可能减少延迟但增加I/O开销。 - 模式是使用按位或(|)组合的。 我需要解释: 1. **使用方法**:如何调用open函数,参数的含义,返回值等。 2. **注意事项**:可能的问题,如错误处理、适用场景等。 根据引用[4],open函数返回bool,成功为true,失败为false。因此,在代码中应该检查返回值。 常见的注意事项: - 错误处理:如果open失败,需要检查为什么失败。例如,设备可能已经被占用,权限不足等。 - 设备状态:确保设备在打开前是关闭的。 - 组合模式:多个模式用|组合,但并非所有组合都有效。ReadWrite和Unbuffered的组合通常是有效的。 - 适用场景:Unbuffered模式用于实时性要求高的场景,如串口通信,因为它避免缓冲延迟。但可能会降低性能。 - 特定设备:对于串口(QSerialPort),可能需要额外设置参数,如波特率、数据位等,通过其他函数设置(如setBaudRate())。 结构回答: - 由于系统指令要求回答结构清晰,我将逐步解释。 - 使用中文回答。 - 在末尾添加相关问题。 回答大纲: 1. **简介**:解释open函数的作用。 2. **参数解释**:详细说明QIODevice::ReadWrite和QIODevice::Unbuffered的含义。 3. **使用方法**:给出代码示例,并强调错误处理。 4. **注意事项**:列出关键点,如返回值检查、设备配置、错误处理等。 5. **示例代码**:提供简单的Qt代码片段。 6. **相关问题**:生成相关的问题。 确保LaTeX语法正确:由于问题中没有数学表达式,可能不需要LaTeX。但如果有变量或公式,使用$...$或$$...$$。这里似乎不需要。 生成相关问题:基于用户查询,问题可能涉及错误处理、模式组合、性能影响等。 最终回答格式: - 清晰分段。 - 自然地添加引用标识。 </think>### m_port.open(QIODevice::ReadWrite | QIODevice::Unbuffered) 使用方法及注意事项 在Qt框架中,`m_port.open(QIODevice::ReadWrite | QIODevice::Unbuffered)` 用于打开一个I/O设备(如串口或文件),并设置读写模式和缓存策略。这里的`m_port`通常是`QSerialPort`、`QFile`等`QIODevice`子类的对象。下面我将逐步解释使用方法、参数含义以及注意事项,确保回答基于Qt官方文档和最佳实践。 #### 1. **使用方法** - **函数签名**:`bool QIODevice::open(OpenMode mode)`,其中`mode`参数通过按位或(`|`)组合多个枚举值。函数返回`true`表示打开成功,`false`表示失败[^4]。 - **参数解释**: - `QIODevice::ReadWrite`:以读写模式打开设备,允许同时进行读取和写入操作。 - `QIODevice::Unbuffered`:禁用内部缓存,读写操作直接与硬件或底层系统交互,减少延迟但增加I/O开销。 - 组合方式:使用 `|` 运算符连接,表示同时启用这两种模式。 - **基本步骤**: 1. **初始化设备**:确保`m_port`已实例化为具体的设备对象(如`QSerialPort`)。 2. **调用open函数**:传入组合模式。 3. **检查返回值**:必须处理打开结果,因为失败时设备不可用。 4. **配置设备参数**:对于串口等设备,需额外设置波特率、数据位等(例如`m_port.setBaudRate(QSerialPort::Baud115200)`)。 5. **关闭设备**:使用完毕后调用`m_port.close()`释放资源。 **示例代码**: ```cpp #include <QSerialPort> #include <QDebug> QSerialPort m_port; // 假设m_port是全局或成员变量 bool openDevice() { // 设置串口名称(根据实际设备调整) m_port.setPortName("COM1"); // Windows示例,Linux可能是"/dev/ttyS0" // 尝试以读写+无缓存模式打开 if (m_port.open(QIODevice::ReadWrite | QIODevice::Unbuffered)) { // 成功打开后配置串口参数 m_port.setBaudRate(QSerialPort::Baud9600); m_port.setDataBits(QSerialPort::Data8); m_port.setParity(QSerialPort::NoParity); m_port.setStopBits(QSerialPort::OneStop); qDebug() << "设备打开成功"; return true; } else { // 处理失败情况 qDebug() << "打开失败:" << m_port.errorString(); return false; } } // 使用完毕后关闭设备 void closeDevice() { if (m_port.isOpen()) { m_port.close(); qDebug() << "设备已关闭"; } } ``` #### 2. **注意事项** - **返回值检查**:**必须检查open()的返回值**,如果返回`false`,表示打开失败。常见原因包括: - 设备未连接或被占用(如其他程序已打开串口)。 - 权限不足(Linux/Unix系统可能需要sudo或用户组权限)。 - 无效的设备名称(例如错误的COM端口或文件路径)。 - 此时可通过`QIODevice::errorString()`获取错误详情,例如`m_port.errorString()`[^4]。 - **模式组合的兼容性**: - `Unbuffered`模式适用于实时性要求高的场景(如串口通信、传感器数据采集),因为它跳过缓存,减少延迟。但会降低性能,因为每次读写都直接操作硬件。 - 确保组合模式有效:`ReadWrite`和`Unbuffered`可以安全组合;但避免与冲突模式(如`Append`)同时使用。 - **设备特定要求**: - 对于串口(`QSerialPort`),打开后需额外配置参数(波特率、流控制等),否则可能无法正常通信。 - 对于文件(`QFile`),`Unbuffered`可能导致频繁磁盘I/O,影响性能,仅在低延迟需求时使用。 - **资源管理**: - 打开设备后,如果不再使用,**必须调用`close()`** 释放系统资源,否则可能导致内存泄漏或设备锁定。 - 避免重复打开:如果设备已打开(`m_port.isOpen()`为true),再次调用`open()`会失败。 - **错误处理**: - 使用`QIODevice::error()`获取错误代码,结合`errorString()`诊断问题。 - 建议在`try/catch`块中操作(如果启用异常),但Qt默认不启用异常。 - **性能影响**: - `Unbuffered`模式不适合大数据量操作(如文件传输),因为频繁I/O会降低吞吐量。优先用于小数据包、实时性强的场景。 - 在嵌入式或IoT设备中,`Unbuffered`能减少延迟,但需测试实际性能。 #### 3. **常见问题解决** - **打开失败怎么办?** - 检查设备名称是否正确(例如串口号在Windows为COM1,Linux为/dev/ttyS0)。 - 验证权限:在Linux,运行`sudo adduser $USER dialout`添加用户到串口组。 - 确保设备未被占用(关闭其他可能使用该端口的程序)。 - **读写异常如何处理?** - 如果读写时返回错误(如`m_port.read()`失败),检查连接稳定性或信号干扰。 - 对于串口,启用超时设置(如`m_port.setReadTimeout(500)`)避免阻塞。 - **何时避免使用Unbuffered?** - 在文件操作或网络通信中,除非追求最低延迟,否则建议使用默认缓冲模式(`Buffered`)以提高效率。 通过正确处理打开模式和错误检查,`m_port.open(QIODevice::ReadWrite | QIODevice::Unbuffered)`能高效支持实时数据交互[^1][^2][^3][^4][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值