Answers:
JError在J3.x中已弃用,支持PHP异常,因为它混合了两种不同的编程概念:日志记录和错误处理(日志记录端现已实现为JLog)。
对于您的确切情况,您可以将代码包装在try / catch块中以获取错误,如此SO答案所示:
try {
...
$db->setQuery($query);
$result = $db->loadResult();
}
catch (Exception $e){
echo $e->getMessage();
}
请注意,$database->execute()
声明在J2.5中不起作用。$database->query()
如果需要,则应使用。
在的Joomla 2.5和3.x的JDatabase
对象的方法 updateRecord()
和insertRecord()
还抛出错误,如果他们失败,你可以赶上:
try {
JFactory::getDbo()->updateObject('#_table_name', $data);
} catch (Exception $e) {
//...handle the exception
}
如果仅针对Joomla 3.x进行开发,则还可以对SQL事务使用try catch块来获取错误详细信息:
$db = JFactory::getDbo();
try {
$db->transactionStart();
$query = $db->getQuery(true);
$values = array($db->quote('TEST_CONSTANT'), $db->quote('Custom'), $db->quote('/path/to/translation.ini'));
$query->insert($db->quoteName('#__overrider'));
$query->columns($db->quoteName(array('constant', 'string', 'file')));
$query->values(implode(',',$values));
$db->setQuery($query);
$result = $db->execute();
$db->transactionCommit();
}
catch (Exception $e) {
// catch any database errors.
$db->transactionRollback();
JErrorPage::render($e);
}
理想情况下,安装pecl,然后扩展适当的JDatabase *类,并使用以下实现覆盖JFactory :: getDbo(),从而无需进行大量代码更新即可将每个关键数据库查询包装在try catch语句中。
对我而言,下一件好事是以下对旧方法和新方法的支持:
包括在某处
class jDbUtils
{
protected static $dbErrorMessage = '';
public static function stupidJ3CatchDatabaseExecute($db, $cmd, $report = false) {
self::$dbErrorMessage = '';
try {
$res = $db->$cmd();
// legacy db error support
if (method_exists($db, 'getErrorNum') && $db->getErrorNum())
throw new Exception($db->getErrorMsg());
return $res;
} catch(Exception $e) {
self::$dbErrorMessage = $e->getMessage();
if ($report)
self::reportIfDbError();
return false;
}
}
public static function reportIfDbError()
{
if (self::$dbErrorMessage) {
JFactory::getApplication()->enqueueMessage(self::$dbErrorMessage, 'error');
return true;
}
}
}
然后像这样使用
function someDbInteraction(){
$db = JFactory::getDbo();
$db->setQuery('SELECT no_such_col FROM no_such_table LIMIT 1');
$res = jDbUtils::stupidJ3CatchDatabaseExecute($db, 'loadResult');
if (jDbUtils::reportIfDbError())
return false;
// do more processing
return $res;
}