PHP中如何复制ODBC查询结果$result至变量或数组?
解决ODBC结果集无法重复使用的问题
这个问题我之前踩过坑!你遇到的核心问题是:ODBC查询返回的$result是一个资源句柄,而不是实际的数据集合。你直接做$result1 = $result只是复制了这个句柄的引用,两个变量指向的是同一个结果集指针——第一个循环把指针移到了结果集末尾,第二个循环自然读不到任何数据。
两种可行的解决方案
方案1:提前把结果集转成数组(最稳妥)
把所有查询结果一次性读取到PHP数组中,这样就可以无限次复用这个数组,不受指针限制:
<?php // 先将ODBC结果集转为普通数组存储 $resultData = []; if(is_resource($result)) { while($row = odbc_fetch_array($result)) { $resultData[] = $row; } } // 第一次遍历输出 foreach($resultData as $rowhr1) { ?> <pre><?php print_r($rowhr1); ?></pre> <?php } // 第二次遍历输出(完全不受影响) foreach($resultData as $rowhr) { ?> <pre><?php print_r($rowhr); ?></pre> <?php } ?>
这种方法的好处是兼容性拉满,不管什么ODBC驱动都能正常工作,唯一需要注意的是如果结果集极大,可能会占用较多内存——不过大多数场景下这都不是问题。
方案2:重置结果集指针(依赖驱动支持)
如果你的ODBC驱动支持可滚动结果集,可以在第一个循环结束后,用odbc_data_seek()把指针重置到结果集开头,这样第二个循环就能重新读取:
<?php if(is_resource($result)) { while($rowhr1 = odbc_fetch_array ($result)) { ?> <pre><?php print_r($rowhr1); ?></pre> <?php } // 重置指针到结果集第0行(开头) odbc_data_seek($result, 0); } if(is_resource($result)) { while($rowhr = odbc_fetch_array ($result)) { ?> <pre><?php print_r($rowhr); ?></pre> <?php } } ?>
⚠️ 注意:这个方法不是所有驱动都支持,如果你的ODBC驱动不支持可滚动结果集,odbc_data_seek()会失效,所以优先推荐方案1。
为什么直接复制变量没用?
PHP里的「资源」是一种特殊类型,它本质是指向外部数据(比如数据库结果集、文件句柄)的标识符。当你对资源变量做赋值操作时,只是复制了这个标识符,而不是复制外部数据本身——所以$result和$result1其实共享同一个结果集指针,一个移动了指针,另一个自然也会受到影响。
内容的提问来源于stack exchange,提问作者Pax Obi
相关产品推荐
相关产品推荐

