Napsal jsem hodně kódu pro parametry databáze a citace v Zend Frameworku, když jsem byl vedoucím týmu projektu (až do verze 1.0).
Snažil jsem se podporovat osvědčené postupy, kde to bylo možné, ale musel jsem najít rovnováhu se snadným používáním.
Všimněte si, že vždy můžete prozkoumat hodnotu řetězce Zend_Db_Select
objekt, abyste viděli, jak se rozhodlo citovat.
print $select; // invokes __toString() method
Můžete také použít Zend_Db_Profiler
ke kontrole SQL, který je spuštěn vaším jménem pomocí Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Zde je několik odpovědí na vaše konkrétní otázky:
-
Zend_Db_Select::where('last_name=?', $lname)
Hodnoty jsou uvedeny správně. Ačkoli „
?
“ vypadá jako zástupný symbol parametru, v této metodě je argument ve skutečnosti vhodně citován a interpolován. Nejde tedy o skutečný parametr dotazu. Následující dva příkazy ve skutečnosti vytvářejí přesně stejný dotaz jako výše uvedené použití:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Pokud však předáte parametr, který je objektem typu
Zend_Db_Expr
, pak to není citováno. Jste zodpovědní za rizika vložení SQL, protože je doslovně interpolován, aby podporoval hodnoty výrazu:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Jakákoli jiná část tohoto výrazu, kterou je třeba citovat nebo oddělit, je vaší odpovědností. Pokud například do výrazu interpolujete jakékoli proměnné PHP, za bezpečnost odpovídáte vy. Pokud máte názvy sloupců, které jsou klíčovými slovy SQL, musíte je sami oddělit pomocí
quoteIdentifier()
. Příklad:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Pokud nevypnete
AUTO_QUOTE_IDENTIFIERS
, jsou názvy tabulek a názvy sloupců odděleny .Hodnoty jsou parametrizovány jako skutečné parametry dotazu (neinterpolované). Pokud hodnota není
Zend_Db_Expr
objekt, v takovém případě je interpolován doslovně, takže můžete vkládat výrazy neboNULL
nebo cokoli jiného. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Pokud nevypnete
AUTO_QUOTE_IDENTIFIERS
, jsou názvy tabulek a názvy sloupců odděleny .Hodnoty jsou parametrizované, pokud to nejsou
Zend_Db_Expr
objektů, jako vinsert()
metoda.$where
argument není vůbec filtrován, takže jste odpovědní za všechna rizika vložení SQL v tomto případě. Můžete použítquoteInto()
metoda, která vám pomůže učinit citování pohodlnějším.