Zend_Db_Table_Abstract и Zend_Db_Expr - PullRequest
       14

Zend_Db_Table_Abstract и Zend_Db_Expr

2 голосов
/ 29 февраля 2012

Я недавно унаследовал приложение, написанное с использованием ZF, с различными полями, зашифрованными в БД.Существует множество моделей, расширяющих 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 ]

5 голосов
/ 29 февраля 2012

Как насчет

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 голос
/ 29 февраля 2012

использовать подготовленное заявление в этом случае:

$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));
...