PDO在多个函数中的使用 - 重用预准备语句

时间:2011-05-03 21:18:18

标签: php pdo

我有一个带有2个函数的类“test”,一个用于创建预准备语句,另一个用于执行一次或多次。问题是如何在第一个中设置绑定并在另一个函数中填充变量。

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 个答案:

答案 0 :(得分:1)

您不需要在第一个函数中绑定任何参数,您需要在执行预准备语句之前在第二个函数中执行此操作。

修改顺便说一句,您还可以使用包含参数作为键的数组和要发送的值来调用execute

答案 1 :(得分:1)

这个类定义有很多问题..呃。

它应该是这样的:

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();
    }

}