Вопрос по zend-framework, zend-db – Zend DB Framework исследует запрос на обновление

19

Таким образом, вы можете использовать что-то вроде этого:

$query = $db->select();
$query->from('pages', array('url'));
echo $query->__toString();

изучить sql, который Zend Db Framework собирается использовать для этого запроса SELECT. Есть ли эквивалентный способ просмотра SQL для обновления?

$data = array(
   'content'      => stripslashes(htmlspecialchars_decode($content))
);      
$n = $db->update('pages', $data, "url = '".$content."'");
??
не имеет отношения к решению, но __toString () автоматически вызывается, когда объект приводится к строке, поэтому echo $ query; легче набрать chris

Ваш Ответ

4   ответа
0

Я хотел бы сказать, что другой способ - записывать фактический запрос SQL, а не изменять код библиотеки ZF, объединяя данные профилировщика.

$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);
Нет. Я не пытался предположить, что это дикое предположение, основанное на Zend_Db_Profiler и Zend_Db API. Спасибо за проверку; D
Вы пробовали это? Он не работает в ZF 1.9.5. Когда вы передаете массив для quoteInto (), он присоединяет его к строке, разделенной запятыми, и подставляет результат для каждого параметра-заполнителя. Кроме того, quoteInto () не очень хорошо разбирается в вопросительных знаках внутри строковых литералов и вообще не поддерживает заполнители именованных параметров.
2

Нет, не напрямую, так как Zend Framework создает и выполняет SQL внутри метода адаптера 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;
}

Вы можете временно вставить var_dump и выйти из этого метода, чтобы проверить sql, чтобы убедиться, что он правильный:

/**
 * Build the UPDATE statement
 */
 $sql = "UPDATE "
         . $this->quoteIdentifier($table, true)
         . ' SET ' . implode(', ', $set)
         . (($where) ? " WHERE $where" : '');
 var_dump($sql); exit;
31

использование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);

Не забудьте выключить профилировщик, если он вам не нужен! Я разговаривал с одним человеком, который думал, что у него утечка памяти, но это был профилировщик, создающий несколько объектов PHP для каждого из миллионов запросов SQL, которые он выполнял.

PS: вы должны использоватьquoteInto() в этом запросе:

$n = $db->update('pages', $data, $db->quoteInto("url = ?", $content));
Я только держу его включенным в dev.
@caligoanimus: Честно говоря, я не уверен, я потерял след проекта ZF. Лучше всего спросить в списке рассылки ZF или прочитать код самостоятельно.
Может ли "где"? часть функции update () принимает массив? Такие как $ db-> gt; update («pages», $ data, array («url =?» = «$ Content», «date & gt;?» »= & Gt; $ date);
Спасибо, что сделал это. Указание мне на профилировщик помогло мне и в других областях.
0

Недавно наткнулся на это в поисках способа отладки zend_db_statement. Если кто-то сталкивался с таким же поиском, вы можете использовать следующую функцию.

Просто замените & quot; self :: getDefaultAdapter () & quot; с вашим методом получения подключения к БД или адаптера.

/**
 * 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;        
}

Похожие вопросы