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

标签 php error-handling ibm-midrange db2-400 ibm-db2

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

相关文章:

php json数据返回jquery

php - 如何最好地在 Zend Framework 中添加此 Action Helper 路径

url - 浏览器可以自动更正 “mangled url”吗?

ibm-midrange - IBM DB2 : how to change a view's structure without deleting it and create it again?

sql - 当数据库表中的字段与 DB2 中的 SQL 关键字相同时,从数据库表中选择字段时出现问题

php - MySQL选择列直到数字

PHP 过滤 MySQL 语句

python - 在追加文件时,数据没有写入文件,而在读取文件时,它在 python 中显示空字节

ios - 在 Swift 2 中使用 Alamofire 进行错误处理

stored-procedures - 在db2中使用动态表名