tableOid($table) . " ) c JOIN pg_class r ON r.oid = c.conrelid JOIN pg_namespace n ON n.oid = r.relnamespace JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = c.conkey[c.i] JOIN pg_attribute t ON t.attrelid = c.confrelid AND t.attnum = c.confkey[c.i] ORDER BY c.i"; } else { // we couldn't use the same query in MySQL and MS SQL because unique_constraint_name is not table-specific in MySQL and referenced_table_name is not available in MS SQL $query = "SELECT s.table_name table_name, s.constraint_name constraint_name, s.column_name column_name, " . (Adminer\JUSH == "sql" ? "referenced_column_name" : "t.column_name") . " referenced_column_name" . (Adminer\JUSH == "sql" ? "" : ", s.table_schema ns") . " FROM information_schema.key_column_usage s" . (Adminer\JUSH == "sql" ? " WHERE table_schema = " . Adminer\q(Adminer\DB) . " AND referenced_table_schema = " . Adminer\q(Adminer\DB) . " AND referenced_table_name" : " JOIN information_schema.referential_constraints r USING (constraint_catalog, constraint_schema, constraint_name) JOIN information_schema.key_column_usage t ON r.unique_constraint_catalog = t.constraint_catalog AND r.unique_constraint_schema = t.constraint_schema AND r.unique_constraint_name = t.constraint_name AND r.constraint_catalog = t.constraint_catalog AND r.unique_constraint_name = t.constraint_name AND s.position_in_unique_constraint = t.ordinal_position WHERE t.table_catalog = " . Adminer\q(Adminer\DB) . " AND t.table_schema = " . Adminer\q("$_GET[ns]") . " AND t.table_name") . " = " . Adminer\q($table) . " ORDER BY s.ordinal_position"; } foreach (Adminer\get_rows($query, null, "") as $row) { $ns = ($row["ns"] != $_GET["ns"] ? $row["ns"] : ""); // ns is not selected in MySQL $key = Adminer\idf_escape($ns) . "." . Adminer\idf_escape($row["table_name"]); // the same table name can be in several schemas $return[$key]["table"] = $row["table_name"]; $return[$key]["ns"] = $ns; $return[$key]["keys"][$row["constraint_name"]][$row["column_name"]] = $row["referenced_column_name"]; } foreach ($return as $key => $val) { // table_status1() looks only in the current schema $name = Adminer\adminer()->tableName($val["ns"] != "" ? array("Name" => $val["table"]) : Adminer\table_status1($val["table"], true)); if ($name != "") { $search = preg_quote($tableName); $separator = '(:|\s*-)?\s+'; $return[$key]["name"] = (preg_match("(^$search$separator(.+)|^(.+?)$separator$search\$)iu", $name, $match) ? $match[2] . $match[3] : $name); } else { unset($return[$key]); } } return $return; } function backwardKeysPrint($backwardKeys, $row) { foreach ($backwardKeys as $backwardKey) { $table = $backwardKey["table"]; $ns = $backwardKey["ns"]; $me = ($ns != "" ? preg_replace('~ns=[^&]*~', "ns=" . Adminer\url_escape($ns), Adminer\ME) : Adminer\ME); foreach ($backwardKey["keys"] as $cols) { $link = $me . 'select=' . Adminer\url_escape($table); $i = 0; foreach ($cols as $column => $val) { if (!isset($row[$val])) { continue 2; } $link .= Adminer\where_link($i++, $column, $row[$val]); } echo "" . ($ns != "" ? "" . Adminer\h($ns) . "." : "") . Adminer\h(preg_replace('(^' . preg_quote($_GET["select"]) . (substr($_GET["select"], -1) == 's' ? '?' : '') . '_)', '_', $backwardKey["name"])) . ""; $link = $me . 'edit=' . Adminer\url_escape($table); foreach ($cols as $column => $val) { $link .= "&set[" . Adminer\url_escape(Adminer\bracket_escape($column)) . "]=" . Adminer\url_escape($row[$val]); } echo "+ "; } } } function screenshot() { return "https://www.adminer.org/static/plugins/backward-keys.png"; } protected $translations = array( 'cs' => array( '' => 'Zobrazí odkazy na tabulky odkazující na aktuální řádek, stejně jako Adminer Editor', 'New item' => 'Nová položka', ), 'de' => array( '' => 'Links zu Tabellen anzeigen die auf die aktuelle Zeile verweisen, wie im Adminer Editor', 'New item' => 'Neuer Datensatz', ), 'hr' => array( '' => 'Prikazuje veze na tablice koje referenciraju trenutni redak, kao u Adminer Editoru', 'New item' => 'Nova stavka', ), 'ja' => array( '' => 'Adminer Editor と同様に、カレント行を参照しているテーブルへのリンクを表示', 'New item' => '新規レコードを挿入', ), 'pl' => array( '' => 'Wyświetlaj linki do tabel odnoszących się do bieżącego wiersza, tak samo jak w Adminer Editorze', // Claude Opus 5 'New item' => 'Nowy rekord', ), 'ro' => array( '' => 'Afișează link-uri către tabelele care fac referire la rândul curent, la fel ca în Adminer Editor', // Claude Opus 5 ), 'sk' => array( '' => 'Zobrazí odkazy na tabuľky odkazujúce na aktuálny riadok, rovnako ako Adminer Editor', // Claude Opus 5 ), 'zh' => array( '' => '显示引用当前行的表的链接,与 Adminer Editor 中相同', // Claude Opus 5 'New item' => '新建数据', // Claude Opus 5 ), ); }