我正在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/