MySQL错误2014原因无法执行查询--P…

解决MySQL查询错误2014
本文探讨了MySQL错误2014的原因及其解决方案,解释了如何避免在一个未完成的查询过程中执行新的查询,同时提供了使用PDO进行缓冲查询和非缓冲查询的代码示例。

网上查了不少

最后定位到PDO这个类

http://stackoverflow.com/questions/17434102/causes-of-mysql-error-2014-cannot-execute-queries-while-other-unbuffered-queries&usg=ALkJrhgqG0PsXgSYk9W7uMgljOGEUbiwaw

这个网址说的不错

MySQL客户端协议不允许一个以上的查询是“进行中”。 也就是说,你执行一个查询,你已经获取了一些成果,但不是全部 - 那么你尝试执行第二个查询。 如果第一个查询仍然有行返回,第二个查询得到一个错误。

客户端库解决这个通过获取第一个查询的所有行隐含在第一次提取,然后后面的提取只需遍历内部缓存的结果。 这让他们有机会近距离光标(至于MySQL服务器而言)。 这是在“缓冲的查询”。 这个工程一样使用使用fetchall(),在这两种情况下必须分配在PHP客户端足够的内存来保存完整的结果集。

所不同的是一个缓冲的查询保存结果在MySQL客户端库,因此PHP无法访问行,直到你取(每个顺序)一行。 而使用fetchall()立即填充一个PHP数组的所有结果,让您存取任何随机行。

主要理由使用使用fetchall()是一个结果可能是太大,无法在你的PHP memory_limit的。 但它出现在查询结果中只有一个排,无论如何,所以这不应该是一个问题。

您可以closeCursor(),以“抛弃”的结果你已经获取最后一行之前。 MySQL服务器得到通知,它可以抛弃在服务器端的结果,然后就可以执行另一个查询。 你不应该closeCursor(),直到你完成获取给定的结果集。

另外:我注意到你在执行你的$而stmt2一遍又一遍的循环中,但它每次都会返回相同的结果。 在移动循环不变代码移出循环的原则,你应该立即开始循环之前执行这一点,并保存结果的PHP变量。 因此,无论使用缓冲的查询方法或者fetchAll()的,没有必要为你嵌套查询。

因此,我建议编写你的代码是这样的:

 $sql ='SELECT temp_id FROM temp1'; $stmt2 = db::db()->prepare($sql); $stmt2->execute(); $rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); $stmt2->closeCursor(); $sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id'; $stmt1 = db::db()->prepare($sql); foreach($data AS $row) { try { $stmt1->execute($row); $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $stmt1->closeCursor(); syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand()); syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand()); } catch(PDOException $e){echo(sql_error($e));} } 

请注意我还使用命名参数,而不是位置参数,这使得它易于$行传递的参数值的数组。 如果数组的键相匹配的参数名称,你可以传递数组。 在较旧版本的PHP,你必须包括:前缀数组的键,但是你不需要再这样了。

你应该使用的mysqlnd反正。 它有更多的功能,它的更多的内存效率,以及其许可证是用PHP兼容。

很多的解决办法:

http://micate.me/php-pdo-unbuffered-queries-active.note

http://www.flashj.cn/wp/pdo-transaction-err-in-php.html

这两个站点也不错,可以参考下

<think>我们正在解决用户关于如何使用`mysql-h127.0.0.1-uroot-p`连接本地MySQL数据库的问题。根据引用内容,用户可能遇到了一些连接问题,例如:-错误2002(HY000):无法通过socket连接(引用[1])-错误2003(HY000):无法连接到MySQL服务器(引用[2])-错误1045(28000):访问被拒绝(引用[3])因此,在指导用户使用命令的同时,我们还需要考虑可能出现的错误解决方法。步骤:1.解释命令的各个部分。2.说明如何正确使用该命令。3.针对可能出现的错误提供解决方案。注意:引用[4]提到了一些权限问题的解决办法,引用[5]则提到了mysql客户端的一些使用细节。我们将按照以下结构回答:-命令解释-使用步骤-常见错误解决-其他注意事项同时,根据系统级指令,我们需要生成相关问题。</think>### 如何通过 `mysql -h 127.0.0.1 -u root -p` 连接本地 MySQL 数据库 #### 1. **命令解释** - `-h 127.0.0.1`:指定连接本地回环地址(IPv4) - `-u root`:使用 root 用户身份登录 - `-p`:交互式输入密码 - 完整命令:`mysql -h 127.0.0.1 -u root -p` #### 2. **操作步骤** ```bash # 在终端执行命令 $ mysql -h 127.0.0.1 -u root -p # 系统将提示输入密码 Enter password: ******** # 成功连接后显示 MySQL 提示符 mysql> ``` #### 3. **常见错误解决方案** | 错误代码 | 现象 | 解决方法 | |---------|------|----------| | **ERROR 2002**<br>(HY000) | 无法通过 socket 连接 | 1. 确保 MySQL 服务已启动:`sudo systemctl start mysql`<br>2. 检查 `/var/lib/mysql/mysql.sock` 文件是否存在[^1] | | **ERROR 2003**<br>(HY000) | 无法连接服务器 | 1. 确认防火墙放行 3306 端口:`sudo ufw allow 3306`<br>2. 检查 MySQL 是否监听 TCP 端口:`netstat -tuln | grep 3306`[^2] | | **ERROR 1045**<br>(28000) | 访问被拒绝 | 1. 重置 root 密码:<br>`sudo mysqld_safe --skip-grant-tables &`<br>`mysql -u root` → `FLUSH PRIVILEGES;` → `ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';`[^4]<br>2. 检查用户权限:`SELECT Host, User FROM mysql.user;` | #### 4. **关键注意事项** 1. **连接协议差异**: - `127.0.0.1` 强制使用 **TCP/IP 协议** - `localhost` 可能尝试使用 Unix Socket(受系统配置影响) 2. **密码安全**: - 避免在命令中直接写密码(如 `-p123`),使用交互式输入 - 首次安装后需运行安全脚本:`sudo mysql_secure_installation` 3. **权限配置**: - 检查 root 用户是否允许从本地连接: ```sql CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1'; FLUSH PRIVILEGES; ``` #### 5. **验证连接成功** ```sql -- 连接后执行测试命令 mysql> STATUS; mysql> SHOW DATABASES; ``` 预期输出包含服务器版本和系统数据库列表(如 `information_schema`)。 > **提示**:若需指定默认数据库,可追加数据库名: > `mysql -h 127.0.0.1 -u root -p 数据库名`[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值