1
try
 {
    $dbAdapter = Zend_Db::factory($config->general->db->adapter, $config->general->db-        >config->toArray());

    // first 
    $sql = 'select * from department';
    $results = $dbAdapter->fetchAll($sql);

    // second 
    $db = $dbAdapter->getConnection();
    $sql = 'select * from department';
    $results = $db->fetchAll($sql);
}
catch (Zend_Db_Adapter_Exception $exc)
{
     echo $exc->getTraceAsString();
}
catch (Zend_Exception $exc)
{
   echo $exc->getTraceAsString();
}

最初の方法を使用すると、アプリケーションは正常に動作しますが、2 番目の方法 (接続を取得してから SQL スクリプトを実行) を使用すると、動作せず、さらに悪いことに、アプリケーションが行でブロックされます ($db-> fetchAll($sql)) であり、エラーは返されません。理由は何ですか?誰かがこの問題に遭遇しましたか? ところで、私は PHP を学ぶ新入生です。一緒に学ぶ友達を作りたいと思っています。前もって感謝します。

4

1 に答える 1

2

Zend_Dbは、本質的に、ZendFrameworkへの単一のデータベース抽象化インターフェイスを提供する多くのRDBMSPHPモジュールのラッパーです。つまり、MySQL、MSSQL、PostgreSQLなどを使用している場合でも、Zend_Dbを使用してSQLリクエストをほぼ同じ方法で作成することになります。

このgetConnection()メソッドは、データベースを強制的に接続し、データベースレイヤーの実際の基盤となるリソース/オブジェクトを返します。つまり、mysqliを使用する場合、getConnection()はmysqliタイプのオブジェクトを返します。(http://www.php.net/manual/en/class.mysqli.php)

次に、mysqliインスタンスクラスを$db変数に割り当て、を呼び出そうとしますfetchAll()fetchAll()、クラスmysqliには存在しません。この時点でエラーがスローされる可能性があります。エラーレポートがない場合は、空白のページが表示されます。

たとえば、次のコードを確認してください。

<?php
class A {}

$a = new A();
$a->doesNotExist();

これはスローします:

PHPの致命的なエラー:5行目のfoobar.phpで未定義のメソッドA :: doesNotExist()を呼び出します

したがって、を呼び出してgetConnection()データベース層を強制的にRDBMSに接続することができますが、私が知る限り、実際のリソース/オブジェクトがによって返される必要はありませんgetConnection()。getConnection()の詳細と、なぜ誰かがリソースを必要とするのかについては、Zend_Dbのドキュメント(http://framework.zend.com/manual/en/zend.db.adapter )の「ManagingLazyconnections」を参照してください。 .html

通常どおりにアプリケーションを続行する必要があります。

$sql = 'select * from department';
$resource = $dbAdapter->getConnection();
$results = $dbAdapter->fetchAll($sql);

ところで、よく聞かれる質問。

于 2012-06-27T07:29:33.593 に答える