コード例 #1
0
 /**
  * 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;
 }
コード例 #2
0
ファイル: TrackerDebugger.php プロジェクト: joomlla/jissues
 /**
  * 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);
 }