/** * Get a database explain statement. * * @param string $query The query to explain. * * @return string Formatted output * * @since 1.0 */ public function getExplain($query) { $db = $this->database; $db->setDebug(false); // Run an EXPLAIN EXTENDED query on the SQL query if possible: $explain = ''; $tableFormat = new TableFormat(); if (in_array($db->name, ['mysqli', 'mysql', 'postgresql'])) { $dbVersion56 = strncmp($db->name, 'mysql', 5) == 0 && version_compare($db->getVersion(), '5.6', '>='); if (stripos($query, 'select') === 0 || $dbVersion56 && (stripos($query, 'delete') === 0 || stripos($query, 'update') === 0)) { $db->setQuery('EXPLAIN ' . ($dbVersion56 ? 'EXTENDED ' : '') . $query); if ($db->execute()) { $explain = $tableFormat->fromArray($db->loadAssocList()); } else { $explain = sprintf(g11n3t('Failed EXPLAIN on query: %s'), htmlspecialchars($query)); } } } $db->setDebug(true); return $explain; }
/** * Render database information. * * @return string HTML markup for database debug * * @since 1.0 */ protected function renderDatabase() { $debug = array(); $dbLog = $this->getLog('db'); if (!$dbLog) { return ''; } $tableFormat = new TableFormat(); $sqlFormat = new SqlFormat(); $dbDebugger = new DatabaseDebugger($this->container->get('db')); $debug[] = sprintf(g11n4t('One database query', '%d database queries', count($dbLog)), count($dbLog)); $prefix = $dbDebugger->getPrefix(); foreach ($dbLog as $i => $entry) { $explain = $dbDebugger->getExplain($entry->sql); $debug[] = '<pre class="dbQuery">' . $sqlFormat->highlightQuery($entry->sql, $prefix) . '</pre>'; if (isset($entry->times) && is_array($entry->times)) { $debug[] = sprintf('Query Time: %.3f ms', ($entry->times[1] - $entry->times[0]) * 1000) . '<br />'; } // Tabs headers $debug[] = '<ul class="nav nav-tabs">'; if ($explain) { $debug[] = '<li><a data-toggle="tab" href="#queryExplain-' . $i . '">Explain</a></li>'; } if (isset($entry->trace) && is_array($entry->trace)) { $debug[] = '<li><a data-toggle="tab" href="#queryTrace-' . $i . '">Trace</a></li>'; } if (isset($entry->profile) && is_array($entry->profile)) { $debug[] = '<li><a data-toggle="tab" href="#queryProfile-' . $i . '">Profile</a></li>'; } $debug[] = '</ul>'; // Tabs contents $debug[] = '<div class="tab-content">'; if ($explain) { $debug[] = '<div id="queryExplain-' . $i . '" class="tab-pane">'; $debug[] = $explain; $debug[] = '</div>'; } if (isset($entry->trace) && is_array($entry->trace)) { $debug[] = '<div id="queryTrace-' . $i . '" class="tab-pane">'; $debug[] = $tableFormat->fromTrace($entry->trace); $debug[] = '</div>'; } if (isset($entry->profile) && is_array($entry->profile)) { $debug[] = '<div id="queryProfile-' . $i . '" class="tab-pane">'; $debug[] = $tableFormat->fromArray($entry->profile); $debug[] = '</div>'; } $debug[] = '</div>'; } return implode("\n", $debug); }