Zend_Db_Table_Abstract和Zend_Db_Expr

时间:2012-02-28 20:11:34

标签: php zend-framework zend-db-table

我最近继承了一个使用ZF编写的应用程序,该应用程序在db中加密了各种字段。有很多模型扩展Zend_Db_Table_Abstract,代码类似于这个例子 -

<?php
class Partner extends Zend_Db_Table_Abstract {

    protected $_name = 'partner', $_primary = 'id';

    public function createPartner( $mobile ){

        $id = $this->insert( array(
                        'mobile' => new Zend_Db_Expr("AES_ENCRYPT('$mobile', 'random_key')"),
                        'createdOn' => date('Y-m-d H:i:s', mktime())
                    ) );

        $res = $this->find($id);
        return $res->current();
    }

}
?>

我对此代码的关注是$ mobile正在逐字传递到查询中。修改此值设置方式的最简洁方法是什么,以便它使用quoteInto或其他一些使用占位符来参数化查询的方法?

2 个答案:

答案 0 :(得分:5)

怎么样

public function createPartner( $mobile ){

    $id = $this->insert( array(
                    'mobile' => new Zend_Db_Expr($this->getAdapter()->quoteInto("AES_ENCRYPT(?, 'random_key')", $mobile)),
                    'createdOn' => date('Y-m-d H:i:s', mktime())
                ) );

    $res = $this->find($id);
    return $res->current();
}

这似乎有效,但是我遗失了一些问题吗?

答案 1 :(得分:1)

在这种情况下使用预备语句:

$mobile = new Zend_Db_Expr("AES_ENCRYPT('$mobile', 'random_key')");
$date = date('Y-m-d H:i:s', mktime());

$stmt = $this->getAdapter()->prepare('INSERT INTO'.$this->_name.'(mobile, createdOn) VALUES (?, ?)');
$stmt->execute(array($mobile, $date));