db2_fetch_assoc()即使存在下一行也不会返回

时间:2012-05-25 01:34:41

标签: php db2

db2_fetch_assoc()在从某些地方调用时未找到下一行 - 即使记录集中有更多行。

goQueryDB2()连接到数据库并运行查询。它能够使用db2_fetch_assoc()返回记录集中的第一行,并通过调用外部函数getNextRowDB2()来返回记录集中的第二行。(其执行相同的操作)。

从该函数返回记录集资源($ result)。但是当再次使用$ result作为参数调用getNextRowDB2()时,不会返回记录集中的第三行 - 实际上它找不到任何内容并抛出警告(警告:db2_fetch_assoc()[function.db2- fetch-assoc]:获取失败)。

您可以从“在资源ID#12中找不到结果”的输出中看到资源的名称已经有效地传递给getNextRowDB2()函数 - 但由于某种原因,它不再在该记录集中找到任何行。

谁能告诉我发生了什么事?或者甚至确认您是否同意此代码看起来没问题?

是否有某些东西使得DB2记录集资源在调用它的函数之外无法访问?

这在MySQL中运行正常(我必须转换为DB2)。

所以这段代码:

function goQueryDB2($sql)
{
  if($con = db2_connect("MASTER", "USER", "PASSWORD"))
  {
    echo "<li>Connected to master database</li>";   
  }

  if($result = db2_exec($con, $sql))
  {
    echo "<li>SQL Query ran successfully</li>"; 
  }

  //Just proving some data can be returned as this point
  $row = db2_fetch_assoc($result);

  if(sizeof($row) > 0)
  {
    echo "<li>db2_fetch_assoc returned a record in the resultset (Resource ID: " . $result . ") that has " . sizeof($row) . " fields</li>"; 
  }

  //Just proving some data can be returned as this point
  $row = getNextRowDB2($result);
  if(sizeof($row) > 0)
  {
    echo "<li>getNextRow() returned a record in the resultset (Resource ID: " . $result . ") the has " . sizeof($row) . " fields</li>"; 
  }

  return $result;
}

function getNextRowDB2($result)
{
    if($row = db2_fetch_assoc($result))
    {
        return $row;    
    }
    else
    {
        echo "<li>No results found in " . $result . "</li>";    
    }
}

echo "<h2>goQueryDB2()</h2>";
$result = goQueryDB2("SELECT * FROM users");

echo "<h2>getNextRowDB2()</h2>";
$row = getNextRowDB2($result);

生成此输出:

goQueryDB2()
Connected to master database
SQL Query ran successfully
db2_fetch_assoc returned a record in the resultset (Resource ID: Resource id #12) that has 25 fields
getNextRow() returned a record in the resultset (Resource ID: Resource id #12) the has 25 fields
getNextRowDB2()

Warning: db2_fetch_assoc() [function.db2-fetch-assoc]: Fetch Failure in /home/portal/includes/functionsSecurity.php on line 262
No results found in Resource id #12

1 个答案:

答案 0 :(得分:0)

我能够通过使用持久连接来解决:

$con = db2_pconnect("MASTER", "USER", "PASSWORD")

我假设即使从函数传回资源的名称(“Resource id#12”),DB2连接和所有返回的资源也会在调用它们的函数末尾停止存在 - 除非使用持久连接。

这是DB2独有的,因为我发现MySQL中没有必要实现持久连接。