2

そのため、私はこの問題を数日間自分でデバッグしようとしていますが、期待した結果が得られない理由がわからないようです。

私のコードはかなり複雑で、DB接続を確立するには、3つのクラスと1つの構成ファイルにまたがっています。

しかし、基本的に私の最終的な使用法は

$this->db('test')->query('SELECT * FROM test1');

これにより、クエリのエイリアスによってデータベースへの接続が確立され、test結果が返されるので、これまでのところ問題ありません。

今、私の問題は、新しいPDOオブジェクトを作成しようとしたときです。

$this->db('test2')->query('SELECT * FROM test2');

オブジェクトに呼び出さtest2れたテーブルがないため、これは何も返しません。test1

しかし、私がこれを行う場合

$this->db('test2')->query('SELECT * FROM test1');

これで、最初のPDOオブジェクトから同じ結果が返されます。

コードのすべての行をトレースおよび追跡して、正しいパラメーターがデータベースクラスに渡されていること、および各接続が対応するデータベースに適切に確立されていることを確認しました。

今私の質問は、複数のdatbase pdo接続を持つことができますか?もしそうなら、PDOオプションで設定する必要がある特別なフラグがありますか?私の接続はどこかにキャッシュされており、この混乱を引き起こしていますか?

これは、接続の配列に格納されている新しいクラスオブジェクトごとのPDO宣言です。

try
        {
            $this->_con = new PDO(
                "mysql:host=" . $host . ";
                 port=" . $port . ";
                 dbname=" . $name, $user, $pass
            );

            $this->_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        } catch(PDOException $e) {

            // TODO: push all $e methods to the developer debugger
            echo "Database Error: ". $e->getMessage();
        }

接続を使用するコードを編集する

ステップ1:親クラスへの呼び出し

public function __call($name, $params)
        {
            $class = $name . '_system_helper';
            $hash  = md5($class . $params);

            if (class_exists($class))
            {
                if (!array_key_exists($hash, $this->_sys_helper))
                {
                    if (method_exists($class, 'init'))
                    {
                        $this->_sys_helper[$hash] = call_user_func_array(array($class, 'init'), $params);

                    } else {

                        $this->_sys_helper[$hash] = call_user_func_array($class, $params);
                    }
                }

                return $this->_sys_helper[$hash];
            }

            return null;
        }

ステップ2:親クラスから呼び出されます

class DB_System_Helper extends Jinxup
    {
        private $_con = null;

        public function __construct($end = null)
        {
            $mode = null;
            $host = null;
            $name = null;
            $user = null;
            $pass = null;
            $port = null;

            if (isset($this->config['database']['mode']))
            {
                $mode = $this->config['database']['mode'] == 'production' ? 'production' : 'development';

                if (count($this->config['database'][$mode]) > 1)
                {
                    foreach ($this->config['database'][$mode] as $key => $database)
                    {
                        if ($database['@attr']['alias'] == $end)
                        {
                            $host = $this->config['database'][$mode][$key]['host'];
                            $name = $this->config['database'][$mode][$key]['name'];
                            $user = $this->config['database'][$mode][$key]['user'];
                            $pass = $this->config['database'][$mode][$key]['pass'];
                            $port = $this->config['database'][$mode][$key]['port'];
                        }
                    }

                } else {

                    $host = $this->config['database'][$mode]['host'];
                    $name = $this->config['database'][$mode]['name'];
                    $user = $this->config['database'][$mode]['user'];
                    $pass = $this->config['database'][$mode]['pass'];
                    $port = $this->config['database'][$mode]['port'];
                }

                $this->_con = new PDO_Database_Helper($host, $name, $user, $pass, $port);

            } else {

                echo 'No database mode specified';
            }
        }

        public function __call($name, $param)
        {
            return call_user_func_array(array($this->_con, $name), $param);
        }
    }

ステップ3:DB_System_Helperから呼び出されます

class PDO_Database_Helper extends Jinxup
{
    private $_con = null;
    private $_id  = 0;

    public function __construct($host, $name, $user, $pass, $port = 3306)
    {
        try
        {
            $this->_con = new PDO(
                "mysql:host=" . $host . ";
                 port=" . $port . ";
                 dbname=" . $name, $user, $pass
            );

            $this->_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        } catch(PDOException $e) {

            // TODO: push all $e methods to the developer debugger
            echo "Database Error: ". $e->getMessage();
        }
    }

        [...]
}
4

1 に答える 1

1

$this->_sys_helper実行しているハッシュが、配列内の各接続を「名前空間化」するのに十分であると確信していますか?

問題は第一段階にあるのではないかと思います。

    public function __call($name, $params)
    {
        $class = $name . '_system_helper';
        $hash  = md5($class . $params);

        if (class_exists($class))
        {
            if (!array_key_exists($hash, $this->_sys_helper))
            {
                if (method_exists($class, 'init'))
                {
                    $this->_sys_helper[$hash] = call_user_func_array(array($class, 'init'), $params);

                } else {

                    $this->_sys_helper[$hash] = call_user_func_array($class, $params);
                }
            }

  >>>>>>>>>>>>>> are you sure this is not returning the wrong
  >>>>>>>>>>>>>> connection because of how the hashing is working?
            return $this->_sys_helper[$hash];
        }

        return null;
    }
于 2012-09-20T06:25:03.953 に答える