3

特定の関数では、次のようないくつかのクエリを実行する必要がある場合があります。

    $user = & JFactory::getUser();
    $db = & JFactory::getDBO();
    $query  = $db->getQuery(true);

    $query->select('id');
    $query->from($db->quoteName('#__users'));
    $query->where('username='.$db->quote($response->username));
    $db->setQuery($query);
    $user_id = $db->loadResult();

    if ($user_id == "") 
    {
           //do something
    }


    $query1  = $db->getQuery(true);
    $query1->select('app_id');
    $query1->from($db->quoteName('#__app_ids'));
    $query1->where('app_descr='.$db->quote($this->app_descr).' AND app_valid=TRUE');
    $db->setQuery($query1);
    $app_id = $db->loadResult();

に変更queryしないquery1と、後続のクエリでこれを機能させることができません。Joomlaの外では、mysql接続を閉じるときにこれを行う必要はありませんでした。正しい順序である限り、同じ変数を使用して、すべてが順調です。

2つの質問:

  1. これは正しいですか?それとも、これを行うためのより良い方法はありますか?
  2. mysqlの失敗をチェックする必要がありloadResultますか?どうすればいいですか。Joomlaコアをよく見ると何も見えませんが、これを処理するためにさまざまなことが混在している場合があります。
4

2 に答える 2

5

1)メソッドパラメータがに設定されているため、新しいクエリオブジェクトを取得しているため、同じ変数名で機能するはずですtrue$query->clear();クエリオブジェクトを取得した直後に呼び出してみてください

$query  = $db->getQuery(true);
$query->clear();
$query->select('app_id');

2)Joomla 3では、次のようになります。

try
{
    $db->setQuery($query);
    $user_id = $db->loadResult();
}
catch (RuntimeException $e)
{
    $e->getMessage();
}

そしてJoomla2.5では

if ($db->getErrorNum()) {
    JError::raiseWarning(500, $db->getErrorMsg());
} 

また、変更します

$user = & JFactory::getUser();
$db = & JFactory::getDBO();

$user = JFactory::getUser();
$db = JFactory::getDBO();

とにかくPHP5ではオブジェクトは参照によって返され、php5.3以降では警告がスローされます。

于 2013-03-15T20:47:54.877 に答える
0

Joomlaでは、JFactory :: getDBO()は常に同じ接続インスタンスを返します(今日の通常のバージョンでは)。そのため、SQLを設定するたびに、実際には以前のSQLを書き換えています。履歴書では、このコードには複数の接続が必要です。この方法ではサポートされません。独自のバージョンのJDatabaseDriver、おそらく独自のmysqli接続のプールを制御するための独自のバージョンのグローバル静的配列を作成する必要があります。PHPはプール接続に乏しく、JAVAや.NETほどではありません。コードをすばやく作成するには、ロジックを考え、毎回1つの接続、毎回開いたクエリを1つだけ使用するようにする必要があります。常に、JFactory :: getDBO()スレッドセーフではありません。これに注意してください。コミットまたはロールバックなしで1つのphp内で1つのトランザクションを開始することはできません。他のページの実行で問題が発生します。

于 2016-07-28T19:02:15.330 に答える