web-dev-qa-db-ja.com

2.5および3.xと互換性のあるSQL例外/エラー処理の方法

Joomla 2.5と3のコンポーネントを開発しようとしていました。これらの2つのバージョンの間で廃止された多くのものと、データベースやその他のエラーをスローおよびキャッチする方法のため、2.5と3の両方で単一のコンポーネントを作成する方法はまだ見つかりませんでした。

したがって、2.5と3で別々にコンポーネントを作成しています。

まず、2.5でこのようにして、データベースでエラーを検出します。-

if(!$database->query())
{ 
    return false; 
}

しかし、エラーがコンポーネントに表示されるように、ビュークラスに正確なエラーメッセージを表示または返すにはどうすればよいですか?

次に、別の種類のdbクエリの場合、モデルクラスでこの方法でdbからデータを取得しています(モデルの関数のコードは次のとおりです)。

$this->_data = null; 
if(JFactory::getApplication()->input->get('id') > 0) {
    $db = JFactory::getDBO();
    $db->setQuery("select * from `#__tablename_wrong` where `id`='".JFactory::getApplication()->input->get('id')."'");
}
if ($db->getErrorNum()) {
    JError::raiseWarning(500, $db->getErrorMsg());
}
$this->_data = $db->loadObject(); 
return $this->_data; 

ビュークラスの$this->_dataを調べて、0レコードが返されるかどうかを確認できますが、特定のデータベースエラーメッセージを表示したり、ビュークラスにエラーメッセージを返してエラーを表示したりするにはどうすればよいですか?

したがって、これらは、2.5でデータベースクエリを実行しているときに開発者がエラーを表示する最も一般的な方法です。

5
dev-m

@ValentinDespaの回答とほとんど同じですが、2つをマージして2.5と3.xで機能するものに結合します。

ページ全体のエラーメッセージを表示するのではなく、falseを返し、ページの上部にエラーメッセージを挿入します。それがあなたが求めているものであることを願っています

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('X') // This is specially added to throw an SQL error.
      ->from('#__users');
$db->setQuery($query);

if(!JError::$legacy)
{
    try
    {
        // If it fails, it will throw a RuntimeException
        $result = $db->loadResult(); 
    }
    catch (RuntimeException $e)
    {
        JFactory::getApplication()->enqueueMessage($e->getMessage());

        return false;
    }
}
else
{
    $result = $db->loadResult();

    // Check for a database error.
    if ($db->getErrorNum())
    {
        JFactory::getApplication()->enqueueMessage($db->getErrorMsg());

        return false;
    }
}

JErrorレガシースイッチは、2.5ではJErrorを使用する場合はfalse、3.xでは例外を使用する場合はtrueでした。

ここで私のモジュールの1つでこれを使用した完全な例を見ることができます https://github.com/JoomJunk/shoutbox/blob/development/mod_shoutbox/helper.php#L

6
George Wilson

あまりに多くの情報を公開しないように注意してください! SQLエラーを公開すると、データベース構造やその他の機密情報が公開される可能性があることに注意してください。私はSQLエラーをバックエンド(信頼できるユーザーとしましょう)でのみスローし、フロントエンドでは一般的なエラーのみをスローし、正確なエラーをエラーログに記録します。

.xでクエリを実行して例外をキャッチしてスローする

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('X') // This is specially added to throw an SQL error.
      ->from('#__users');

try
{
    $db->setQuery($query);
    $result = $db->loadResult(); // If it fails, it will throw a RuntimeException 
}
catch (RuntimeException $e)
{
    throw new Exception($e->getMessage());
}

古い非推奨の関数を使用してJoomla 2.5および3.xでクエリを実行する

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('X'); // This is specially added to throw an SQL error.
      ->from('#__users');
$db->setQuery($query);

// Check for a database error.
if ($db->getErrorNum()) {
    JError::raiseWarning(500, $db->getErrorMsg());
}

$result = $db->loadResult();
4
Valentin Despa