Использование PDO в нескольких функциях - повторное использование подготовленного оператора - PullRequest
0 голосов
/ 04 мая 2011

У меня есть класс «test» с 2 функциями: одна для создания подготовленного оператора и одна для выполнения один или несколько раз.Проблема в том, как установить привязку в первой и заполнить переменные для другой функции.

class test {

    private static $moduleSql = "SELECT 
                                            id,
                                            module
                                        FROM 
                                            phs_pages
                                        WHERE 
                                            prettyurl = :prettyUrl AND
                                            mainId = :mainId
                                            ";

    private static function pre() {
        $db = Db_Db::getInstance();
        self::$preModuleSql = $db->prepare(self::$moduleSql);
        self::$preModuleSql->bindParam(':prettyUrl', $prettyUrl);
        self::$preModuleSql->bindParam(':mainId', $mainId);
    }

    private static function getClassByDb($mainId = 0, $id = 0) {
        $prettyUrl = self::$parts[$id];
        self::$preModuleSql->execute();
        self::$preModuleSql->debugDumpParams();
        $result = self::$preModuleSql->fetch(PDO::FETCH_ASSOC);

        // get lower level classes

        if (isset(self::$parts[$id + 1])) {
            self::getClassByDb($result['id'], $id + 1);
        } else {
            return $result;
        }
    }

}

Ответы [ 2 ]

1 голос
/ 04 мая 2011

С этим определением класса не так много вещей ... эхх.

Это должно выглядеть так:

class RepositoryException extends Exception{}

interface iRepository
{
    public function store( $key , PDOStatement  $statement );
    public function fetch( $key );
}

class StatementRepository implements iRepository{

    protected $_pool = array();

    public function store( $key , PDOStatement  $statement )
    {
        $this->_pool[ $key ] = $statement;
    }
    public function fetch( $key )
    {
        if ( !array_key_exists( $key , $this->_pool ) ){
            throw new RepositoryException( 
                "Statement with name '$key' does not exist" );
        }

        return $this->_pool[ $key ];
    }
}

$repo = new StatementRepository;

$foo = new Foo( $repo );
$bar = new Bar( $repo );

$db = new PDO('sqlite::memory:');
$statement = $db->prepare( 'SELECT .... ');

$repo->store( 'bljum' , $statement );

Таким образом, весь объект, который принял в конструкторе объект, который реализует iRepository, может fetch утверждений по имени.

У вашего класса не должно быть больше обязанностей, чем нужно. Если он предназначен для хранения подготовленных операторов, то он не должен иметь ничего общего с привязкой к ним параметров и выполнением чего-либо.

Вот что делает класс Foo:

class Foo
{
    protected $_repo = null;

    public function __construct( iRepository $repo )
    {
        $this->_repo = $repo;
    }

    public function ergo( $x , $y )
    {
        $statement = $this->_repo->fetch('bljum');
        //bind values
        $statement->execute();
    }

}
1 голос
/ 04 мая 2011

Вам не нужно связывать какие-либо параметры в первой функции, вам нужно сделать это во второй функции, прямо перед выполнением подготовленного оператора.

Редактировать: Кстати, вы также можете вызвать execute с массивом, который содержит ваши параметры в качестве ключей и значения, которые вы хотите отправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...