답변:
JError는 J3.x에서 더 이상 사용되지 않으며 PHP 예외를 선호하여 로깅과 오류 처리라는 두 가지 프로그래밍 개념 이 혼합 되어 로깅 측면이 JLog 로 구현되었습니다 .
정확한 경우, 이 SO 답변에 표시된 것처럼 코드를 try / catch 블록으로 감싸서 오류를 얻을 수 있습니다 .
try {
...
$db->setQuery($query);
$result = $db->loadResult();
}
catch (Exception $e){
echo $e->getMessage();
}
참고 $database->execute()
로 적혀있다 J2.5에 NOT 작업 . $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 ()를 재정 의하여 모든 중요한 db 쿼리를 try catch 문으로 랩핑하기 위해 squillion 코드 업데이트가 필요하지 않습니다.
나에게 가장 좋은 것은 이전 방식과 새로운 방식에 대한 아래의 지원입니다.
어딘가에 이것을 포함
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;
}