【问题标题】:PHP, Oracle and ODBC: How to check if result set is empty?PHP、Oracle 和 ODBC:如何检查结果集是否为空?
【发布时间】:2014-04-13 06:44:54
【问题描述】:

亲爱的书呆子和论坛爱好者,

我在使用 ODBC 驱动程序的 Oracle 数据库上使用 PHP 时遇到了一个很好的问题。

首先是代码:

$ora_conn = odbc_connect($ora_dsn, $ora_user, $ora_pass, SQL_CUR_USE_ODBC);
$ora_data = odbc_exec($ora_conn,$sql);

//echo "test: ".odbc_num_rows( $ora_data );
//exit;

if(odbc_num_rows( $ora_data ) > 0){
    // do something in case no result came back
}

if($ora_data){
    // do something in case result came back
}

如果我取消注释测试,我总是返回 -1!不管语句的结果是 0 行、1 行还是 5 行...

因此,如果没有结果、返回 1 个或更多结果,则使用此代码我永远无法获取信息。

您对如何解决此问题有任何想法吗?

非常感谢您的帮助!

最好的问候,英格玛

【问题讨论】:

  • odbc_num_rows 在 SELECT 语句上有许多 ODBC 驱动程序返回 -1。您要么需要在查询中包含一个 COUNT(*) 字段,要么使用您正在使用的任何编程语言循环遍历结果并增加一个计数器。

标签: php sql oracle odbc


【解决方案1】:

odbc_num_rows 似乎只对 INSERT、UPDATE 和 DELETE 查询可靠。

manual 说:

使用 odbc_num_rows() 来确定 SELECT 后可用的行数将返回 -1 与许多驱动程序。

解决此问题的一种方法是改为在 SQL 中执行 COUNT(*)。示例见here

【讨论】:

  • 哇...感谢您的快速回复!您的解决方案的问题是,我在这个位置动态地构建了 $sql 语句,我需要确定结果是否返回。还有什么想法吗?
【解决方案2】:
if(odbc_num_rows( $ora_data ) == 0){
    // do something in case no result came back
}

if(!$ora_data){
    // do something in case result came back
}

【讨论】:

  • 感谢您的快速回答,但正如我上面解释的那样,我总是得到 -1...所以检查 0 是没有意义的。无论如何,谢谢。
  • 谢谢。我已经检查过了,但他也使用 (!odbc_num_rows( $Result )) 进行否定检查。
【解决方案3】:

我解决了,谢谢你的回答...

我的解决方案是:代码优先

$sql =  "SELECT GUID FROM SMSITEACCESS WHERE PROJECTID = 901981 AND SID = " . $guid;
$ora_data = odbc_exec($ora_conn,$sql);

$arr = @odbc_fetch_array($ora_data);

if($arr['GUID'] == ""){
    $dbh_insert = new PDO($dsn,$dbuser,$dbpass);
    $dbh_insert->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $sql_insert = "INSERT INTO SMSITEACCESS (SID, CREATED, CREATEUSER, PROJECTID) VALUES ('".$guid."', SYSDATE, '".$userid."', '901981')";
    $res_insert = $dbh_insert -> prepare($sql_insert);
    $res_insert -> execute();
    $sql_insert=null;
    $res_insert=null;
    $dbh_insert=null;
}

odbc_free_result($ora_data);

我首先添加了一个包含文件。如果要处理的每个表最后都包含一个数据集,此脚本会一一检查。如果其中任何一个不存在,则将其创建为空。

有了这个解决方法,我不再需要检查数据是否返回......

这本来可以更容易,但 ODBC 驱动程序接缝在这个共识中是错误的。

感谢您的快速回复,祝您有美好的一天。

英格玛

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2014-04-13
    • 2018-12-13
    • 2018-03-24
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多