Eu escrevi muito do código para os parâmetros do banco de dados e citei no Zend Framework enquanto eu era o líder da equipe do projeto (até a versão 1.0).
Tentei incentivar as melhores práticas sempre que possível, mas tive que encontrar um equilíbrio com a facilidade de uso.
Observe que você sempre pode examinar o valor da string de um
Zend_Db_Select
objeto, para ver como decidiu fazer cotações. print $select; // invokes __toString() method
Você também pode usar o
Zend_Db_Profiler
para inspecionar o SQL que é executado em seu nome por Zend_Db
. $db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Aqui estão algumas respostas para suas perguntas específicas:
-
Zend_Db_Select::where('last_name=?', $lname)
Os valores são cotados adequadamente. Embora o "?
" se parece com um espaço reservado de parâmetro, neste método o argumento é realmente citado apropriadamente e interpolado. Portanto, não é um parâmetro de consulta verdadeiro. Na verdade, as duas instruções a seguir produzem exatamente a mesma consulta que o uso acima:
$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
No entanto, se você passar um parâmetro que é um objeto do tipoZend_Db_Expr
, então não é citado. Você é responsável pelos riscos de injeção de SQL, porque é interpolado literalmente, para dar suporte a valores de expressão:
$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Qualquer outra parte dessa expressão que precise ser citada ou delimitada é de sua responsabilidade. Por exemplo, se você interpolar qualquer variável PHP na expressão, a segurança é sua responsabilidade. Se você tem nomes de colunas que são palavras-chave SQL, você precisa delimitá-los comquoteIdentifier()
. Exemplo:
$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
O nome da tabela e os nomes das colunas são delimitados, a menos que você desativeAUTO_QUOTE_IDENTIFIERS
.
Os valores são parametrizados como parâmetros de consulta verdadeiros (não interpolados). A menos que o valor seja umZend_Db_Expr
objeto, nesse caso é interpolado literalmente, para que você possa inserir expressões ouNULL
como queiras.
-
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
O nome da tabela e os nomes das colunas são delimitados, a menos que você desativeAUTO_QUOTE_IDENTIFIERS
.
Os valores são parametrizados, a menos que sejamZend_Db_Expr
objetos, como eminsert()
método.
O$where
argumento não é filtrado, então você é responsável por quaisquer riscos de injeção de SQL nesse. Você pode usar oquoteInto()
para ajudar a tornar a cotação mais conveniente.