したがって、次のようなものを使用できます。
$query = $db->select();
$query->from('pages', array('url'));
echo $query->__toString();
zend DbFrameworkがそのSELECTクエリに使用するSQLを調べます。更新のためにSQLを表示する同等の方法はありますか?
$data = array(
'content' => stripslashes(htmlspecialchars_decode($content))
);
$n = $db->update('pages', $data, "url = '".$content."'");
??
Zend_Db_Profiler を使用して、SQLステートメントをキャプチャしてレポートします。
_$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);
_
不要な場合は、プロファイラーをオフにすることを忘れないでください。私は彼がメモリリークを持っていると思ったある仲間と話しました、しかしそれは彼が実行していた何百万ものSQLクエリのそれぞれのためにいくつかのPHPオブジェクトをインスタンス化するプロファイラーでした。
PS:そのクエリでは quoteInto()
を使用する必要があります:
_$n = $db->update('pages', $data, $db->quoteInto("url = ?", $content));
_
いいえ、直接ではありません。ZendFrameworkはアダプタメソッドZend_Db_Adapter_Abstract :: update:内でSQLを構築して実行するためです。
/**
* 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;
}
一時的にvar_dumpを挿入し、このメソッド内で終了して、SQLを検査して正しいことを確認できます。
/**
* Build the UPDATE statement
*/
$sql = "UPDATE "
. $this->quoteIdentifier($table, true)
. ' SET ' . implode(', ', $set)
. (($where) ? " WHERE $where" : '');
var_dump($sql); exit;
最近、zend_db_statementをデバッグする方法を探してこれに出くわしました。他の誰かが同じ検索でこれに遭遇した場合は、次の機能を使用できます。
「self :: getDefaultAdapter()」をDB接続またはアダプタを取得するメソッドに置き換えるだけです。
/** * replace any named parameters with placeholders * @param string $sql sql string with placeholders, e.g. :theKey * @param array $bind array keyed on placeholders, e.g. array('theKey', 'THEVALUE') * * @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; }
別の方法として、プロファイラーデータを組み合わせて、ZFライブラリコードを変更するのではなく、実際のSQLクエリをログに記録する方法があります。
$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);