zend framework - update - Zend DB Framework examina la consulta para una actualización
zend pdo postgresql (4)
Así que puedes usar algo como esto:
$query = $db->select();
$query->from(''pages'', array(''url''));
echo $query->__toString();
para examinar el sql que Zend Db Framework va a utilizar para esa consulta SELECT. ¿Hay una manera equivalente de ver el SQL para una actualización?
$data = array(
''content'' => stripslashes(htmlspecialchars_decode($content))
);
$n = $db->update(''pages'', $data, "url = ''".$content."''");
??
Creo que otra forma es registrar la consulta SQL real, en lugar de cambiar el código de la biblioteca ZF, combinando los datos del generador de perfiles.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
$query = $db->getProfiler()->getLastQueryProfile()->getQuery();
$queryParams = $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$logger->log(''SQL: '' . $db->quoteInto($query, $queryParams), Zend_Log::DEBUG);
$db->getProfiler()->setEnabled(false);
No, no directamente, ya que Zend Framework construye y ejecuta el SQL dentro del método del adaptador Zend_Db_Adapter_Abstract :: update:
/**
* Updates table rows with specified data based on a WHERE clause.
*
* @param mixed $table The table to update.
* @param array $bind Column-value pairs.
* @param mixed $where UPDATE WHERE clause(s).
* @return int The number of affected rows.
*/
public function update($table, array $bind, $where = '''')
{
/**
* Build "col = ?" pairs for the statement,
* except for Zend_Db_Expr which is treated literally.
*/
$set = array();
foreach ($bind as $col => $val) {
if ($val instanceof Zend_Db_Expr) {
$val = $val->__toString();
unset($bind[$col]);
} else {
$val = ''?'';
}
$set[] = $this->quoteIdentifier($col, true) . '' = '' . $val;
}
$where = $this->_whereExpr($where);
/**
* Build the UPDATE statement
*/
$sql = "UPDATE "
. $this->quoteIdentifier($table, true)
. '' SET '' . implode('', '', $set)
. (($where) ? " WHERE $where" : '''');
/**
* Execute the statement and return the number of affected rows
*/
$stmt = $this->query($sql, array_values($bind));
$result = $stmt->rowCount();
return $result;
}
Puede, temporalmente, insertar un var_dump y salir dentro de este método para inspeccionar el SQL para asegurarse de que es correcto:
/**
* Build the UPDATE statement
*/
$sql = "UPDATE "
. $this->quoteIdentifier($table, true)
. '' SET '' . implode('', '', $set)
. (($where) ? " WHERE $where" : '''');
var_dump($sql); exit;
Recientemente encontré esto buscando una manera de depurar un zend_db_statement. Si alguien más encuentra esto con la misma búsqueda, puede usar la siguiente función.
Simplemente reemplace "self :: getDefaultAdapter ()" con su método de obtener una conexión de base de datos o adaptador.
/** * replace any named parameters with placeholders * @param string $sql sql string with placeholders, e.g. :compCode * @param array $bind array keyed on placeholders, e.g. array(''compCode'', ''WHMA20'') * * @return String sql statement with the placeholders replaced */ public static function debugNamedParamsSql($sql, array $bind) { $sqlDebug = $sql; foreach($bind as $needle => $replace) { $sqlDebug = str_replace( '':'' . $needle, self::getDefaultAdapter()->quote($replace), $sqlDebug ); } return $sqlDebug; }
Use Zend_Db_Profiler para capturar e informar sentencias de SQL:
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);
¡Recuerde apagar el perfilador si no lo necesita! Hablé con un compañero que pensó que tenía una pérdida de memoria, pero era el generador de perfiles que creaba una instancia de algunos objetos PHP para cada una de las millones de consultas SQL que estaba ejecutando.
PD: Deberías usar quoteInto()
en esa consulta:
$n = $db->update(''pages'', $data, $db->quoteInto("url = ?", $content));