Pergunta

Eu tenho um problema, provavelmente, muito simples que eu não consigo encontrar uma resposta satisfatória (subjetivamente visto) no Zend Framework manual ou outro lugar ...

Há tantas maneiras como posso entregar o meu variáveis ??PHP para meu SQL consultas que eu perdi a visão geral e, provavelmente, eu não possuem algum entendimento sobre citando em geral.

instruções preparadas

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

Eu entendo que com esta solução não preciso citar nada, porque as alças db isso para mim.

Consultando Zend_Db_Table e _Row objetos sobre a API

$ users = novos usuários ();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));  

Perguntas

Eu entendo que a) não é ok porque não é citado em tudo. Mas o que acontece com as outras versões, o que é o melhor? É c) ser tratada como uma declaração e citou automaticamente ou que eu preciso para uso d) quando eu uso o? identificador?

Foi útil?

Solução

Disclaimer: Essa informação é válida a partir da data lançamento original desta resposta. ZF muda muitas vezes, esta informação pode tornar-se ultrapassada com futuras versões, no entanto, este permanecerá inalterado para fins de arquivamento.

Se você passar uma string para o método fetchRow() de uma subclasse de Zend_Db_Table_Abstract (que você está fazendo), ele será tratado como uma parte where de uma instância Zend_Db_Table_Select.

Em outras palavras, internamente, Zend_Db_Table faz isso:

if (!($where instanceof Zend_Db_Table_Select)) {
    $select = $this->select();

    if ($where !== null) {
        $this->_where($select, $where);
    }

Então ...:

a) $users->fetchRow('userID = ' . $userID);  

não é citado em tudo.

b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  

é citado manualmente como um inteiro.

c) $users->fetchRow('userID = ?', $userID);  

é citado automaticamente por Zend_Db_Adapter_*::quoteInto()

d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

é realmente duplo citado, uma vez por você, e uma vez através da automática citando.

Tanto quanto "melhor" está em causa, eu recomendaria opção C. O quadro chamará automaticamente quoteInto no valor parametrizado.

Lembre-se: Você pode sempre passar uma instância de Zend_Db_Table_Select ou Zend_Db_Select ao método fetchRow() vez ...

Mais uma vez, em uma subclasse de Zend_Db_Table_Abstract, que ficaria assim:

$this->fetchRow($this->select()->where('userID = ?', $userID));

A mais de fazer isso, é que você pode construir consultas muito mais complexas, como você tem controle sobre muito, muito mais do que apenas a cláusula WHERE da consulta SQL. Em teoria, você poderia facilmente fazer:

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

Nota: Se aprovada uma instância de Zend_Db_Select, o método fetchRow() age exatamente como fetchAll() , exceto que internamente chama o método limit() do objeto de seleção, com um parâmetro de 1 .

Outras dicas

Eu me acostumei a

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top