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
答案 0 :(得分:0)
我能够通过使用持久连接来解决:
$con = db2_pconnect("MASTER", "USER", "PASSWORD")
我假设即使从函数传回资源的名称(“Resource id#12”),DB2连接和所有返回的资源也会在调用它们的函数末尾停止存在 - 除非使用持久连接。
这是DB2独有的,因为我发现MySQL中没有必要实现持久连接。