mirror of
https://github.com/vrana/adminer.git
synced 2025-08-30 17:50:00 +02:00
Compare commits
44 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
fd1691cb1d | ||
|
d5bf51b2a7 | ||
|
b7b4157bcb | ||
|
10b00e13b1 | ||
|
45caae1660 | ||
|
36e9a4d6e1 | ||
|
9b58ecf925 | ||
|
36ade4e197 | ||
|
6a5b0abbb4 | ||
|
33234fef19 | ||
|
4b6833ba65 | ||
|
d846eac97e | ||
|
0eab60c338 | ||
|
7f32e26759 | ||
|
327041874e | ||
|
37a3dd6c6b | ||
|
02f5cbdc4d | ||
|
deea21dd2d | ||
|
f00f7a0e19 | ||
|
48292b70e8 | ||
|
15900301ee | ||
|
0e6f1972e9 | ||
|
4e91550b14 | ||
|
333da64cdb | ||
|
a2ec51e948 | ||
|
d114535911 | ||
|
7247f801bd | ||
|
21f0481a1d | ||
|
7defb7787d | ||
|
659003e07f | ||
|
2cb426b464 | ||
|
2117f224b6 | ||
|
7ea6266482 | ||
|
edb79998a9 | ||
|
41043f8dad | ||
|
31bbadb479 | ||
|
a2fbcbe28e | ||
|
a623cd69de | ||
|
ed346be313 | ||
|
7eaa57fc0b | ||
|
c275362c30 | ||
|
b2606cda0e | ||
|
da76e6b9b8 | ||
|
83fe083f2f |
@@ -1,5 +1,7 @@
|
||||
language: php
|
||||
php:
|
||||
- '5.6'
|
||||
- '7.1'
|
||||
- 5.6
|
||||
- 7.1
|
||||
- 7.2
|
||||
- 7.3
|
||||
script: git diff --name-only $TRAVIS_COMMIT_RANGE | grep '\.php$' | xargs -n1 -P8 php -l | grep -v 'No syntax errors'; test $? -eq 1
|
||||
|
@@ -27,6 +27,10 @@ if ($row["auto_increment_col"]) {
|
||||
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
|
||||
}
|
||||
|
||||
if ($_POST) {
|
||||
set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
|
||||
}
|
||||
|
||||
if ($_POST && !process_fields($row["fields"]) && !$error) {
|
||||
if ($_POST["drop"]) {
|
||||
queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
|
||||
@@ -173,27 +177,16 @@ foreach ($engines as $engine) {
|
||||
<div class="scrollable">
|
||||
<table cellspacing="0" id="edit-fields" class="nowrap">
|
||||
<?php
|
||||
$comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
|
||||
if (!$_POST && !$comments) {
|
||||
foreach ($row["fields"] as $field) {
|
||||
if ($field["comment"] != "") {
|
||||
$comments = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys, $comments);
|
||||
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<p>
|
||||
<?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
|
||||
<?php echo checkbox("defaults", 1, !$_POST || $_POST["defaults"], lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
|
||||
<?php echo ($_POST ? "" : script("editingHideDefaults();")); ?>
|
||||
<?php echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
|
||||
<?php echo (support("comment")
|
||||
? "<label><input type='checkbox' name='comments' value='1' class='jsonly'" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
|
||||
. script("qsl('input').onclick = partial(editingCommentsClick, true);")
|
||||
. ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
|
||||
? checkbox("comments", 1, ($_POST ? $_POST["comments"] : adminer_setting("comments")), lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
|
||||
. ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '">'
|
||||
: '')
|
||||
; ?>
|
||||
<p>
|
||||
@@ -227,4 +220,4 @@ foreach ($row["partition_names"] as $key => $val) {
|
||||
?>
|
||||
<input type="hidden" name="token" value="<?php echo $token; ?>">
|
||||
</form>
|
||||
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick.call(qs('#form')['comments']);" : "")); ?>
|
||||
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick(qs('#form')['comments']);" : "")); ?>
|
||||
|
@@ -140,7 +140,7 @@ if ($adminer->homepage()) {
|
||||
echo "<p>" . lang('Move to other database') . ": ";
|
||||
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
|
||||
echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
|
||||
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
|
||||
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'> " . checkbox("overwrite", 1, $_POST["overwrite"], lang('overwrite')) : "");
|
||||
echo "\n";
|
||||
}
|
||||
echo "<input type='hidden' name='all' value=''>"; // used by trCheck()
|
||||
|
@@ -259,7 +259,7 @@ if (isset($_GET["clickhouse"])) {
|
||||
}
|
||||
|
||||
function unconvert_field($field, $return) {
|
||||
if (in_array($field['type'], ["Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"])) {
|
||||
if (in_array($field['type'], array("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"))) {
|
||||
return "to$field[type]($return)";
|
||||
}
|
||||
return $return;
|
||||
|
@@ -84,7 +84,7 @@ if (isset($_GET["elastic"])) {
|
||||
var $num_rows, $_rows;
|
||||
|
||||
function __construct($rows) {
|
||||
$this->num_rows = count($this->_rows);
|
||||
$this->num_rows = count($rows);
|
||||
$this->_rows = $rows;
|
||||
reset($this->_rows);
|
||||
}
|
||||
@@ -148,7 +148,7 @@ if (isset($_GET["elastic"])) {
|
||||
$start = microtime(true);
|
||||
$search = $this->_conn->query($query, $data);
|
||||
if ($print) {
|
||||
echo $adminer->selectQuery("$query: " . print_r($data, true), $start, !$search);
|
||||
echo $adminer->selectQuery("$query: " . json_encode($data), $start, !$search);
|
||||
}
|
||||
if (!$search) {
|
||||
return false;
|
||||
|
@@ -526,7 +526,7 @@ if (isset($_GET["mongo"])) {
|
||||
$op = '$regex';
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
continue 2;
|
||||
}
|
||||
if ($type == 'and') {
|
||||
$data['$and'][] = array($col => array($op => $val));
|
||||
|
@@ -350,7 +350,7 @@ if (isset($_GET["mssql"])) {
|
||||
|
||||
function table_status($name = "") {
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
|
||||
foreach (get_rows("SELECT ao.name AS Name, ao.type_desc AS Engine, (SELECT value FROM fn_listextendedproperty(default, 'SCHEMA', schema_name(schema_id), 'TABLE', ao.name, null, null)) AS Comment FROM sys.all_objects AS ao WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
|
||||
if ($name != "") {
|
||||
return $row;
|
||||
}
|
||||
@@ -368,6 +368,7 @@ if (isset($_GET["mssql"])) {
|
||||
}
|
||||
|
||||
function fields($table) {
|
||||
$comments = get_key_vals("SELECT objname, cast(value as varchar) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)");
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default]
|
||||
FROM sys.all_columns c
|
||||
@@ -389,6 +390,7 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
|
||||
"collation" => $row["collation_name"],
|
||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
|
||||
"primary" => $row["is_identity"], //! or indexes.is_primary_key
|
||||
"comment" => $comments[$row["name"]],
|
||||
);
|
||||
}
|
||||
return $return;
|
||||
@@ -456,6 +458,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
|
||||
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
|
||||
$alter = array();
|
||||
$comments = array();
|
||||
foreach ($fields as $field) {
|
||||
$column = idf_escape($field[0]);
|
||||
$val = $field[1];
|
||||
@@ -463,6 +466,8 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
$alter["DROP"][] = " COLUMN $column";
|
||||
} else {
|
||||
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]);
|
||||
$comments[$field[0]] = $val[5];
|
||||
unset($val[5]);
|
||||
if ($field[0] == "") {
|
||||
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
|
||||
} else {
|
||||
@@ -488,6 +493,11 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
foreach ($comments as $key => $val) {
|
||||
$comment = substr($val, 9); // 9 - strlen(" COMMENT ")
|
||||
queries("EXEC sp_dropextendedproperty @name = N'MS_Description', @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
|
||||
queries("EXEC sp_addextendedproperty @name = N'MS_Description', @value = " . $comment . ", @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -632,7 +642,7 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
|
||||
}
|
||||
|
||||
function support($feature) {
|
||||
return preg_match('~^(columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
|
||||
return preg_match('~^(comment|columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
|
||||
}
|
||||
|
||||
$jush = "mssql";
|
||||
|
@@ -238,11 +238,15 @@ if (!defined("DRIVER")) {
|
||||
$options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => false);
|
||||
$ssl = $adminer->connectSsl();
|
||||
if ($ssl) {
|
||||
$options += array(
|
||||
PDO::MYSQL_ATTR_SSL_KEY => $ssl['key'],
|
||||
PDO::MYSQL_ATTR_SSL_CERT => $ssl['cert'],
|
||||
PDO::MYSQL_ATTR_SSL_CA => $ssl['ca'],
|
||||
);
|
||||
if (!empty($ssl['key'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_KEY] = $ssl['key'];
|
||||
}
|
||||
if (!empty($ssl['cert'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_CERT] = $ssl['cert'];
|
||||
}
|
||||
if (!empty($ssl['ca'])) {
|
||||
$options[PDO::MYSQL_ATTR_SSL_CA] = $ssl['ca'];
|
||||
}
|
||||
}
|
||||
$this->dsn(
|
||||
"mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)),
|
||||
@@ -578,24 +582,18 @@ if (!defined("DRIVER")) {
|
||||
* @return array array($name => array("db" => , "ns" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => ))
|
||||
*/
|
||||
function foreign_keys($table) {
|
||||
global $connection, $on_actions;
|
||||
static $pattern = '(?:`(?:[^`]|``)+`)|(?:"(?:[^"]|"")+")';
|
||||
$return = array();
|
||||
$create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
|
||||
if ($create_table) {
|
||||
preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY ?\\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE ($on_actions))?(?: ON UPDATE ($on_actions))?~", $create_table, $matches, PREG_SET_ORDER);
|
||||
foreach ($matches as $match) {
|
||||
preg_match_all("~$pattern~", $match[2], $source);
|
||||
preg_match_all("~$pattern~", $match[5], $target);
|
||||
$return[idf_unescape($match[1])] = array(
|
||||
"db" => idf_unescape($match[4] != "" ? $match[3] : $match[4]),
|
||||
"table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]),
|
||||
"source" => array_map('idf_unescape', $source[0]),
|
||||
"target" => array_map('idf_unescape', $target[0]),
|
||||
"on_delete" => ($match[6] ? $match[6] : "RESTRICT"),
|
||||
"on_update" => ($match[7] ? $match[7] : "RESTRICT"),
|
||||
);
|
||||
}
|
||||
foreach (get_rows("SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND TABLE_NAME = " . q($table)) as $row) {
|
||||
$columns = get_key_vals("SELECT COLUMN_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = " . q($row["CONSTRAINT_NAME"]) . " ORDER BY ORDINAL_POSITION");
|
||||
$db = $row["UNIQUE_CONSTRAINT_SCHEMA"];
|
||||
$return[$row["CONSTRAINT_NAME"]] = array(
|
||||
"db" => ($db == DB ? "" : $db),
|
||||
"table" => $row["REFERENCED_TABLE_NAME"],
|
||||
"source" => array_keys($columns),
|
||||
"target" => array_values($columns),
|
||||
"on_delete" => $row["DELETE_RULE"],
|
||||
"on_update" => $row["UPDATE_RULE"],
|
||||
);
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
@@ -810,7 +808,8 @@ if (!defined("DRIVER")) {
|
||||
queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
|
||||
foreach ($tables as $table) {
|
||||
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
|
||||
if (!queries("CREATE TABLE $name LIKE " . table($table))
|
||||
if (($_POST["overwrite"] && !queries("\nDROP TABLE IF EXISTS $name"))
|
||||
|| !queries("CREATE TABLE $name LIKE " . table($table))
|
||||
|| !queries("INSERT INTO $name SELECT * FROM " . table($table))
|
||||
) {
|
||||
return false;
|
||||
@@ -825,7 +824,8 @@ if (!defined("DRIVER")) {
|
||||
foreach ($views as $table) {
|
||||
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
|
||||
$view = view($table);
|
||||
if (!queries("CREATE VIEW $name AS $view[select]")) { //! USE to avoid db.table
|
||||
if (($_POST["overwrite"] && !queries("DROP VIEW IF EXISTS $name"))
|
||||
|| !queries("CREATE VIEW $name AS $view[select]")) { //! USE to avoid db.table
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1077,7 +1077,7 @@ if (!defined("DRIVER")) {
|
||||
$return = "CONV($return, 2, 10) + 0";
|
||||
}
|
||||
if (preg_match("~geometry|point|linestring|polygon~", $field["type"])) {
|
||||
$return = (min_version(8) ? "ST_" : "") . "GeomFromText($return)";
|
||||
$return = (min_version(8) ? "ST_" : "") . "GeomFromText($return, SRID($field[field]))";
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
@@ -324,7 +324,7 @@ ORDER BY 1";
|
||||
|
||||
function table_status($name = "") {
|
||||
$return = array();
|
||||
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", CASE WHEN c.relhasoids THEN 'oid' ELSE '' END AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
||||
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
||||
FROM pg_class c
|
||||
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
|
||||
WHERE relkind IN ('r', 'm', 'v', 'f')
|
||||
@@ -438,9 +438,7 @@ ORDER BY conkey, conname") as $row) {
|
||||
|
||||
function view($name) {
|
||||
global $connection;
|
||||
return array("select" => trim($connection->result("SELECT view_definition
|
||||
FROM information_schema.views
|
||||
WHERE table_schema = current_schema() AND table_name = " . q($name))));
|
||||
return array("select" => trim($connection->result("SELECT pg_get_viewdef(" . $connection->result("SELECT oid FROM pg_class WHERE relname = " . q($name)) . ")")));
|
||||
}
|
||||
|
||||
function collations() {
|
||||
@@ -483,6 +481,9 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
|
||||
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
|
||||
$alter = array();
|
||||
$queries = array();
|
||||
if ($table != "" && $table != $name) {
|
||||
$queries[] = "ALTER TABLE " . table($table) . " RENAME TO " . table($name);
|
||||
}
|
||||
foreach ($fields as $field) {
|
||||
$column = idf_escape($field[0]);
|
||||
$val = $field[1];
|
||||
@@ -498,7 +499,7 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
|
||||
$alter[] = ($table != "" ? "ADD " : " ") . implode($val);
|
||||
} else {
|
||||
if ($column != $val[0]) {
|
||||
$queries[] = "ALTER TABLE " . table($table) . " RENAME $column TO $val[0]";
|
||||
$queries[] = "ALTER TABLE " . table($name) . " RENAME $column TO $val[0]";
|
||||
}
|
||||
$alter[] = "ALTER $column TYPE$val[1]";
|
||||
if (!$val[6]) {
|
||||
@@ -507,7 +508,7 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
|
||||
}
|
||||
}
|
||||
if ($field[0] != "" || $val5 != "") {
|
||||
$queries[] = "COMMENT ON COLUMN " . table($table) . ".$val[0] IS " . ($val5 != "" ? substr($val5, 9) : "''");
|
||||
$queries[] = "COMMENT ON COLUMN " . table($name) . ".$val[0] IS " . ($val5 != "" ? substr($val5, 9) : "''");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -517,9 +518,6 @@ WHERE table_schema = current_schema() AND table_name = " . q($name))));
|
||||
} elseif ($alter) {
|
||||
array_unshift($queries, "ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter));
|
||||
}
|
||||
if ($table != "" && $table != $name) {
|
||||
$queries[] = "ALTER TABLE " . table($table) . " RENAME TO " . table($name);
|
||||
}
|
||||
if ($table != "" || $comment != "") {
|
||||
$queries[] = "COMMENT ON TABLE " . table($name) . " IS " . q($comment);
|
||||
}
|
||||
|
@@ -108,7 +108,7 @@ class Adminer {
|
||||
$return = array();
|
||||
$filename = "adminer.css";
|
||||
if (file_exists($filename)) {
|
||||
$return[] = $filename;
|
||||
$return[] = "$filename?v=" . crc32(file_get_contents($filename));
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
@@ -119,10 +119,10 @@ class Adminer {
|
||||
function loginForm() {
|
||||
global $drivers;
|
||||
echo "<table cellspacing='0' class='layout'>\n";
|
||||
echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER) . "\n");
|
||||
echo $this->loginFormField('driver', '<tr><th>' . lang('System') . '<td>', html_select("auth[driver]", $drivers, DRIVER, "loginDriver(this);") . "\n");
|
||||
echo $this->loginFormField('server', '<tr><th>' . lang('Server') . '<td>', '<input name="auth[server]" value="' . h(SERVER) . '" title="hostname[:port]" placeholder="localhost" autocapitalize="off">' . "\n");
|
||||
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));"));
|
||||
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n");
|
||||
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username')); qs('#username').form['auth[driver]'].onchange();"));
|
||||
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
|
||||
echo $this->loginFormField('db', '<tr><th>' . lang('Database') . '<td>', '<input name="auth[db]" value="' . h($_GET["db"]) . '" autocapitalize="off">' . "\n");
|
||||
echo "</table>\n";
|
||||
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
|
||||
@@ -641,7 +641,7 @@ class Adminer {
|
||||
$history[$_GET["db"]] = array();
|
||||
}
|
||||
if (strlen($query) > 1e6) {
|
||||
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
|
||||
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n…"; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
|
||||
}
|
||||
$history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
|
||||
$sql_id = "sql-" . count($history[$_GET["db"]]);
|
||||
@@ -933,12 +933,12 @@ class Adminer {
|
||||
foreach ($usernames as $username => $password) {
|
||||
if ($password !== null) {
|
||||
if ($first) {
|
||||
echo "<p id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
echo "<ul id='logins'>" . script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
$first = false;
|
||||
}
|
||||
$dbs = $_SESSION["db"][$vendor][$server][$username];
|
||||
foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
|
||||
echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n";
|
||||
echo "<li><a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@" . $this->serverName($server) : "") . ($db != "" ? " - $db" : "")) . "</a>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -160,7 +160,7 @@ if (isset($_GET["username"]) && !class_exists("Min_DB")) {
|
||||
|
||||
stop_session(true);
|
||||
|
||||
if (isset($_GET["username"])) {
|
||||
if (isset($_GET["username"]) && is_string(get_password())) {
|
||||
list($host, $port) = explode(":", SERVER, 2);
|
||||
if (is_numeric($port) && $port < 1024) {
|
||||
auth_error(lang('Connecting to privileged ports is not allowed.'));
|
||||
|
@@ -112,6 +112,31 @@ function referencable_primary($self) {
|
||||
return $return;
|
||||
}
|
||||
|
||||
/** Get settings stored in a cookie
|
||||
* @return array
|
||||
*/
|
||||
function adminer_settings() {
|
||||
parse_str($_COOKIE["adminer_settings"], $settings);
|
||||
return $settings;
|
||||
}
|
||||
|
||||
/** Get setting stored in a cookie
|
||||
* @param string
|
||||
* @return array
|
||||
*/
|
||||
function adminer_setting($key) {
|
||||
$settings = adminer_settings();
|
||||
return $settings[$key];
|
||||
}
|
||||
|
||||
/** Store settings to a cookie
|
||||
* @param array
|
||||
* @return bool
|
||||
*/
|
||||
function set_adminer_settings($settings) {
|
||||
return cookie("adminer_settings", http_build_query($settings + adminer_settings()));
|
||||
}
|
||||
|
||||
/** Print SQL <textarea> tag
|
||||
* @param string
|
||||
* @param string or array in which case [0] of every element is used
|
||||
@@ -236,10 +261,9 @@ function type_class($type) {
|
||||
* @param array
|
||||
* @param string TABLE or PROCEDURE
|
||||
* @param array returned by referencable_primary()
|
||||
* @param bool display comments column
|
||||
* @return null
|
||||
*/
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
|
||||
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
|
||||
global $inout;
|
||||
$fields = array_values($fields);
|
||||
?>
|
||||
@@ -259,7 +283,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
|
||||
'mssql' => "ms186775.aspx",
|
||||
)); ?>
|
||||
<td id="label-default"><?php echo lang('Default value'); ?>
|
||||
<?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
|
||||
<?php echo (support("comment") ? "<td id='label-comment'>" . lang('Comment') : ""); ?>
|
||||
<?php } ?>
|
||||
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>" . script("row_count = " . count($fields) . ";"); ?>
|
||||
</thead>
|
||||
@@ -280,7 +304,7 @@ function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = arra
|
||||
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
|
||||
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php
|
||||
echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php
|
||||
echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
|
||||
echo (support("comment") ? "<td><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
|
||||
}
|
||||
echo "<td>";
|
||||
echo (support("move_col") ?
|
||||
|
@@ -351,7 +351,7 @@ function set_password($vendor, $server, $username, $password) {
|
||||
}
|
||||
|
||||
/** Get password from session
|
||||
* @return string
|
||||
* @return string or null for missing password or false for expired password
|
||||
*/
|
||||
function get_password() {
|
||||
$return = get_session("pwds");
|
||||
@@ -815,7 +815,7 @@ function shorten_utf8($string, $length = 80, $suffix = "") {
|
||||
if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{10FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
|
||||
preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
|
||||
}
|
||||
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>");
|
||||
return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>…</i>");
|
||||
}
|
||||
|
||||
/** Format decimal number
|
||||
@@ -1476,7 +1476,7 @@ function edit_form($TABLE, $fields, $row, $update) {
|
||||
? lang('Save and continue edit')
|
||||
: lang('Save and insert next')
|
||||
) . "' title='Ctrl+Shift+Enter'>\n";
|
||||
echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "...', this); };") : "");
|
||||
echo ($update ? script("qsl('input').onclick = function () { return !ajaxForm(this.form, '" . lang('Saving') . "…', this); };") : "");
|
||||
}
|
||||
}
|
||||
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'>" . confirm() . "\n"
|
||||
|
@@ -1,2 +1,2 @@
|
||||
<?php
|
||||
$VERSION = "4.7.0";
|
||||
$VERSION = "4.7.2";
|
||||
|
@@ -127,6 +127,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Tabulky byly přesunuty.',
|
||||
'Copy' => 'Zkopírovat',
|
||||
'Tables have been copied.' => 'Tabulky byly zkopírovány.',
|
||||
'overwrite' => 'přepsat',
|
||||
|
||||
'Routines' => 'Procedury a funkce',
|
||||
'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),
|
||||
|
@@ -2,6 +2,7 @@
|
||||
$translations = array(
|
||||
'Login' => 'Login',
|
||||
'Logout successful.' => 'Abmeldung erfolgreich.',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Danke, dass Sie Adminer genutzt haben. <a href="https://www.adminer.org/de/donation/">Spenden willkommen!</a>',
|
||||
'Invalid credentials.' => 'Ungültige Anmelde-Informationen.',
|
||||
'Server' => 'Server',
|
||||
'Username' => 'Benutzer',
|
||||
|
@@ -178,7 +178,7 @@ $translations = array(
|
||||
'Optimize' => '最適化',
|
||||
'Check' => 'チェック',
|
||||
'Repair' => '修復',
|
||||
'Truncate' => 'Truncate',
|
||||
'Truncate' => '空にする',
|
||||
'Move to other database' => '別のデータベースへ移動',
|
||||
'Move' => '移動',
|
||||
'Save and continue edit' => '保存して継続',
|
||||
@@ -264,4 +264,14 @@ $translations = array(
|
||||
'Permanent link' => 'パーマネントリンク',
|
||||
'Edit all' => 'すべて編集',
|
||||
'HH:MM:SS' => '時:分:秒',
|
||||
'Selected' => '選択済',
|
||||
'Modify' => '修正',
|
||||
'Load more data' => '続きを読み込み',
|
||||
'Loading' => '読み込み中',
|
||||
'Size' => 'サイズ',
|
||||
'Compute' => '算出',
|
||||
'Saving' => '保存中',
|
||||
'yes' => 'はい',
|
||||
'no' => 'いいえ',
|
||||
'Default value' => '既定値',
|
||||
);
|
||||
|
@@ -268,7 +268,7 @@ $translations = array(
|
||||
// data type descriptions
|
||||
'Numbers' => 'Числа',
|
||||
'Date and time' => 'Дата і час',
|
||||
'Strings' => 'Радки',
|
||||
'Strings' => 'Рядки',
|
||||
'Binary' => 'Двійкові',
|
||||
'Lists' => 'Списки',
|
||||
'Network' => 'Мережа',
|
||||
|
@@ -128,6 +128,7 @@ $translations = array(
|
||||
'Tables have been moved.' => 'Xx.',
|
||||
'Copy' => 'Xx',
|
||||
'Tables have been copied.' => 'Xx.',
|
||||
'overwrite' => 'xx',
|
||||
|
||||
'Routines' => 'Xx',
|
||||
'Routine has been called, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
|
||||
|
@@ -1,131 +1,38 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Login' => '登入',
|
||||
'Logout successful.' => '成功登出。',
|
||||
'Invalid credentials.' => '無效的憑證。',
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'System' => '資料庫系統',
|
||||
'Server' => '伺服器',
|
||||
'Username' => '帳號',
|
||||
'Password' => '密碼',
|
||||
'Select database' => '選擇資料庫',
|
||||
'Invalid database.' => '無效的資料庫。',
|
||||
'Table has been altered.' => '資料表已修改。',
|
||||
'Table has been created.' => '資料表已建立。',
|
||||
'Alter table' => '修改資料表',
|
||||
'Create table' => '建立資料表',
|
||||
'Table name' => '資料表名稱',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校對',
|
||||
'Column name' => '欄位名稱',
|
||||
'Type' => '類型',
|
||||
'Length' => '長度',
|
||||
'Auto Increment' => '自動遞增',
|
||||
'Options' => '選項',
|
||||
'Save' => '儲存',
|
||||
'Drop' => '刪除',
|
||||
'Database has been dropped.' => '資料庫已刪除。',
|
||||
'Database has been created.' => '已建立資料庫。',
|
||||
'Database has been renamed.' => '已重新命名資料庫。',
|
||||
'Database has been altered.' => '已修改資料庫。',
|
||||
'Alter database' => '修改資料庫',
|
||||
'Create database' => '建立資料庫',
|
||||
'SQL command' => 'SQL 命令',
|
||||
'Permanent login' => '永久登入',
|
||||
'Login' => '登入',
|
||||
'Logout' => '登出',
|
||||
'database' => '資料庫',
|
||||
'Use' => '使用',
|
||||
'No tables.' => '沒有資料表。',
|
||||
'select' => '選擇',
|
||||
'Item has been updated.' => '已更新項目。',
|
||||
'Item%s has been inserted.' => '已新增項目 %s。',
|
||||
'Edit' => '編輯',
|
||||
'Insert' => '新增',
|
||||
'Save and insert next' => '儲存並新增下一筆',
|
||||
'Delete' => '刪除',
|
||||
'Database' => '資料庫',
|
||||
'Routines' => '程序',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Indexes' => '索引',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '新增下一筆',
|
||||
'Logged as: %s' => '登錄為: %s',
|
||||
'Logout successful.' => '成功登出。',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感謝使用Adminer,請考慮為我們<a href="https://www.adminer.org/en/donation/">捐款(英文網頁)</a>.',
|
||||
'Invalid credentials.' => '無效的憑證。',
|
||||
'There is a space in the input password which might be the cause.' => '您輸入的密碼中有一個空格,這可能是導致問題的原因。',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer預設不支援訪問沒有密碼的資料庫,<a href="https://www.adminer.org/en/password/"%s>詳情見這裡</a>.',
|
||||
'Database does not support password.' => '資料庫不支援密碼。',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => '登錄失敗次數過多,請 %d 分鐘後重試。',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密碼已過期。<a href="https://www.adminer.org/en/extension/"%s>請擴展</a> %s 方法讓它永久化。',
|
||||
'Language' => '語言',
|
||||
'Select' => '選擇',
|
||||
'New item' => '新增項目',
|
||||
'Search' => '搜尋',
|
||||
'Sort' => '排序',
|
||||
'descending' => '降冪 (遞減)',
|
||||
'Limit' => '限定',
|
||||
'No rows.' => '沒有資料行。',
|
||||
'Action' => '動作',
|
||||
'edit' => '編輯',
|
||||
'Page' => '頁',
|
||||
'Query executed OK, %d row(s) affected.' => '執行查詢 OK,%d 行受影響。',
|
||||
'Error in query' => '查詢發生錯誤',
|
||||
'Execute' => '執行',
|
||||
'Table' => '資料表',
|
||||
'Foreign keys' => '外來鍵',
|
||||
'Triggers' => '觸發器',
|
||||
'View' => '檢視表',
|
||||
'Unable to select the table' => '無法選擇該資料表',
|
||||
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
|
||||
'Comment' => '註解',
|
||||
'Default values' => '預設值',
|
||||
'%d byte(s)' => '%d byte(s)',
|
||||
'No commands to execute.' => '沒有命令可執行。',
|
||||
'Unable to upload a file.' => '無法上傳檔案。',
|
||||
'File upload' => '檔案上傳',
|
||||
'File uploads are disabled.' => '檔案上傳已經被停用。',
|
||||
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
|
||||
'Call' => '呼叫',
|
||||
'If you did not send this request from Adminer then close this page.' => '如果您並沒有從Adminer發送請求,請關閉此頁面。',
|
||||
'No extension' => '無擴充模組',
|
||||
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的 PHP 擴充模組(%s)。',
|
||||
'Connecting to privileged ports is not allowed.' => '不允許連接到特權埠。',
|
||||
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或啟用 %s 或 %s 擴充模組。',
|
||||
'Session support must be enabled.' => 'Session 必須被啟用。',
|
||||
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
|
||||
'Text length' => 'Text 長度',
|
||||
'Foreign key has been dropped.' => '已刪除外來鍵。',
|
||||
'Foreign key has been altered.' => '已修改外來鍵。',
|
||||
'Foreign key has been created.' => '已建立外來鍵。',
|
||||
'Foreign key' => '外來鍵',
|
||||
'Target table' => '目標資料表',
|
||||
'Change' => '變更',
|
||||
'Source' => '來源',
|
||||
'Target' => '目標',
|
||||
'Add column' => '新增欄位',
|
||||
'Alter' => '修改',
|
||||
'Add foreign key' => '新增外來鍵',
|
||||
'ON DELETE' => 'ON DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Index Type' => '索引類型',
|
||||
'Column (length)' => '欄位(長度)',
|
||||
'View has been dropped.' => '已刪除檢視表。',
|
||||
'View has been altered.' => '已修改檢視表。',
|
||||
'View has been created.' => '已建立檢視表。',
|
||||
'Alter view' => '修改檢視表',
|
||||
'Create view' => '建立檢視表',
|
||||
'Name' => '名稱',
|
||||
'Process list' => '處理程序列表',
|
||||
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
|
||||
'Kill' => '終止',
|
||||
'Parameter name' => '參數名稱',
|
||||
'Database schema' => '資料庫結構',
|
||||
'Create procedure' => '建立預存程序',
|
||||
'Create function' => '建立函式',
|
||||
'Routine has been dropped.' => '已刪除程序。',
|
||||
'Routine has been altered.' => '已修改子程序。',
|
||||
'Routine has been created.' => '已建立子程序。',
|
||||
'Alter function' => '修改函式',
|
||||
'Alter procedure' => '修改預存程序',
|
||||
'Return type' => '回傳類型',
|
||||
'Add trigger' => '建立觸發器',
|
||||
'Trigger has been dropped.' => '已刪除觸發器。',
|
||||
'Trigger has been altered.' => '已修改觸發器。',
|
||||
'Trigger has been created.' => '已建立觸發器。',
|
||||
'Alter trigger' => '修改觸發器',
|
||||
'Create trigger' => '建立觸發器',
|
||||
'Time' => '時間',
|
||||
'Event' => '事件',
|
||||
'The action will be performed after successful login with the same credentials.' => '此操作將在成功使用相同的憑據登錄後執行。',
|
||||
'%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Remove' => '移除',
|
||||
'Are you sure?' => '你確定嗎?',
|
||||
'Refresh' => '重新載入',
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
'Privileges' => '權限',
|
||||
'Create user' => '建立使用者',
|
||||
'User has been dropped.' => '已刪除使用者。',
|
||||
@@ -136,132 +43,306 @@ $translations = array(
|
||||
'Routine' => '程序',
|
||||
'Grant' => '授權',
|
||||
'Revoke' => '廢除',
|
||||
'Logged as: %s' => '登錄為: %s',
|
||||
|
||||
'Process list' => '處理程序列表',
|
||||
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
|
||||
'Kill' => '終止',
|
||||
|
||||
'Variables' => '變數',
|
||||
'Status' => '狀態',
|
||||
|
||||
'SQL command' => 'SQL 命令',
|
||||
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
|
||||
'Query executed OK, %d row(s) affected.' => '執行查詢 OK,%d 行受影響。',
|
||||
'No commands to execute.' => '沒有命令可執行。',
|
||||
'Error in query' => '查詢發生錯誤',
|
||||
'Unknown error.' => '未知錯誤。',
|
||||
'Warnings' => '警告',
|
||||
'ATTACH queries are not supported.' => '不支援ATTACH查詢。',
|
||||
'Execute' => '執行',
|
||||
'Stop on error' => '出錯時停止',
|
||||
'Show only errors' => '僅顯示錯誤訊息',
|
||||
// sprintf() format for time of the command
|
||||
'%.3f s' => '%.3f 秒',
|
||||
'History' => '紀錄',
|
||||
'Clear' => '清除',
|
||||
'Edit all' => '編輯全部',
|
||||
|
||||
'File upload' => '檔案上傳',
|
||||
'From server' => '從伺服器',
|
||||
'Webserver file %s' => '網頁伺服器檔案 %s',
|
||||
'Run file' => '執行檔案',
|
||||
'File does not exist.' => '檔案不存在',
|
||||
'File uploads are disabled.' => '檔案上傳已經被停用。',
|
||||
'Unable to upload a file.' => '無法上傳檔案。',
|
||||
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => '您可以通過FTP上傳大型SQL檔並從伺服器導入。',
|
||||
'You are offline.' => '您離線了。',
|
||||
|
||||
'Export' => '匯出',
|
||||
'Tables' => '資料表',
|
||||
'Data' => '資料',
|
||||
'Output' => '輸出',
|
||||
'open' => '打開',
|
||||
'save' => '儲存',
|
||||
'Saving' => '保存中',
|
||||
'Format' => '格式',
|
||||
'Functions' => '函式',
|
||||
'Aggregation' => '集合',
|
||||
'Event has been dropped.' => '已刪除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
'Event has been created.' => '已建立事件。',
|
||||
'Alter event' => '修改事件',
|
||||
'Create event' => '建立事件',
|
||||
'Start' => '開始',
|
||||
'End' => '結束',
|
||||
'Every' => '每',
|
||||
'Status' => '狀態',
|
||||
'On completion preserve' => '在完成後儲存',
|
||||
'Events' => '事件',
|
||||
'Schedule' => '排程',
|
||||
'At given time' => '在指定時間',
|
||||
'Tables have been truncated.' => '已清空資料表。',
|
||||
'Tables have been moved.' => '已轉移資料表。',
|
||||
'Tables and views' => '資料表和檢視表',
|
||||
'Data' => '資料',
|
||||
|
||||
'Database' => '資料庫',
|
||||
'database' => '資料庫',
|
||||
'DB' => '資料庫',
|
||||
'Use' => '使用',
|
||||
'Select database' => '選擇資料庫',
|
||||
'Invalid database.' => '無效的資料庫。',
|
||||
'Database has been dropped.' => '資料庫已刪除。',
|
||||
'Databases have been dropped.' => '資料庫已刪除。',
|
||||
'Database has been created.' => '已建立資料庫。',
|
||||
'Database has been renamed.' => '已重新命名資料庫。',
|
||||
'Database has been altered.' => '已修改資料庫。',
|
||||
'Alter database' => '修改資料庫',
|
||||
'Create database' => '建立資料庫',
|
||||
'Database schema' => '資料庫結構',
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => '永久連結',
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'Engine' => '引擎',
|
||||
'Collation' => '校對',
|
||||
'Data Length' => '資料長度',
|
||||
'Index Length' => '索引長度',
|
||||
'Data Free' => '資料空閒',
|
||||
'Rows' => '行數',
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'%d in total' => '總共 %d 個',
|
||||
'Analyze' => '分析',
|
||||
'Optimize' => '最佳化',
|
||||
'Vacuum' => '整理(Vacuum)',
|
||||
'Check' => '檢查',
|
||||
'Repair' => '修復',
|
||||
'Truncate' => '清空',
|
||||
'Tables have been truncated.' => '已清空資料表。',
|
||||
'Move to other database' => '轉移到其它資料庫',
|
||||
'Move' => '轉移',
|
||||
'Save and continue edit' => '儲存並繼續編輯',
|
||||
'original' => '原始',
|
||||
'%d item(s) have been affected.' => '%d 個項目受到影響。',
|
||||
'Whole result' => '所有結果',
|
||||
'Tables have been moved.' => '已轉移資料表。',
|
||||
'Copy' => '複製',
|
||||
'Tables have been copied.' => '資料表已經複製',
|
||||
|
||||
'Routines' => '程序',
|
||||
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
|
||||
'Call' => '呼叫',
|
||||
'Parameter name' => '參數名稱',
|
||||
'Create procedure' => '建立預存程序',
|
||||
'Create function' => '建立函式',
|
||||
'Routine has been dropped.' => '已刪除程序。',
|
||||
'Routine has been altered.' => '已修改子程序。',
|
||||
'Routine has been created.' => '已建立子程序。',
|
||||
'Alter function' => '修改函式',
|
||||
'Alter procedure' => '修改預存程序',
|
||||
'Return type' => '回傳類型',
|
||||
|
||||
'Events' => '事件',
|
||||
'Event has been dropped.' => '已刪除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
'Event has been created.' => '已建立事件。',
|
||||
'Alter event' => '修改事件',
|
||||
'Create event' => '建立事件',
|
||||
'At given time' => '在指定時間',
|
||||
'Every' => '每',
|
||||
'Schedule' => '排程',
|
||||
'Start' => '開始',
|
||||
'End' => '結束',
|
||||
'On completion preserve' => '在完成後儲存',
|
||||
|
||||
'Tables' => '資料表',
|
||||
'Tables and views' => '資料表和檢視表',
|
||||
'Table' => '資料表',
|
||||
'No tables.' => '沒有資料表。',
|
||||
'Alter table' => '修改資料表',
|
||||
'Create table' => '建立資料表',
|
||||
'Table has been dropped.' => '已經刪除資料表。',
|
||||
'Tables have been dropped.' => '已經將資料表刪除。',
|
||||
'Clone' => '複製',
|
||||
'Tables have been optimized.' => '已優化資料表。',
|
||||
'Table has been altered.' => '資料表已修改。',
|
||||
'Table has been created.' => '資料表已建立。',
|
||||
'Table name' => '資料表名稱',
|
||||
'Show structure' => '顯示結構',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校對',
|
||||
'Column name' => '欄位名稱',
|
||||
'Type' => '類型',
|
||||
'Length' => '長度',
|
||||
'Auto Increment' => '自動遞增',
|
||||
'Options' => '選項',
|
||||
'Comment' => '註解',
|
||||
'Default value' => '預設值',
|
||||
'Default values' => '預設值',
|
||||
'Drop' => '刪除',
|
||||
'Drop %s?' => '刪除 %s?',
|
||||
'Are you sure?' => '你確定嗎?',
|
||||
'Size' => '大小',
|
||||
'Compute' => '計算',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
'Remove' => '移除',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。',
|
||||
|
||||
'Partition by' => '分區類型',
|
||||
'Partitions' => '分區',
|
||||
'Partition name' => '分區名稱',
|
||||
'Values' => '值',
|
||||
'%d row(s) have been imported.' => '已匯入 %d 行。',
|
||||
'anywhere' => '任意位置',
|
||||
'Import' => '匯入',
|
||||
'Stop on error' => '出錯時停止',
|
||||
'%.3f s' => '%.3f 秒',
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
'History' => '紀錄',
|
||||
'Variables' => '變數',
|
||||
|
||||
'View' => '檢視表',
|
||||
'Materialized view' => '物化視圖',
|
||||
'View has been dropped.' => '已刪除檢視表。',
|
||||
'View has been altered.' => '已修改檢視表。',
|
||||
'View has been created.' => '已建立檢視表。',
|
||||
'Alter view' => '修改檢視表',
|
||||
'Create view' => '建立檢視表',
|
||||
|
||||
'Indexes' => '索引',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '新增下一筆',
|
||||
'Index Type' => '索引類型',
|
||||
'Column (length)' => '欄位(長度)',
|
||||
|
||||
'Foreign keys' => '外來鍵',
|
||||
'Foreign key' => '外來鍵',
|
||||
'Foreign key has been dropped.' => '已刪除外來鍵。',
|
||||
'Foreign key has been altered.' => '已修改外來鍵。',
|
||||
'Foreign key has been created.' => '已建立外來鍵。',
|
||||
'Target table' => '目標資料表',
|
||||
'Change' => '變更',
|
||||
'Source' => '來源',
|
||||
'Target' => '目標',
|
||||
'Add column' => '新增欄位',
|
||||
'Alter' => '修改',
|
||||
'Add foreign key' => '新增外來鍵',
|
||||
'ON DELETE' => 'ON DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
|
||||
'Relations' => '關聯',
|
||||
'Run file' => '執行檔案',
|
||||
'Clear' => '清除',
|
||||
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB',
|
||||
|
||||
'Triggers' => '觸發器',
|
||||
'Add trigger' => '建立觸發器',
|
||||
'Trigger has been dropped.' => '已刪除觸發器。',
|
||||
'Trigger has been altered.' => '已修改觸發器。',
|
||||
'Trigger has been created.' => '已建立觸發器。',
|
||||
'Alter trigger' => '修改觸發器',
|
||||
'Create trigger' => '建立觸發器',
|
||||
'Time' => '時間',
|
||||
'Event' => '事件',
|
||||
'Name' => '名稱',
|
||||
|
||||
'select' => '選擇',
|
||||
'Select' => '選擇',
|
||||
'Select data' => '選擇資料',
|
||||
'Functions' => '函式',
|
||||
'Aggregation' => '集合',
|
||||
'Search' => '搜尋',
|
||||
'anywhere' => '任意位置',
|
||||
'Search data in tables' => '在資料庫搜尋',
|
||||
'Sort' => '排序',
|
||||
'descending' => '降冪 (遞減)',
|
||||
'Limit' => '限定',
|
||||
'Limit rows' => '限制行數',
|
||||
'Text length' => 'Text 長度',
|
||||
'Action' => '動作',
|
||||
'Full table scan' => '全資料表掃描',
|
||||
'Unable to select the table' => '無法選擇該資料表',
|
||||
'No rows.' => '沒有資料行。',
|
||||
'%d / ' => '%d / ',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Page' => '頁',
|
||||
'last' => '最後一頁',
|
||||
'Load more data' => '載入更多資料',
|
||||
'Loading' => '載入中',
|
||||
'Whole result' => '所有結果',
|
||||
'%d byte(s)' => '%d byte(s)',
|
||||
|
||||
'Import' => '匯入',
|
||||
'%d row(s) have been imported.' => '已匯入 %d 行。',
|
||||
'File must be in UTF-8 encoding.' => '檔必須使用UTF-8編碼。',
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => '修改',
|
||||
'Ctrl+click on a value to modify it.' => '按住Ctrl並按一下某個值進行修改。',
|
||||
'Use edit link to modify this value.' => '使用編輯連結來修改。',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => '已新增項目 %s。',
|
||||
'Item has been deleted.' => '該項目已被刪除',
|
||||
'Item has been updated.' => '已更新項目。',
|
||||
'%d item(s) have been affected.' => '%d 個項目受到影響。',
|
||||
'New item' => '新增項目',
|
||||
'original' => '原始',
|
||||
// label for value '' in enum data type
|
||||
'empty' => '空值',
|
||||
'edit' => '編輯',
|
||||
'Edit' => '編輯',
|
||||
'Insert' => '新增',
|
||||
'Save' => '儲存',
|
||||
'Save and continue edit' => '儲存並繼續編輯',
|
||||
'Save and insert next' => '儲存並新增下一筆',
|
||||
'Selected' => '已選中',
|
||||
'Clone' => '複製',
|
||||
'Delete' => '刪除',
|
||||
'You have no privileges to update this table.' => '您沒有許可權更新這個資料表。',
|
||||
|
||||
'E-mail' => '電子郵件',
|
||||
'From' => '來自',
|
||||
'Subject' => '主旨',
|
||||
'Attachments' => '附件',
|
||||
'Send' => '寄出',
|
||||
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => '數字',
|
||||
'Date and time' => '日期時間',
|
||||
'Strings' => '字串',
|
||||
'Binary' => '二進位',
|
||||
'Lists' => '列表',
|
||||
'Network' => '網路',
|
||||
'Geometry' => '幾何',
|
||||
'Relations' => '關聯',
|
||||
|
||||
'Editor' => '編輯器',
|
||||
'E-mail' => '電子郵件',
|
||||
'From' => '來自',
|
||||
'Subject' => '主旨',
|
||||
'Send' => '寄出',
|
||||
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
|
||||
'Webserver file %s' => '網頁伺服器檔案 %s',
|
||||
'File does not exist.' => '檔案不存在',
|
||||
'Item has been deleted.' => '該項目已被刪除',
|
||||
'%d in total' => '總共 %d 個',
|
||||
'Permanent login' => '永久登入',
|
||||
'Table has been dropped.' => '已經刪除資料表。',
|
||||
'Databases have been dropped.' => '資料庫已刪除。',
|
||||
'Search data in tables' => '在資料庫搜尋',
|
||||
'Schema' => '資料表結構',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
// hint for date format - use language equivalents for day, month and year shortcuts
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
// hint for time format - use language equivalents for hour, minute and second shortcuts
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'now' => '現在',
|
||||
'yes' => '是',
|
||||
'no' => '否',
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => '檔案已存在。',
|
||||
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => '修改資料表結構',
|
||||
'Create schema' => '建立資料表結構',
|
||||
'Schema has been dropped.' => '已刪除資料表結構。',
|
||||
'Schema has been created.' => '已建立資料表結構。',
|
||||
'Schema has been altered.' => '已修改資料表結構。',
|
||||
'Schema' => '資料表結構',
|
||||
'Invalid schema.' => '無效的資料表結構。',
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => '序列',
|
||||
'Create sequence' => '建立序列',
|
||||
'Alter sequence' => '修改序列',
|
||||
'Sequence has been dropped.' => '已刪除序列。',
|
||||
'Sequence has been created.' => '已建立序列。',
|
||||
'Sequence has been altered.' => '已修改序列。',
|
||||
'Alter sequence' => '修改序列',
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => '使用者類型',
|
||||
'Create type' => '建立類型',
|
||||
'Alter type' => '修改類型',
|
||||
'Type has been dropped.' => '已刪除類型。',
|
||||
'Type has been created.' => '已建立類型。',
|
||||
'Use edit link to modify this value.' => '使用編輯連結來修改。',
|
||||
'last' => '最後一頁',
|
||||
'From server' => '從伺服器',
|
||||
'System' => '資料庫系統',
|
||||
'Select data' => '選擇資料',
|
||||
'Show structure' => '顯示結構',
|
||||
'empty' => '空值',
|
||||
'Network' => '網路',
|
||||
'Geometry' => '幾何',
|
||||
'File exists.' => '檔案已存在。',
|
||||
'Attachments' => '附件',
|
||||
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
|
||||
'Show only errors' => '僅顯示錯誤訊息',
|
||||
'Refresh' => '重新載入',
|
||||
'Invalid schema.' => '無效的資料表結構。',
|
||||
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
|
||||
'now' => '現在',
|
||||
'ltr' => 'ltr',
|
||||
'Tables have been copied.' => '資料表已經複製',
|
||||
'Copy' => '複製',
|
||||
'Permanent link' => '永久連結',
|
||||
'Edit all' => '編輯全部',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'Alter type' => '修改類型',
|
||||
);
|
||||
|
@@ -1,133 +1,38 @@
|
||||
<?php
|
||||
$translations = array(
|
||||
'Login' => '登录',
|
||||
'Logout successful.' => '注销成功。',
|
||||
'Invalid credentials.' => '无效凭据。',
|
||||
// label for database system selection (MySQL, SQLite, ...)
|
||||
'System' => '系统',
|
||||
'Server' => '服务器',
|
||||
'Username' => '用户名',
|
||||
'Password' => '密码',
|
||||
'Select database' => '选择数据库',
|
||||
'Invalid database.' => '无效数据库。',
|
||||
'Table has been dropped.' => '已删除表。',
|
||||
'Table has been altered.' => '已修改表。',
|
||||
'Table has been created.' => '已创建表。',
|
||||
'Alter table' => '修改表',
|
||||
'Create table' => '创建表',
|
||||
'Table name' => '表名',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校对',
|
||||
'Column name' => '字段名',
|
||||
'Type' => '类型',
|
||||
'Length' => '长度',
|
||||
'Auto Increment' => '自动增量',
|
||||
'Options' => '选项',
|
||||
'Save' => '保存',
|
||||
'Drop' => '删除',
|
||||
'Database has been dropped.' => '已删除数据库。',
|
||||
'Database has been created.' => '已创建数据库。',
|
||||
'Database has been renamed.' => '已重命名数据库。',
|
||||
'Database has been altered.' => '已修改数据库。',
|
||||
'Alter database' => '修改数据库',
|
||||
'Create database' => '创建数据库',
|
||||
'SQL command' => 'SQL命令',
|
||||
'Logout' => '注销',
|
||||
'database' => '数据库',
|
||||
'Use' => '使用',
|
||||
'No tables.' => '没有表。',
|
||||
'select' => '选择',
|
||||
'Item has been deleted.' => '已删除项目。',
|
||||
'Item has been updated.' => '已更新项目。',
|
||||
'Item%s has been inserted.' => '已插入项目%s。',
|
||||
'Edit' => '编辑',
|
||||
'Insert' => '插入',
|
||||
'Save and insert next' => '保存并插入下一个',
|
||||
'Delete' => '删除',
|
||||
'Database' => '数据库',
|
||||
'Routines' => '子程序',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Indexes' => '索引',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '下一行插入',
|
||||
'Permanent login' => '保持登录',
|
||||
'Login' => '登录',
|
||||
'Logout' => '登出',
|
||||
'Logged as: %s' => '登录用户:%s',
|
||||
'Logout successful.' => '成功登出。',
|
||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感谢使用Adminer,请考虑为我们<a href="https://www.adminer.org/en/donation/">捐款(英文页面)</a>.',
|
||||
'Invalid credentials.' => '无效凭据。',
|
||||
'There is a space in the input password which might be the cause.' => '您输入的密码中有一个空格,这可能是导致问题的原因。',
|
||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer默认不支持访问没有密码的数据库,<a href="https://www.adminer.org/en/password/"%s>详情见这里</a>.',
|
||||
'Database does not support password.' => '数据库不支持密码。',
|
||||
'Too many unsuccessful logins, try again in %d minute(s).' => '登录失败次数过多,请 %d 分钟后重试。',
|
||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密码已过期。<a href="https://www.adminer.org/en/extension/"%s>请扩展</a> %s 方法让它永久化。',
|
||||
'Language' => '语言',
|
||||
'Select' => '选择',
|
||||
'New item' => '新建数据',
|
||||
'Search' => '搜索',
|
||||
'Sort' => '排序',
|
||||
'descending' => '降序',
|
||||
'Limit' => '范围',
|
||||
'No rows.' => '无数据。',
|
||||
'Action' => '动作',
|
||||
'edit' => '编辑',
|
||||
'Page' => '页面',
|
||||
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
|
||||
'Error in query' => '查询出错',
|
||||
'Execute' => '执行',
|
||||
'Table' => '表',
|
||||
'Foreign keys' => '外键',
|
||||
'Triggers' => '触发器',
|
||||
'View' => '视图',
|
||||
'Unable to select the table' => '不能选择该表',
|
||||
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。重新发送表单。',
|
||||
'Comment' => '注释',
|
||||
'Default values' => '默认值',
|
||||
'%d byte(s)' => '%d 字节',
|
||||
'No commands to execute.' => '没有命令被执行。',
|
||||
'Unable to upload a file.' => '不能上传文件。',
|
||||
'File upload' => '文件上传',
|
||||
'File uploads are disabled.' => '文件上传被禁用。',
|
||||
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
|
||||
'Call' => '调用',
|
||||
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。请重新发送表单。',
|
||||
'If you did not send this request from Adminer then close this page.' => '如果您并没有从Adminer发送请求,请关闭此页面。',
|
||||
'No extension' => '没有扩展',
|
||||
'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s)。',
|
||||
'Session support must be enabled.' => 'Session 必须被启用。',
|
||||
'Session expired, please login again.' => 'Session 已过期,请重新登录。',
|
||||
'Text length' => '文本显示限制',
|
||||
'Foreign key has been dropped.' => '已删除外键。',
|
||||
'Foreign key has been altered.' => '已修改外键。',
|
||||
'Foreign key has been created.' => '已创建外键。',
|
||||
'Foreign key' => '外键',
|
||||
'Target table' => '目标表',
|
||||
'Change' => '修改',
|
||||
'Source' => '源',
|
||||
'Target' => '目标',
|
||||
'Add column' => '增加列',
|
||||
'Alter' => '修改',
|
||||
'Add foreign key' => '添加外键',
|
||||
'ON DELETE' => 'ON DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Index Type' => '索引类型',
|
||||
'Column (length)' => '列(长度)',
|
||||
'View has been dropped.' => '已删除视图。',
|
||||
'View has been altered.' => '已修改视图。',
|
||||
'View has been created.' => '已创建视图。',
|
||||
'Alter view' => '修改视图',
|
||||
'Create view' => '创建视图',
|
||||
'Name' => '名称',
|
||||
'Process list' => '进程列表',
|
||||
'%d process(es) have been killed.' => '%d 个进程被终止',
|
||||
'Kill' => '终止',
|
||||
'Parameter name' => '参数名',
|
||||
'Database schema' => '数据库概要',
|
||||
'Create procedure' => '创建过程',
|
||||
'Create function' => '创建函数',
|
||||
'Routine has been dropped.' => '已删除子程序。',
|
||||
'Routine has been altered.' => '已修改子程序。',
|
||||
'Routine has been created.' => '已创建子程序。',
|
||||
'Alter function' => '修改函数',
|
||||
'Alter procedure' => '修改过程',
|
||||
'Return type' => '返回类型',
|
||||
'Add trigger' => '创建触发器',
|
||||
'Trigger has been dropped.' => '已删除触发器。',
|
||||
'Trigger has been altered.' => '已修改触发器。',
|
||||
'Trigger has been created.' => '已创建触发器。',
|
||||
'Alter trigger' => '修改触发器',
|
||||
'Create trigger' => '创建触发器',
|
||||
'Time' => '时间',
|
||||
'Event' => '事件',
|
||||
'Connecting to privileged ports is not allowed.' => '不允许连接到特权端口。',
|
||||
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或启用 %s 或 %s 扩展。',
|
||||
'Session support must be enabled.' => '必须启用会话支持。',
|
||||
'Session expired, please login again.' => '会话已过期,请重新登录。',
|
||||
'The action will be performed after successful login with the same credentials.' => '此操作将在成功使用相同的凭据登录后执行。',
|
||||
'%s version: %s through PHP extension %s' => '%s 版本:%s, 使用PHP扩展 %s',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Remove' => '移除',
|
||||
'Are you sure?' => '你确定吗?',
|
||||
'Refresh' => '刷新',
|
||||
|
||||
// text direction - 'ltr' or 'rtl'
|
||||
'ltr' => 'ltr',
|
||||
|
||||
'Privileges' => '权限',
|
||||
'Create user' => '创建用户',
|
||||
'User has been dropped.' => '已删除用户。',
|
||||
@@ -138,130 +43,306 @@ $translations = array(
|
||||
'Routine' => '子程序',
|
||||
'Grant' => '授权',
|
||||
'Revoke' => '废除',
|
||||
'Logged as: %s' => '登录用户:%s',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
|
||||
'Process list' => '进程列表',
|
||||
'%d process(es) have been killed.' => '%d 个进程被终止',
|
||||
'Kill' => '终止',
|
||||
|
||||
'Variables' => '变量',
|
||||
'Status' => '状态',
|
||||
|
||||
'SQL command' => 'SQL命令',
|
||||
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
|
||||
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
|
||||
'No commands to execute.' => '没有命令被执行。',
|
||||
'Error in query' => '查询出错',
|
||||
'Unknown error.' => '未知错误。',
|
||||
'Warnings' => '警告',
|
||||
'ATTACH queries are not supported.' => '不支持ATTACH查询。',
|
||||
'Execute' => '执行',
|
||||
'Stop on error' => '出错时停止',
|
||||
'Show only errors' => '仅显示错误',
|
||||
// sprintf() format for time of the command
|
||||
'%.3f s' => '%.3f 秒',
|
||||
'History' => '历史',
|
||||
'Clear' => '清除',
|
||||
'Edit all' => '编辑全部',
|
||||
|
||||
'File upload' => '文件上传',
|
||||
'From server' => '来自服务器',
|
||||
'Webserver file %s' => 'Web服务器文件 %s',
|
||||
'Run file' => '运行文件',
|
||||
'File does not exist.' => '文件不存在。',
|
||||
'File uploads are disabled.' => '文件上传被禁用。',
|
||||
'Unable to upload a file.' => '不能上传文件。',
|
||||
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB。',
|
||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 数据太大。请减少数据或者增加 %s 配置命令。',
|
||||
'You can upload a big SQL file via FTP and import it from server.' => '您可以通过FTP上传大型SQL文件并从服务器导入。',
|
||||
'You are offline.' => '您离线了。',
|
||||
|
||||
'Export' => '导出',
|
||||
'Tables' => '表',
|
||||
'Data' => '数据',
|
||||
'Output' => '输出',
|
||||
'open' => '打开',
|
||||
'save' => '保存',
|
||||
'Saving' => '保存中',
|
||||
'Format' => '格式',
|
||||
'Functions' => '函数',
|
||||
'Aggregation' => '集合',
|
||||
'Event has been dropped.' => '已删除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
'Event has been created.' => '已创建事件。',
|
||||
'Alter event' => '修改事件',
|
||||
'Create event' => '创建事件',
|
||||
'Start' => '开始',
|
||||
'End' => '结束',
|
||||
'Every' => '每',
|
||||
'Status' => '状态',
|
||||
'On completion preserve' => '完成后保存',
|
||||
'Events' => '事件',
|
||||
'Schedule' => '调度',
|
||||
'At given time' => '在指定时间',
|
||||
'Tables have been truncated.' => '已清空表。',
|
||||
'Tables have been moved.' => '已转移表。',
|
||||
'Tables and views' => '表和视图',
|
||||
'Data' => '数据',
|
||||
|
||||
'Database' => '数据库',
|
||||
'database' => '数据库',
|
||||
'DB' => '数据库',
|
||||
'Use' => '使用',
|
||||
'Select database' => '选择数据库',
|
||||
'Invalid database.' => '无效数据库。',
|
||||
'Database has been dropped.' => '已删除数据库。',
|
||||
'Databases have been dropped.' => '已删除数据库。',
|
||||
'Database has been created.' => '已创建数据库。',
|
||||
'Database has been renamed.' => '已重命名数据库。',
|
||||
'Database has been altered.' => '已修改数据库。',
|
||||
'Alter database' => '修改数据库',
|
||||
'Create database' => '创建数据库',
|
||||
'Database schema' => '数据库概要',
|
||||
|
||||
// link to current database schema layout
|
||||
'Permanent link' => '固定链接',
|
||||
|
||||
// thousands separator - must contain single byte
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'Engine' => '引擎',
|
||||
'Collation' => '校对',
|
||||
'Data Length' => '数据长度',
|
||||
'Index Length' => '索引长度',
|
||||
'Data Free' => '数据空闲',
|
||||
'Rows' => '行数',
|
||||
',' => ',',
|
||||
'0123456789' => '0123456789',
|
||||
'%d in total' => '共计 %d',
|
||||
'Analyze' => '分析',
|
||||
'Optimize' => '优化',
|
||||
'Vacuum' => '整理(Vacuum)',
|
||||
'Check' => '检查',
|
||||
'Repair' => '修复',
|
||||
'Truncate' => '清空',
|
||||
'Tables have been truncated.' => '已清空表。',
|
||||
'Move to other database' => '转移到其它数据库',
|
||||
'Move' => '转移',
|
||||
'Save and continue edit' => '保存并继续编辑',
|
||||
'original' => '原始',
|
||||
'%d item(s) have been affected.' => '%d 个项目受到影响。',
|
||||
'Whole result' => '所有结果',
|
||||
'Tables have been moved.' => '已转移表。',
|
||||
'Copy' => '复制',
|
||||
'Tables have been copied.' => '已复制表。',
|
||||
|
||||
'Routines' => '子程序',
|
||||
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
|
||||
'Call' => '调用',
|
||||
'Parameter name' => '参数名',
|
||||
'Create procedure' => '创建过程',
|
||||
'Create function' => '创建函数',
|
||||
'Routine has been dropped.' => '已删除子程序。',
|
||||
'Routine has been altered.' => '已修改子程序。',
|
||||
'Routine has been created.' => '已创建子程序。',
|
||||
'Alter function' => '修改函数',
|
||||
'Alter procedure' => '修改过程',
|
||||
'Return type' => '返回类型',
|
||||
|
||||
'Events' => '事件',
|
||||
'Event has been dropped.' => '已删除事件。',
|
||||
'Event has been altered.' => '已修改事件。',
|
||||
'Event has been created.' => '已创建事件。',
|
||||
'Alter event' => '修改事件',
|
||||
'Create event' => '创建事件',
|
||||
'At given time' => '在指定时间',
|
||||
'Every' => '每',
|
||||
'Schedule' => '调度',
|
||||
'Start' => '开始',
|
||||
'End' => '结束',
|
||||
'On completion preserve' => '完成后仍保留',
|
||||
|
||||
'Tables' => '表',
|
||||
'Tables and views' => '表和视图',
|
||||
'Table' => '表',
|
||||
'No tables.' => '没有表。',
|
||||
'Alter table' => '修改表',
|
||||
'Create table' => '创建表',
|
||||
'Table has been dropped.' => '已删除表。',
|
||||
'Tables have been dropped.' => '已删除表。',
|
||||
'Clone' => '复制',
|
||||
'Tables have been optimized.' => '已优化表。',
|
||||
'Table has been altered.' => '已修改表。',
|
||||
'Table has been created.' => '已创建表。',
|
||||
'Table name' => '表名',
|
||||
'Show structure' => '显示结构',
|
||||
'engine' => '引擎',
|
||||
'collation' => '校对',
|
||||
'Column name' => '字段名',
|
||||
'Type' => '类型',
|
||||
'Length' => '长度',
|
||||
'Auto Increment' => '自动增量',
|
||||
'Options' => '选项',
|
||||
'Comment' => '注释',
|
||||
'Default value' => '默认值',
|
||||
'Default values' => '默认值',
|
||||
'Drop' => '删除',
|
||||
'Drop %s?' => '删除 %s?',
|
||||
'Are you sure?' => '您确定吗?',
|
||||
'Size' => '大小',
|
||||
'Compute' => '计算',
|
||||
'Move up' => '上移',
|
||||
'Move down' => '下移',
|
||||
'Remove' => '移除',
|
||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
|
||||
|
||||
'Partition by' => '分区类型',
|
||||
'Partitions' => '分区',
|
||||
'Partition name' => '分区名',
|
||||
'Values' => '值',
|
||||
'%d row(s) have been imported.' => '%d 行已导入。',
|
||||
'anywhere' => '任意位置',
|
||||
'Import' => '导入',
|
||||
'Stop on error' => '出错时停止',
|
||||
'%.3f s' => '%.3f 秒',
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
'History' => '历史',
|
||||
'Variables' => '变量',
|
||||
|
||||
'View' => '视图',
|
||||
'Materialized view' => '物化视图',
|
||||
'View has been dropped.' => '已删除视图。',
|
||||
'View has been altered.' => '已修改视图。',
|
||||
'View has been created.' => '已创建视图。',
|
||||
'Alter view' => '修改视图',
|
||||
'Create view' => '创建视图',
|
||||
|
||||
'Indexes' => '索引',
|
||||
'Indexes have been altered.' => '已修改索引。',
|
||||
'Alter indexes' => '修改索引',
|
||||
'Add next' => '下一行插入',
|
||||
'Index Type' => '索引类型',
|
||||
'Column (length)' => '列(长度)',
|
||||
|
||||
'Foreign keys' => '外键',
|
||||
'Foreign key' => '外键',
|
||||
'Foreign key has been dropped.' => '已删除外键。',
|
||||
'Foreign key has been altered.' => '已修改外键。',
|
||||
'Foreign key has been created.' => '已创建外键。',
|
||||
'Target table' => '目标表',
|
||||
'Change' => '修改',
|
||||
'Source' => '源',
|
||||
'Target' => '目标',
|
||||
'Add column' => '增加列',
|
||||
'Alter' => '修改',
|
||||
'Add foreign key' => '添加外键',
|
||||
'ON DELETE' => 'ON DELETE',
|
||||
'ON UPDATE' => 'ON UPDATE',
|
||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。',
|
||||
'Relations' => '关联信息',
|
||||
'Run file' => '运行文件',
|
||||
'Clear' => '清除',
|
||||
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB',
|
||||
|
||||
'Triggers' => '触发器',
|
||||
'Add trigger' => '创建触发器',
|
||||
'Trigger has been dropped.' => '已删除触发器。',
|
||||
'Trigger has been altered.' => '已修改触发器。',
|
||||
'Trigger has been created.' => '已创建触发器。',
|
||||
'Alter trigger' => '修改触发器',
|
||||
'Create trigger' => '创建触发器',
|
||||
'Time' => '时间',
|
||||
'Event' => '事件',
|
||||
'Name' => '名称',
|
||||
|
||||
'select' => '选择',
|
||||
'Select' => '选择',
|
||||
'Select data' => '选择数据',
|
||||
'Functions' => '函数',
|
||||
'Aggregation' => '集合',
|
||||
'Search' => '搜索',
|
||||
'anywhere' => '任意位置',
|
||||
'Search data in tables' => '在表中搜索数据',
|
||||
'Sort' => '排序',
|
||||
'descending' => '降序',
|
||||
'Limit' => '范围',
|
||||
'Limit rows' => '限制行数',
|
||||
'Text length' => '文本显示限制',
|
||||
'Action' => '动作',
|
||||
'Full table scan' => '全表扫描',
|
||||
'Unable to select the table' => '不能选择该表',
|
||||
'No rows.' => '无数据。',
|
||||
'%d / ' => '%d / ',
|
||||
'%d row(s)' => '%d 行',
|
||||
'Page' => '页面',
|
||||
'last' => '最后',
|
||||
'Load more data' => '加载更多数据',
|
||||
'Loading' => '加载中',
|
||||
'Whole result' => '所有结果',
|
||||
'%d byte(s)' => '%d 字节',
|
||||
|
||||
'Import' => '导入',
|
||||
'%d row(s) have been imported.' => '%d 行已导入。',
|
||||
'File must be in UTF-8 encoding.' => '文件必须使用UTF-8编码。',
|
||||
|
||||
// in-place editing in select
|
||||
'Modify' => '修改',
|
||||
'Ctrl+click on a value to modify it.' => '按住Ctrl并单击某个值进行修改。',
|
||||
'Use edit link to modify this value.' => '使用编辑链接修改该值。',
|
||||
|
||||
// %s can contain auto-increment value
|
||||
'Item%s has been inserted.' => '已插入项目%s。',
|
||||
'Item has been deleted.' => '已删除项目。',
|
||||
'Item has been updated.' => '已更新项目。',
|
||||
'%d item(s) have been affected.' => '%d 个项目受到影响。',
|
||||
'New item' => '新建数据',
|
||||
'original' => '原始',
|
||||
// label for value '' in enum data type
|
||||
'empty' => '空',
|
||||
'edit' => '编辑',
|
||||
'Edit' => '编辑',
|
||||
'Insert' => '插入',
|
||||
'Save' => '保存',
|
||||
'Save and continue edit' => '保存并继续编辑',
|
||||
'Save and insert next' => '保存并插入下一个',
|
||||
'Selected' => '已选中',
|
||||
'Clone' => '复制',
|
||||
'Delete' => '删除',
|
||||
'You have no privileges to update this table.' => '您没有权限更新这个表。',
|
||||
|
||||
'E-mail' => '电子邮件',
|
||||
'From' => '来自',
|
||||
'Subject' => '主题',
|
||||
'Attachments' => '附件',
|
||||
'Send' => '发送',
|
||||
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
|
||||
|
||||
// data type descriptions
|
||||
'Numbers' => '数字',
|
||||
'Date and time' => '日期时间',
|
||||
'Strings' => '字符串',
|
||||
'Binary' => '二进制',
|
||||
'Lists' => '列表',
|
||||
'Network' => '网络',
|
||||
'Geometry' => '几何图形',
|
||||
'Relations' => '关联信息',
|
||||
|
||||
'Editor' => '编辑器',
|
||||
'E-mail' => '电子邮件',
|
||||
'From' => '来自',
|
||||
'Subject' => '主题',
|
||||
'Send' => '发送',
|
||||
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
|
||||
'Webserver file %s' => 'Web服务器文件 %s',
|
||||
'File does not exist.' => '文件不存在。',
|
||||
'%d in total' => '共计 %d',
|
||||
'Permanent login' => '保持登录',
|
||||
'Databases have been dropped.' => '已删除数据库。',
|
||||
'Search data in tables' => '在表中搜索数据',
|
||||
'Schema' => '模式',
|
||||
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
|
||||
'$1-$3-$5' => '$1.$3.$5',
|
||||
// hint for date format - use language equivalents for day, month and year shortcuts
|
||||
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
|
||||
// hint for time format - use language equivalents for hour, minute and second shortcuts
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'now' => '现在',
|
||||
'yes' => '是',
|
||||
'no' => '否',
|
||||
|
||||
// general SQLite error in create, drop or rename database
|
||||
'File exists.' => '文件已存在。',
|
||||
'Please use one of the extensions %s.' => '请使用其中一个扩展:%s。',
|
||||
|
||||
// PostgreSQL and MS SQL schema support
|
||||
'Alter schema' => '修改模式',
|
||||
'Create schema' => '创建模式',
|
||||
'Schema has been dropped.' => '已删除模式。',
|
||||
'Schema has been created.' => '已创建模式。',
|
||||
'Schema has been altered.' => '已修改模式。',
|
||||
'Schema' => '模式',
|
||||
'Invalid schema.' => '非法模式。',
|
||||
|
||||
// PostgreSQL sequences support
|
||||
'Sequences' => '序列',
|
||||
'Create sequence' => '创建序列',
|
||||
'Alter sequence' => '修改序列',
|
||||
'Sequence has been dropped.' => '已删除序列。',
|
||||
'Sequence has been created.' => '已创建序列。',
|
||||
'Sequence has been altered.' => '已修改序列。',
|
||||
'Alter sequence' => '修改序列',
|
||||
|
||||
// PostgreSQL user types support
|
||||
'User types' => '用户类型',
|
||||
'Create type' => '创建类型',
|
||||
'Alter type' => '修改类型',
|
||||
'Type has been dropped.' => '已删除类型。',
|
||||
'Type has been created.' => '已创建类型。',
|
||||
'Use edit link to modify this value.' => '使用编辑链接来修改该值。',
|
||||
'last' => '最后',
|
||||
'From server' => '来自服务器',
|
||||
'System' => '系统',
|
||||
'Select data' => '选择数据',
|
||||
'Show structure' => '显示结构',
|
||||
'empty' => '空',
|
||||
'Network' => '网络',
|
||||
'Geometry' => '几何图形',
|
||||
'File exists.' => '文件已存在。',
|
||||
'Attachments' => '附件',
|
||||
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
|
||||
'Show only errors' => '仅显示错误',
|
||||
'Refresh' => '刷新',
|
||||
'Invalid schema.' => '非法模式。',
|
||||
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
|
||||
'now' => '现在',
|
||||
'ltr' => 'ltr',
|
||||
'Tables have been copied.' => '表已复制。',
|
||||
'Copy' => '复制',
|
||||
'Permanent link' => '固定链接',
|
||||
'Edit all' => '编辑全部',
|
||||
'HH:MM:SS' => 'HH:MM:SS',
|
||||
'Alter type' => '修改类型',
|
||||
);
|
||||
|
@@ -440,7 +440,7 @@ if (!$columns && support("table")) {
|
||||
$h_value = h($value !== null ? $value : $row[$key]);
|
||||
echo "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>");
|
||||
} else {
|
||||
$long = strpos($val, "<i>...</i>");
|
||||
$long = strpos($val, "<i>…</i>");
|
||||
echo "<td id='$id' data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
|
||||
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
|
||||
. ">$val</td>"
|
||||
@@ -484,7 +484,7 @@ if (!$columns && support("table")) {
|
||||
if ($pagination) {
|
||||
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
|
||||
? '<p><a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" class="loadmore">' . lang('Load more data') . '</a>'
|
||||
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "...');", "")
|
||||
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "…');", "")
|
||||
: ''
|
||||
);
|
||||
echo "\n";
|
||||
@@ -503,12 +503,12 @@ if (!$columns && support("table")) {
|
||||
if ($jush != "simpledb") {
|
||||
echo "<legend><a href='" . h(remove_from_uri("page")) . "'>" . lang('Page') . "</a></legend>";
|
||||
echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };");
|
||||
echo pagination(0, $page) . ($page > 5 ? " ..." : "");
|
||||
echo pagination(0, $page) . ($page > 5 ? " …" : "");
|
||||
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
|
||||
echo pagination($i, $page);
|
||||
}
|
||||
if ($max_page > 0) {
|
||||
echo ($page + 5 < $max_page ? " ..." : "");
|
||||
echo ($page + 5 < $max_page ? " …" : "");
|
||||
echo ($exact_count && $found_rows !== false
|
||||
? pagination($max_page, $page)
|
||||
: " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
|
||||
@@ -516,9 +516,9 @@ if (!$columns && support("table")) {
|
||||
}
|
||||
} else {
|
||||
echo "<legend>" . lang('Page') . "</legend>";
|
||||
echo pagination(0, $page) . ($page > 1 ? " ..." : "");
|
||||
echo pagination(0, $page) . ($page > 1 ? " …" : "");
|
||||
echo ($page ? pagination($page, $page) : "");
|
||||
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " ..." : "") : "");
|
||||
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " …" : "") : "");
|
||||
}
|
||||
echo "</fieldset>\n";
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/** @author Ondrej Valka, http://valka.info */
|
||||
body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; }
|
||||
body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; width: -moz-fit-content; width: fit-content; }
|
||||
a { color: blue; text-decoration: none; }
|
||||
a:visited { color: navy; }
|
||||
a:link:hover, a:visited:hover { color: red; text-decoration: underline; }
|
||||
@@ -32,7 +32,6 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
.version { color: #777; font-size: 67%; }
|
||||
.js .hidden, .nojs .jsonly { display: none; }
|
||||
.js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; }
|
||||
.scrollable { overflow-x: auto; }
|
||||
.nowrap td, .nowrap th, td.nowrap, p.nowrap { white-space: pre; }
|
||||
.wrap td { white-space: normal; }
|
||||
.error { color: red; background: #fee; }
|
||||
@@ -67,8 +66,8 @@ input.wayoff { left: -1000px; position: absolute; }
|
||||
.loadmore { margin-left: 1ex; }
|
||||
/* .edit used in designs */
|
||||
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
|
||||
#menu p, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#tables li{ list-style: none; }
|
||||
#menu p, #logins, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
|
||||
#logins li, #tables li { list-style: none; }
|
||||
#dbs { overflow: hidden; }
|
||||
#logins, #tables { white-space: nowrap; overflow: auto; }
|
||||
#logins a, #tables a, #tables span { background: #fff; }
|
||||
|
@@ -17,7 +17,8 @@ function bodyLoad(version, maria) {
|
||||
for (var i = 1; i < obj.length; i++) {
|
||||
obj[i] = obj[i]
|
||||
.replace(/\.html/, '/')
|
||||
.replace(/(numeric)(-type-overview)/, (maria ? '$1-data$2' : '$&')) // MariaDB
|
||||
.replace(/(numeric)(-type-overview)/, '$1-data$2')
|
||||
.replace(/#statvar_.*/, '#$$1')
|
||||
;
|
||||
}
|
||||
}
|
||||
@@ -71,9 +72,10 @@ function typePassword(el, disable) {
|
||||
}
|
||||
|
||||
/** Install toggle handler
|
||||
* @param [HTMLElement]
|
||||
*/
|
||||
function messagesPrint() {
|
||||
var els = qsa('.toggle', document);
|
||||
function messagesPrint(el) {
|
||||
var els = qsa('.toggle', el || document);
|
||||
for (var i = 0; i < els.length; i++) {
|
||||
els[i].onclick = partial(toggle, els[i].getAttribute('href').substr(1));
|
||||
}
|
||||
@@ -81,6 +83,18 @@ function messagesPrint() {
|
||||
|
||||
|
||||
|
||||
/** Hide or show some login rows for selected driver
|
||||
* @param HTMLSelectElement
|
||||
*/
|
||||
function loginDriver(driver) {
|
||||
var trs = parentTag(driver, 'table').rows;
|
||||
var disabled = /sqlite/.test(selectValue(driver));
|
||||
alterClass(trs[1], 'hidden', disabled); // 1 - row with server
|
||||
trs[1].getElementsByTagName('input')[0].disabled = disabled;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var dbCtrl;
|
||||
var dbPrevious = {};
|
||||
|
||||
@@ -447,14 +461,6 @@ function columnShow(checked, column) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Hide column with default values in narrow window
|
||||
*/
|
||||
function editingHideDefaults() {
|
||||
if (innerWidth < document.documentElement.scrollWidth) {
|
||||
qs('#form')['defaults'].checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Display partition options
|
||||
* @this HTMLSelectElement
|
||||
*/
|
||||
@@ -476,14 +482,14 @@ function partitionNameChange() {
|
||||
}
|
||||
|
||||
/** Show or hide comment fields
|
||||
* @param HTMLInputElement
|
||||
* @param [boolean] whether to focus Comment if checked
|
||||
* @this HTMLInputElement
|
||||
*/
|
||||
function editingCommentsClick(focus) {
|
||||
var comment = this.form['Comment'];
|
||||
columnShow(this.checked, 6);
|
||||
alterClass(comment, 'hidden', !this.checked);
|
||||
if (focus && this.checked) {
|
||||
function editingCommentsClick(el, focus) {
|
||||
var comment = el.form['Comment'];
|
||||
columnShow(el.checked, 6);
|
||||
alterClass(comment, 'hidden', !el.checked);
|
||||
if (focus && el.checked) {
|
||||
comment.focus();
|
||||
}
|
||||
}
|
||||
|
@@ -672,6 +672,7 @@ function ajaxForm(form, message, button) {
|
||||
if (window.jush) {
|
||||
jush.highlight_tag(qsa('code', qs('#ajaxstatus')), 0);
|
||||
}
|
||||
messagesPrint(qs('#ajaxstatus'));
|
||||
}, data, message);
|
||||
}
|
||||
|
||||
|
@@ -52,7 +52,7 @@ if ($_POST && !$error) {
|
||||
} else {
|
||||
$new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
|
||||
$pass = $_POST["pass"];
|
||||
if ($pass != '' && !$_POST["hashed"]) {
|
||||
if ($pass != '' && !$_POST["hashed"] && !min_version(8)) {
|
||||
// compute hash in a separate query so that plain text password is not saved to history
|
||||
$pass = $connection->result("SELECT PASSWORD(" . q($pass) . ")");
|
||||
$error = !$pass;
|
||||
@@ -61,7 +61,7 @@ if ($_POST && !$error) {
|
||||
$created = false;
|
||||
if (!$error) {
|
||||
if ($old_user != $new_user) {
|
||||
$created = queries((min_version(5) ? "CREATE USER" : "GRANT USAGE ON *.* TO") . " $new_user IDENTIFIED BY PASSWORD " . q($pass));
|
||||
$created = queries((min_version(5) ? "CREATE USER" : "GRANT USAGE ON *.* TO") . " $new_user IDENTIFIED BY " . (min_version(8) ? "" : "PASSWORD ") . q($pass));
|
||||
$error = !$created;
|
||||
} elseif ($pass != $old_pass) {
|
||||
queries("SET PASSWORD FOR $new_user = " . q($pass));
|
||||
@@ -136,7 +136,7 @@ if ($_POST) {
|
||||
<tr><th><?php echo lang('Username'); ?><td><input name="user" data-maxlength="80" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
|
||||
<tr><th><?php echo lang('Password'); ?><td><input name="pass" id="pass" value="<?php echo h($row["pass"]); ?>" autocomplete="new-password">
|
||||
<?php if (!$row["hashed"]) { echo script("typePassword(qs('#pass'));"); } ?>
|
||||
<?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>
|
||||
<?php echo (min_version(8) ? "" : checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);")); ?>
|
||||
</table>
|
||||
|
||||
<?php
|
||||
|
23
changes.txt
23
changes.txt
@@ -1,3 +1,26 @@
|
||||
Adminer 4.7.2 (released 2019-07-18):
|
||||
Do not attempt logging in without password (bug #676)
|
||||
Stretch footer over the whole table width (bug #624)
|
||||
Allow overwriting tables when copying them
|
||||
Fix displaying SQL command after Save and continue edit
|
||||
Cache busting for adminer.css
|
||||
MySQL: Fix displaying multi-columns foreign keys (bug #675)
|
||||
MySQL: Fix creating users and changing password in MySQL 8 (bug #663)
|
||||
MySQL: Pass SRID to GeomFromText
|
||||
PostgreSQL: Fix setting column comments on new table
|
||||
PostgreSQL: Display definitions of materialized views (bug #682)
|
||||
PostgreSQL: Fix table status in PostgreSQL 12 (bug #683)
|
||||
MS SQL: Support comments
|
||||
Elasticsearch: Fix setting number of rows
|
||||
|
||||
Adminer 4.7.1 (released 2019-01-24):
|
||||
Display the tables scrollbar (bug #647)
|
||||
Remember visible columns in Create Table form (bug #493)
|
||||
Add autocomplete attributes to login form
|
||||
PHP <5.4 compatibility even with ClickHouse enabled (regression from 4.7.0)
|
||||
SQLite: Hide server field in login form
|
||||
Editor: Allow disabling boolean fields in PostgreSQL (bug #640)
|
||||
|
||||
Adminer 4.7.0 (released 2018-11-24):
|
||||
Simplify storing executed SQL queries to bookmarks
|
||||
Warn when using password with leading or trailing spaces
|
||||
|
@@ -46,7 +46,7 @@ border:5px solid #ccc;margin:0}
|
||||
#menu a:hover{background:#333;color:#fff;border-color:#333}
|
||||
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
|
||||
outline:0;background:url(//www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
|
||||
#menu p,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
|
||||
#menu p,#logins,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
|
||||
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;line-height:40px;padding:0;z-index:1;margin:0}
|
||||
#breadcrumb a{color:#ff9}
|
||||
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
|
||||
|
@@ -339,7 +339,7 @@ border: 1px solid #E3E3E3;
|
||||
#menu form {
|
||||
margin: 0;
|
||||
}
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
padding-left: 8px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
@@ -173,7 +173,7 @@ h3{
|
||||
margin:0;}
|
||||
#menu form{
|
||||
margin:0;}
|
||||
#menu p,#tables{
|
||||
#menu p,#logins,#tables{
|
||||
padding-left:8px;
|
||||
border-bottom:none;}
|
||||
#menu form p{
|
||||
|
@@ -733,7 +733,7 @@ legend{
|
||||
}
|
||||
|
||||
/* tables */
|
||||
#tables{
|
||||
#logins, #tables{
|
||||
border-bottom: none;
|
||||
line-height: 20px;
|
||||
padding: 18px 0;
|
||||
@@ -759,12 +759,20 @@ legend{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#logins a {
|
||||
display: block;
|
||||
padding: 5px 18px 9px;
|
||||
color: inherit;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#tables a.select.active,
|
||||
#tables a.select:hover
|
||||
{
|
||||
color: #fba;
|
||||
}
|
||||
|
||||
#logins a:hover,
|
||||
#tables a[title]:hover,
|
||||
#tables a.active,
|
||||
#tables a.select:hover + a,
|
||||
@@ -979,4 +987,4 @@ code.jush-sql ~ a:first-of-type::before{
|
||||
|
||||
body > form{
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
@@ -3,15 +3,15 @@
|
||||
*
|
||||
* Klemens Häckel [http://clickdimension.wordpress.com/]
|
||||
*
|
||||
* update 2018-02
|
||||
* adapted for adminer 4.6.1
|
||||
*
|
||||
* new remaster based on style for WT-NMP 13.12
|
||||
*
|
||||
* Created by Miroslav Pokorný [http://fuch.cz].
|
||||
* Icons by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] (some of them were modified).
|
||||
* Slightly inspired by themes created by Martin Hořínek and Klemens Häckel.
|
||||
*
|
||||
* updated 2018-02 by Jan [http://cloux.org]
|
||||
* - fixes and usability improvements for Adminer 4.6.1
|
||||
*
|
||||
*/
|
||||
|
||||
/*** Fonts ***/
|
||||
@@ -139,10 +139,15 @@ html>/**/body #menu li a[href*="&select="]:link:hover {
|
||||
|
||||
/* Menu - Show structure */
|
||||
html>/**/body #menu li a[href*="&table="] {
|
||||
width: 263px;
|
||||
width: 280px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* Hide "new version" link in the top bar */
|
||||
/*
|
||||
html>body #menu h1 a#version {
|
||||
display: none;
|
||||
}
|
||||
*/
|
||||
|
||||
/*** Tables and views ***/
|
||||
/* set default alignment to left */
|
||||
@@ -388,7 +393,7 @@ h2 {
|
||||
display: none;
|
||||
}
|
||||
#content {
|
||||
margin-left: 325px;
|
||||
margin-left: 355px;
|
||||
}
|
||||
.tabs {
|
||||
margin: 12px auto 10px auto;
|
||||
@@ -429,7 +434,7 @@ td, th {
|
||||
border-width: 0 1px 1px 0;
|
||||
font-size: 0.83em; /* x-small; font size */
|
||||
}
|
||||
#tables a {
|
||||
#logins a, #tables a {
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
}
|
||||
@@ -458,7 +463,7 @@ a:link:hover, a:visited:hover {
|
||||
#menu {
|
||||
background-color: #f8f8f8;
|
||||
box-shadow: 0px 0px 3px rgba(0,0,0,0.50) !important;
|
||||
width: 310px;
|
||||
width: 330px;
|
||||
margin: 0;
|
||||
top: 0;
|
||||
padding-bottom: 0;
|
||||
|
@@ -18,10 +18,10 @@ img { vertical-align: middle; margin: 0; padding: 0; }
|
||||
.message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; }
|
||||
#menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; }
|
||||
#menu form { margin: 0; }
|
||||
#menu p, #tables li { text-align: center; font-size: 11px; }
|
||||
#menu p a, #tables li a { color: black; }
|
||||
#menu p a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
|
||||
#tables a, #tables span { background: #FFE594; }
|
||||
#menu p, #logins li, #tables li { text-align: center; font-size: 11px; }
|
||||
#menu p a, #logins li a, #tables li a { color: black; }
|
||||
#menu p a:hover, #logins li a:hover, #tables li a:hover { color: #626262; text-decoration: none; }
|
||||
#logins a, #tables a, #tables span { background: #FFE594; }
|
||||
#content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; }
|
||||
#lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; }
|
||||
#lang a { color: black; font-weight: bold; }
|
||||
|
@@ -106,7 +106,7 @@ img {vertical-align: middle; margin: 0; padding: 0;}
|
||||
#breadcrumb {margin: 0; height: 21px; display: block; position: absolute; top: 0; left: 300px; background-color: #f1f1f1; border: 1px solid #E3E3E3; padding: 2px 12px; line-height: 1.25em }
|
||||
#menu {position: absolute; padding: 10px; margin: 0; top: 28px; left: 0; width: 250px; background-color: #f1f1f1; border: 1px solid #E3E3E3;}
|
||||
#menu form {margin: 0;}
|
||||
#menu p, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
|
||||
#menu p, #logins, #tables {padding-left: 8px; font-size: 10pt; border-bottom: none;}
|
||||
#menu form p {padding-left: 0; text-align: left;}
|
||||
h1 .h1:hover {text-decoration: underline;}
|
||||
h1, h2 {font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; margin: 0; padding: 14px 15px 3px 10px; line-height: 35px; text-shadow: rgba(255,255,255,1) 0 1px 0px; background: none;}
|
||||
|
@@ -794,7 +794,7 @@ legend{
|
||||
}
|
||||
|
||||
/* tables */
|
||||
#tables{
|
||||
#logins, #tables{
|
||||
border-bottom: none;
|
||||
line-height: 20px;
|
||||
padding: 18px 0;
|
||||
@@ -820,12 +820,21 @@ legend{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#logins a {
|
||||
display: block;
|
||||
padding: 5px 18px;
|
||||
line-height: 14px;
|
||||
color: #F1E5B3;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#tables a.select.active,
|
||||
#tables a.select:hover
|
||||
{
|
||||
color: red;
|
||||
}
|
||||
|
||||
#logins a:hover,
|
||||
#tables a[title]:hover,
|
||||
#tables a.active,
|
||||
#tables a.select:hover + a,
|
||||
|
@@ -124,7 +124,6 @@ input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
margin: 0;
|
||||
}
|
||||
@@ -557,7 +556,7 @@ table tbody input ~ a[href*="&edit="][href*="&where"] {
|
||||
top: 0;
|
||||
}
|
||||
|
||||
#tables {
|
||||
#logins, #tables {
|
||||
padding: 0 0 0 5px;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
@@ -588,7 +587,7 @@ table tbody input ~ a[href*="&edit="][href*="&where"] {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
#menu a, #tables .select {
|
||||
#menu a, #logins a, #tables .select {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-right: 5px
|
||||
|
@@ -282,7 +282,7 @@ table code {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
#tables a {
|
||||
#logins a, #tables a {
|
||||
padding: 1px 2px;
|
||||
}
|
||||
|
||||
@@ -290,7 +290,7 @@ table code {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
border: none;
|
||||
margin: 0 0 4px;
|
||||
padding: 0 0 4px;
|
||||
@@ -383,7 +383,7 @@ a[href$="dump="] {
|
||||
}
|
||||
|
||||
select[name="db"] {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left center white;
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll 90% center white;
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
|
@@ -268,7 +268,7 @@ td.nowrap {
|
||||
padding: 0 0 30px 0;
|
||||
background: #f1f1f1;
|
||||
}
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
margin: 0;
|
||||
padding: .8em 1em;
|
||||
border-bottom: 1px solid #c7c7c7;
|
||||
|
@@ -232,7 +232,7 @@ tr.odd td {
|
||||
border-right:2px solid #34495e;
|
||||
}
|
||||
|
||||
#menu p, #tables{
|
||||
#menu p, #logins, #tables{
|
||||
border-bottom:1px solid rgb(85, 112, 139);
|
||||
}
|
||||
|
||||
|
@@ -177,11 +177,11 @@ h3 {
|
||||
top: 38px;
|
||||
width: 180px;
|
||||
background-color: #DEF; }
|
||||
#menu p, #tables {
|
||||
#menu p, #logins, #tables {
|
||||
padding-left: 8px;
|
||||
font-size: 10pt;
|
||||
border-bottom: none; }
|
||||
#tables a, #tables span {
|
||||
#logins a, #tables a, #tables span {
|
||||
background: #DEF;
|
||||
}
|
||||
|
||||
|
@@ -336,7 +336,7 @@ p code + a:visited:hover {
|
||||
|
||||
#tables {
|
||||
max-height: 100%;
|
||||
margin: 0 -15px !important;
|
||||
margin: 32px -15px !important;
|
||||
position: absolute;
|
||||
left: 15px;
|
||||
right: 15px;
|
||||
@@ -575,7 +575,7 @@ label {
|
||||
top: 55px;
|
||||
right: 100%;
|
||||
z-index: 10;
|
||||
margin-right: -331px;
|
||||
margin-right: -340px;
|
||||
line-height: normal;
|
||||
padding: 0;
|
||||
left: auto;
|
||||
|
@@ -51,11 +51,17 @@
|
||||
width: 270px;
|
||||
}
|
||||
|
||||
#tables li {
|
||||
#logins li, #tables li {
|
||||
position: relative;
|
||||
height: 23px;
|
||||
}
|
||||
|
||||
#logins a {
|
||||
display: block;
|
||||
margin-top: 5px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
#tables a {
|
||||
display: block;
|
||||
margin: 0;
|
||||
|
@@ -244,7 +244,7 @@ td, th {
|
||||
border-color: #bbb;
|
||||
border-width: 0 1px 1px 0;
|
||||
}
|
||||
#tables a {
|
||||
#logins a, #tables a {
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
}
|
||||
@@ -270,7 +270,7 @@ a, a:visited {
|
||||
padding-bottom: 0;
|
||||
top: 0;
|
||||
}
|
||||
#tables a, #tables span {
|
||||
#logins a, #tables a, #tables span {
|
||||
background: #fafafa;
|
||||
}
|
||||
/*** Forms ***/
|
||||
|
File diff suppressed because one or more lines are too long
36
designs/rmsoft_blue/adminer.css
Normal file
36
designs/rmsoft_blue/adminer.css
Normal file
File diff suppressed because one or more lines are too long
@@ -72,8 +72,8 @@ class Adminer {
|
||||
|
||||
function loginForm() {
|
||||
echo "<table cellspacing='0' class='layout'>\n";
|
||||
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocapitalize="off">' . script("focus(qs('#username'));"));
|
||||
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]">' . "\n");
|
||||
echo $this->loginFormField('username', '<tr><th>' . lang('Username') . '<td>', '<input type="hidden" name="auth[driver]" value="server"><input name="auth[username]" id="username" value="' . h($_GET["username"]) . '" autocomplete="username" autocapitalize="off">' . script("focus(qs('#username'));"));
|
||||
echo $this->loginFormField('password', '<tr><th>' . lang('Password') . '<td>', '<input type="password" name="auth[password]" autocomplete="current-password">' . "\n");
|
||||
echo "</table>\n";
|
||||
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
|
||||
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
|
||||
@@ -485,7 +485,7 @@ qsl('div').onclick = whisperClick;", "")
|
||||
);
|
||||
}
|
||||
if (like_bool($field)) {
|
||||
return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>";
|
||||
return '<input type="checkbox" value="1"' . (preg_match('~^(1|t|true|y|yes|on)$~i', $value) ? ' checked' : '') . "$attrs>";
|
||||
}
|
||||
$hint = "";
|
||||
if (preg_match('~time~', $field["type"])) {
|
||||
@@ -517,7 +517,7 @@ qsl('div').onclick = whisperClick;", "")
|
||||
}
|
||||
$return = ($field["type"] == "bit" && preg_match('~^[0-9]+$~', $value) ? $return : q($return));
|
||||
if ($value == "" && like_bool($field)) {
|
||||
$return = "0";
|
||||
$return = "'0'";
|
||||
} elseif ($value == "" && ($field["null"] || !preg_match('~char|text~', $field["type"]))) {
|
||||
$return = "NULL";
|
||||
} elseif (preg_match('~^(md5|sha1)$~', $function)) {
|
||||
@@ -586,11 +586,11 @@ qsl('div').onclick = whisperClick;", "")
|
||||
foreach ($servers[""] as $username => $password) {
|
||||
if ($password !== null) {
|
||||
if ($first) {
|
||||
echo "<p id='logins'>";
|
||||
echo "<ul id='logins'>";
|
||||
echo script("mixin(qs('#logins'), {onmouseover: menuOver, onmouseout: menuOut});");
|
||||
$first = false;
|
||||
}
|
||||
echo "<a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a><br>\n";
|
||||
echo "<li><a href='" . h(auth_url($vendor, "", $username)) . "'>" . ($username != "" ? h($username) : "<i>" . lang('empty') . "</i>") . "</a>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -16,7 +16,7 @@ class AdminerJsonColumn {
|
||||
}
|
||||
|
||||
private function _buildTable($json) {
|
||||
echo '<table cellspacing="0" style="margin:2px">';
|
||||
echo '<table cellspacing="0" style="margin:2px; font-size:100%;">';
|
||||
foreach ($json as $key => $val) {
|
||||
echo '<tr>';
|
||||
echo '<th>' . h($key) . '</th>';
|
||||
|
@@ -110,6 +110,11 @@ class AdminerPlugin extends Adminer {
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function bruteForceKey() {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
}
|
||||
|
||||
function serverName($server) {
|
||||
$args = func_get_args();
|
||||
return $this->_applyPlugin(__FUNCTION__, $args);
|
||||
|
@@ -40,14 +40,16 @@ tinyMCE.init({
|
||||
|
||||
function selectVal(&$val, $link, $field, $original) {
|
||||
if (preg_match("~_html~", $field["field"]) && $val != '') {
|
||||
$shortened = (substr($val, -10) == "<i>...</i>");
|
||||
$ellipsis = "<i>…</i>";
|
||||
$length = strlen($ellipsis);
|
||||
$shortened = (substr($val, -$length) == $ellipsis);
|
||||
if ($shortened) {
|
||||
$val = substr($val, 0, -10);
|
||||
$val = substr($val, 0, -$length);
|
||||
}
|
||||
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
|
||||
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
|
||||
if ($shortened) {
|
||||
$val .= "<i>...</i>";
|
||||
$val .= $ellipsis;
|
||||
}
|
||||
if (class_exists('DOMDocument')) { // close all opened tags
|
||||
$dom = new DOMDocument;
|
||||
|
@@ -29,14 +29,16 @@ class AdminerWymeditor {
|
||||
function selectVal(&$val, $link, $field, $original) {
|
||||
// copied from tinymce.php
|
||||
if (preg_match("~_html~", $field["field"]) && $val != '') {
|
||||
$shortened = (substr($val, -10) == "<i>...</i>");
|
||||
$ellipsis = "<i>…</i>";
|
||||
$length = strlen($ellipsis);
|
||||
$shortened = (substr($val, -$length) == $ellipsis);
|
||||
if ($shortened) {
|
||||
$val = substr($val, 0, -10);
|
||||
$val = substr($val, 0, -$length);
|
||||
}
|
||||
//! shorten with regard to HTML tags - http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
|
||||
$val = preg_replace('~<[^>]*$~', '', html_entity_decode($val, ENT_QUOTES)); // remove ending incomplete tag (text can be shortened)
|
||||
if ($shortened) {
|
||||
$val .= "<i>...</i>";
|
||||
$val .= $ellipsis;
|
||||
}
|
||||
if (class_exists('DOMDocument')) { // close all opened tags
|
||||
$dom = new DOMDocument;
|
||||
|
Reference in New Issue
Block a user