orgtable - create links from these columns $indexes = array(); // orgtable => array(column => colno) - primary keys $columns = array(); // orgtable => array(column => ) - not selected columns in primary key $blobs = array(); // colno => bool - display bytes for blobs $types = array(); // colno => type - display char in $return = array(); // table => orgtable - mapping to use in EXPLAIN for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) { if (!$i) { echo "
\n"; echo "\n"; echo ""; for ($j=0; $j < count($row); $j++) { $field = $result->fetch_field(); $name = $field->name; $orgtable = (isset($field->orgtable) ? $field->orgtable : ""); $orgname = (isset($field->orgname) ? $field->orgname : $name); if ($orgtables && JUSH == "sql") { // MySQL EXPLAIN $links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null)); } elseif ($orgtable != "") { if (isset($field->table)) { $return[$field->table] = $orgtable; } if (!isset($indexes[$orgtable])) { // find primary key in each table $indexes[$orgtable] = array(); foreach (indexes($orgtable, $connection2) as $index) { if ($index["type"] == "PRIMARY") { $indexes[$orgtable] = array_flip($index["columns"]); break; } } $columns[$orgtable] = $indexes[$orgtable]; } if (isset($columns[$orgtable][$orgname])) { unset($columns[$orgtable][$orgname]); $indexes[$orgtable][$orgname] = $j; $links[$j] = $orgtable; } } if ($field->charsetnr == 63) { // 63 - binary $blobs[$j] = true; } $types[$j] = $field->type; echo "name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($name) . ($orgtables ? doc_link(array( 'sql' => "explain-output.html#explain_" . strtolower($name), 'mariadb' => "explain/#the-columns-in-explain-select", )) : "") ; } echo "\n"; } echo ""; foreach ($row as $key => $val) { $link = ""; if (isset($links[$key]) && !$columns[$links[$key]]) { if ($orgtables && JUSH == "sql") { // MySQL EXPLAIN $table = $row[array_search("table=", $links)]; $link = ME . $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table); } else { $link = ME . "edit=" . urlencode($links[$key]); foreach ($indexes[$links[$key]] as $col => $j) { $link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]); } } } elseif (is_url($val)) { $link = $val; } if ($val === null) { $val = "NULL"; } elseif ($blobs[$key] && !is_utf8($val)) { $val = "" . lang('%d byte(s)', strlen($val)) . ""; //! link to download } else { $val = h($val); if ($types[$key] == 254) { // 254 - char $val = "$val"; } } if ($link) { $val = "$val"; } // https://dev.mysql.com/doc/dev/mysql-server/latest/field__types_8h.html echo "$val"; } } echo ($i ? "
\n
" : "

" . lang('No rows.')) . "\n"; return $return; } /** Get referencable tables with single column primary key except self * @return array [$table_name => $field] */ function referencable_primary(string $self): array { $return = array(); // table_name => field foreach (table_status('', true) as $table_name => $table) { if ($table_name != $self && fk_support($table)) { foreach (fields($table_name) as $field) { if ($field["primary"]) { if ($return[$table_name]) { // multi column primary key unset($return[$table_name]); break; } $return[$table_name] = $field; } } } } return $return; } /** Print SQL "; } /** Generate HTML if $options are empty * @param string[] $options */ function select_input(string $attrs, array $options, ?string $value = "", string $onchange = "", string $placeholder = ""): string { $tag = ($options ? "select" : "input"); return "<$tag$attrs" . ($options ? ">