1


1

Zend_Dbの正しい使い方

私は現在データベース接続を管理するのにZend_Dbクラスを使用しています。 いくつか質問がありました。

  • オープン接続をスマートに管理しますか? (たとえば、接続している すでに開いている、それを使用することを知っていますか?または、新しい接続を開く前にすでに開いている接続があるかどうかを常に確認する必要がありますか?)

  • 次のコードを使用して結果を取得します(FETCH_OBJで取得します) モード):

     $final = $result->fetchAll();

    return $final[0]->first_name;

何らかの理由で、fetchRowが機能しないため、結果が1つしか存在しない場合でも( `+ WHERE id = number +`を検索し、idがPKである場合など)、常にfetchAllを使用します

私の質問は、fetchRowではなくfetchAllを使用すると、結果だけが表示される場合でも、さらに多くの時間とメモリを犠牲にすることです。

  • 接続を管理するために次のクラスを作成しました。

    require 'Zend/Db.php';

  class dbconnect extends Zend_Db

 {



 function init ()
    {
         $params = array (......

        return Zend_Db::factory ( 'PDO_MYSQL', $params );
    }

 }

それから私は呼び出す

$handle = dbconnect::init

$handle->select()....

これは最善の方法ですか? 誰かがより良い考えを持っていますか?

ありがとうございます。

p.s. ここではコードの書式がずさんになってしまってすみません。

2 Answer


3


たくさんの質問!

_ オープン接続をスマートに管理しますか? _

はい、最初のクエリを実行すると接続が作成され、それ以降のクエリは同じ接続を使用します。 これは、同じZend_Dbアダプタを*再利用*している場合に当てはまります。 私はたいていZend_Registryを使って私のアプリケーション全体で利用できるようにします。

$db = Zend_Db::factory(...) // create Db instance
Zend_Registry::set('db', $db);

//in another class or file somewhere
$db = Zend_Registry::get('db');
$db->query(...)//run a query

上記のコードは通常あなたのアプリケーションの* bootstrap *に入ります。 Zend_Dbクラスを初期化とインスタンス化のためだけに拡張するのは面倒なことではありません。

fetchRowに関して - 私は重要な違いは、実行されるクエリが1行に制限され、返されるオブジェクトがZend_Db_Table_Rowset(行の配列のような)ではなくZend_Db_Table_Rowであることであり、それほど遅くは実行されません。

fetchRowは問題ないはずなので、おそらくどこかに間違いがあるので機能しないコードを投稿してください。


0


  • dcauntの答えへの追加:* FetchAllは配列またはZend_Db_Talbe_Rowsetを返します-+ $ zendDbTableModel→ fetchAll()+`または `+ $ dbAdapter→ fetchAll()+`を実行するかどうかに応じて、 `+ fetchRow()+についても同様です。 モデルでfetchRowが機能しない場合、 `+ $ model→ getAdapter()→ fetchRow($ sqlString); +`を使用する方が簡単です