Zend DB Framework examine query for an update

前端 未结 4 1708
迷失自我
迷失自我 2020-12-23 10:33

So you can use something like this:

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

to

相关标签:
4条回答
  • 2020-12-23 11:05

    No, not directly, since Zend Framework builds and executes the SQL inside the adapter method 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;
    }
    

    You can, temporarily, insert a var_dump and exit inside this method to inspect the sql to ensure that it is correct:

    /**
     * Build the UPDATE statement
     */
     $sql = "UPDATE "
             . $this->quoteIdentifier($table, true)
             . ' SET ' . implode(', ', $set)
             . (($where) ? " WHERE $where" : '');
     var_dump($sql); exit;
    
    0 讨论(0)
  • 2020-12-23 11:08

    Recently came across this looking for a way to debug a zend_db_statement. If anyone else comes across this with the same search, you can use the following function.

    Just replace "self::getDefaultAdapter()" with your method of getting a DB connection or adapter.

    /**
     * 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;        
    }
    
    0 讨论(0)
  • 2020-12-23 11:12

    Use Zend_Db_Profiler to capture and report SQL statements:

    $db->getProfiler()->setEnabled(true);
    $db->update( ... );
    print $db->getProfiler()->getLastQueryProfile()->getQuery();
    print_r($db->getProfiler()->getLastQueryProfile()->getQueryParams());
    $db->getProfiler()->setEnabled(false);
    

    Remember to turn the profiler off if you don't need it! I talked to one fellow who thought he had a memory leak, but it was the profiler instantiating a few PHP objects for each of the millions of SQL queries he was running.

    PS: You should use quoteInto() in that query:

    $n = $db->update('pages', $data, $db->quoteInto("url = ?", $content));
    
    0 讨论(0)
  • 2020-12-23 11:21

    I quess another way is to log the actual SQL query, rather than changing the ZF library code, by combining the profiler data.

    $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);
    
    0 讨论(0)
提交回复
热议问题