使用PDO获取多个结果集似乎有问题!?nextRowset() fetchAll()

subnet 2008-04-16 02:58:37
我完全是按照手册上写的一个示例:

test数据库上建一tb_test表
--
-- 表的结构 `tb_test`
--
CREATE TABLE IF NOT EXISTS `tb_test` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(20) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
--
-- 导出表中的数据 `tb_test`
--
INSERT INTO `tb_test` (`id`, `name`) VALUES
(1, 'zhangsan'),
(2, 'lisi'),
(3, 'wangwu'),
(4, 'zhaoliu');


并在test库上建一个sp_test()存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_test` $$
CREATE PROCEDURE `test`.`sp_test` ()
BEGIN
SELECT * FROM tb_test LIMIT 1;
SELECT * FROM tb_test LIMIT 2;
END $$
DELIMITER ;

PHP代码 test.php(完全照抄PHP手册上的)
<?php
$conn = new PDO('mysql:host=localhost;dbname=test', 'root', '123456');
$sql = 'CALL sp_test()';
$stmt = $conn->query($sql);
$i = 1;
do {
$rowset = $stmt->fetchAll(PDO::FETCH_NUM);
if ($rowset) {
printResultSet($rowset, $i);
}
$i++;
} while ($stmt->nextRowset());

[color=sienna][color=navy]function printResultSet(&$rowset, $i) {
print "Result set $i:\n";
foreach ($rowset as $row) {
foreach ($row as $col) {
print $col . "\t";
}
print "\n";
}
print "\n";
}
?>





PHP的返回的结果是:
Result set 1: 1 zhangsan

也就是只有一个结果集,在mysql命令行下执行sp_test();
结果是
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan | (PHP那段代码只返回了这个结果集)
+----+----------+
1 row in set (0.00 sec)
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan | (没有返回这段结果集)
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)



我网上找了很多文章,写法也都是大同小异,换来换去始终也只能返回第一个结果集,请问大家有做过这块的吗?请帮我看下哪里出了问题。谢谢。
...全文
242 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
UltraBejing 2008-05-01
这个简单啊,网上搜一下就得到答案了.
回复
什么呀
回复
meiZiNick 2008-04-30
不会,帮顶
回复
mengyaoren 2008-04-26
public function myselectall($sql,$fetchBy='',$transaction=false){
$this->pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_NATURAL);
if ($transaction===true){
$this->pdo->beginTransaction();
if ($this->pdo->query($sql)===false){
$this->pdo->roolback();
}
else {
$this->pdo->commit();
}
}
else {
$this->result = $this->pdo->query($sql);
}

switch ($fetchBy){
case 'id':
$this->result->setFetchMode(PDO::FETCH_NUM);
break;
case 'num':
$this->result->setFetchMode(PDO::FETCH_ASSOC);
break;
case 'both':
$this->result->setFetchMode(PDO::FETCH_BOTH);
break;
case 'obj':
$this->result->setFetchMode(PDO::FETCH_OBJ);
break;
default:
$this->result->setFetchMode(PDO::FETCH_BOTH);
break;
}
return $this->result->fetchAll();
}
回复
subnet 2008-04-25
回复
subnet 2008-04-16
是啊,现在项目只能用PDO,搞了半天还没试过多结果集问题...
回复
ClintNorthwood 2008-04-16
mysqli可以办到:

$mysqli = new mysqli("localhost", "root", "root", "test");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "call sp_test();";
$mysqli->multi_query($query);
$i = 1;
while($mysqli->more_results()){
if ($result = $mysqli->store_result()) {
while ($rowset = $result->fetch_row()) {
//printf("%s\n", $row[0]);
printResultSet($rowset, $i);
}
$result->close();
}
$i++;
$mysqli->next_result();
}
function printResultSet(&$rowset, $i) {
print "Result set $i:\n";
foreach ($rowset as $row) {
print $row . "\t";
}
print "\n";
}
回复
ClintNorthwood 2008-04-16
哦,要获得多个结果集,没用过PDO,你确定PDO能办到吗?好像mysqli可以
回复
subnet 2008-04-16
[Quote=引用 1 楼 yangyu112654374 的回复:]
.....
你的存储过程有问题,改成这样:

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_test` $$
CREATE PROCEDURE `test`.`sp_test` ()
BEGIN

[/Quote]

我是想获得多个结果集啊,PHP支持多个SELECT的。
回复
ClintNorthwood 2008-04-16
并在test库上建一个sp_test()存储过程
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_test` $$
CREATE PROCEDURE `test`.`sp_test` ()
BEGIN
SELECT * FROM tb_test LIMIT 1;
SELECT * FROM tb_test LIMIT 2;
END $$
DELIMITER ;

你的存储过程有问题,改成这样:

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_test` $$
CREATE PROCEDURE `test`.`sp_test` ()
BEGIN
SELECT * FROM tb_test;
END $$
DELIMITER ;
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2008-04-16 02:58
社区公告
暂无公告