gpt4 book ai didi

php - 如果查询成功,如何捕获db2_fetch_assoc()生成的错误?

转载 作者:行者123 更新时间:2023-12-03 07:59:27 26 4
gpt4 key购买 nike

我正在DB2 for IBM i(一个iSeries(AS/400))上使用PHP 5.6.5,在Zend Server 8.0.2上使用ibm_db2驱动程序。

我遇到了一个实例,其中包含别名为名称的子选择的 View 可能会或可能不会返回多行。我没有创建 View ,我理解了错误并且可以纠正它。奇怪的是,在PHP中,不会在db2_exec()上引发错误,而是在db2_fetch_assoc()上引发错误。我开始研究它,但找不到适合优雅地检测db2_fetch_assoc()生成的错误的方法。它在Zend错误日志中记录为“db2_fetch_assoc():提取失败”,状态为E_WARNING。
db2_stmt_error()db2_stmt_errormsg()仅返回与db2_exec()db2_execute()db2_prepare()有关的错误。我什至尝试使用类似的方法:

try{
//fetch record
}catch(Exception $exc){
print_r($exc);
}

并且不会注册为异常(exception)。

我能想到的最好的方法是发出初步查询,以获取应返回的行数。然后使用如下所示的for循环:
for($rows = 0; $rows < $ttlRows; $rows++){
if($row = db2_fetch_assoc($stmt, $rows)){
//Do some stuff
}else{
//Still never get to see information about the error or the afflicted row.
}
}

有谁知道其他方法来优雅地检测,跟踪或处理此类实例?

编辑1:
我在这里找到了值得一提的东西: PHP: How to manage errors gracefully?
这个答案描述了当警告发生时如何强制异常(这是我从 db2_fetch_assoc()得到的)。不利的一面是,如果未捕获任何警告,将会导致页面执行停止。

我正在娱乐的想法是将我的整个页面都包装在 try-catch子句中,其中 catch不执行任何操作(例如,在页眉include中包含 try{,在页脚include中包含 }catch(Exception $exc){})。这将允许页面执行,并且由于允许嵌套的 try-catch子句,我仍然可以像通常那样使用try-catch。虽然看起来很脏。

编辑2:
只是为了澄清,我不是要弄清楚我正在得到什么错误或如何纠正它-我已经知道它是什么以及如何纠正它。但是为了记录,我得到的错误是 SQL0811,它定义为 here。我要弄清楚的是如何检测和优雅处理 db2_fetch_assoc()生成的E_WARNING。这样做的原因是因为如果我没有检测到它,则获取过程将抢先在第一个受影响的记录上结束,但是页面将​​呈现一切都很好的状态。因此,为了将来,我希望有一个可以检测到这些情况的安全措施,而不是在几个月后才意识到某些工作不正常。不幸的是,我在第一次编辑中发布的次要解决方案不是一个可行的解决方案,因为它真正报告的只是存在提取失败-与失败原因无关。有点,但不多。理想情况下,我会想象会有一种获取SQL状态代码或某种方式的方法(对于我的错误,可能是以下任意一种:SQL0811,-811、21000,它们在上面的链接中定义)。

此外,我无法弄清楚为什么在SQL中仅将SQL错误视为E_WARNING。对我来说似乎有些奇怪,但是我在iNavigator中得到了相同的行为(即,仅当您到达受困的行时它才死掉),但没有绿屏(而是在查询执行时引发错误)。因此,它必须与数据库驱动程序以及它们如何处理有关。

最佳答案

如果db2_prepare失败,您是否尝试过使用db2_stmt_errors?
然后您可以将其写到日志中

class ISeriesDB2 {

protected $errorLog = '/tmp/error.log';
protected $Conn;
protected err;

function __construct()
{

$this->Conn = $db2_connect(YOUR_HOST,YOUR_USER_YOUR_PASSWD);

}


function query($SQL)

{



$this->sql = $SQL;



$stmt = db2_prepare($this->Conn, $this->sql);



if ($stmt)
{


$result = db2_execute($stmt);


while ($row = db2_fetch_assoc($stmt))
{


$resultSet[] = $row;
}


db2_free_stmt($stmt);
return $resultSet;
}
else
{

$this->err = db2_stmt_errormsg();


$this->writeError();

return null;
}






}

function writeError()
{
// write to the log

}

关于php - 如果查询成功,如何捕获db2_fetch_assoc()生成的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31882387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com