Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 405 lines (387 sloc) 18.205 kb
667bfec Decomposition
jakubvrana authored
1 <?php
79d1902 Substitute table name to $TABLE
jakubvrana authored
2 $TABLE = $_GET["select"];
3 $table_status = table_status($TABLE);
4 $indexes = indexes($TABLE);
4c2268d @vrana PostgreSQL hidden columns support
authored
5 $fields = fields($TABLE, 1); // 1 - hidden
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
6 $foreign_keys = column_foreign_keys($TABLE);
7
64ba924 Comments
jakubvrana authored
8 $rights = array(); // privilege => 0
9 $columns = array(); // selectable columns
0115315 Init with null
jakubvrana authored
10 $text_length = null;
ffcea8b Rights
jakubvrana authored
11 foreach ($fields as $key => $field) {
c64c4fd Adminer class
jakubvrana authored
12 $name = $adminer->fieldName($field);
7352c28 Replace strlen() by != ""
jakubvrana authored
13 if (isset($field["privileges"]["select"]) && $name != "") {
1e4d11e Select from foreign keys in Editor
jakubvrana authored
14 $columns[$key] = html_entity_decode(strip_tags($name));
375a5c8 @vrana Non-MySQL binary types
authored
15 if (ereg('text|lob', $field["type"])) {
d24ad78 Select boxes customization
jakubvrana authored
16 $text_length = $adminer->selectLengthProcess();
16c4ddb Single faster POST query with primary key
jakubvrana authored
17 }
ffcea8b Rights
jakubvrana authored
18 }
430034c Cottage homework
jakubvrana authored
19 $rights += $field["privileges"];
20 }
21
d24ad78 Select boxes customization
jakubvrana authored
22 list($select, $group) = $adminer->selectColumnsProcess($columns, $indexes);
07e1ae1 FOUND_ROWS only with GROUP BY
jakubvrana authored
23 $where = $adminer->selectSearchProcess($fields, $indexes);
24 $order = $adminer->selectOrderProcess($fields, $indexes);
d24ad78 Select boxes customization
jakubvrana authored
25 $limit = $adminer->selectLimitProcess();
ee3e045 @vrana Separate $where in limit function
authored
26 $from = ($select ? implode(", ", $select) : "*") . "\nFROM " . table($TABLE);
e44fbc2 Wrap SQL query
jakubvrana authored
27 $group_by = ($group && count($group) < count($select) ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
116faf2 Mass delete
jakubvrana authored
28
29 if ($_POST && !$error) {
56948c9 $_POST[check] may be empty
jakubvrana authored
30 $where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")";
2ad8ab4 @vrana Primary key detection for other drivers
authored
31 $primary = null;
32 foreach ($indexes as $index) {
33 if ($index["type"] == "PRIMARY") {
34 $primary = ($select ? array_flip($index["columns"]) : array()); // empty array means that all primary fields are selected
35 break;
36 }
37 }
d24ad78 Select boxes customization
jakubvrana authored
38 foreach ($select as $key => $val) {
39 $val = $_GET["columns"][$key];
40 if (!$val["fun"]) {
41 unset($primary[$val["col"]]);
42 }
43 }
78639a9 Function results in edit
jakubvrana authored
44 if ($_POST["export"]) {
79d1902 Substitute table name to $TABLE
jakubvrana authored
45 dump_headers($TABLE);
46 dump_table($TABLE, "");
e4f5d17 Dump column names in CSV select export
jakubvrana authored
47 if ($_POST["format"] != "sql") { // Editor doesn't send format
b79ef09 Don't dump backticks in CSV column names
jakubvrana authored
48 $row = array_keys($fields);
49 if ($select) {
50 $row = array();
51 foreach ($select as $val) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
52 $row[] = (ereg('^`.*`$', $val) ? idf_unescape($val) : $val); //! columns looking like functions
b79ef09 Don't dump backticks in CSV column names
jakubvrana authored
53 }
54 }
55 dump_csv($row);
e4f5d17 Dump column names in CSV select export
jakubvrana authored
56 }
16c4ddb Single faster POST query with primary key
jakubvrana authored
57 if (!is_array($_POST["check"]) || $primary === array()) {
ee3e045 @vrana Separate $where in limit function
authored
58 $where2 = $where;
59 if (is_array($_POST["check"])) {
60 $where2[] = "($where_check)";
61 }
62 dump_data($TABLE, "INSERT", "SELECT $from" . ($where2 ? "\nWHERE " . implode(" AND ", $where2) : "") . $group_by);
16c4ddb Single faster POST query with primary key
jakubvrana authored
63 } else {
fa5c952 Use extended INSERT in select export
jakubvrana authored
64 $union = array();
f7452ad Import and export
jakubvrana authored
65 foreach ($_POST["check"] as $val) {
16c4ddb Single faster POST query with primary key
jakubvrana authored
66 // where is not unique so OR can't be used
ee3e045 @vrana Separate $where in limit function
authored
67 $union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val) . $group_by, 1) . ")";
116faf2 Mass delete
jakubvrana authored
68 }
79d1902 Substitute table name to $TABLE
jakubvrana authored
69 dump_data($TABLE, "INSERT", implode(" UNION ALL ", $union));
116faf2 Mass delete
jakubvrana authored
70 }
78639a9 Function results in edit
jakubvrana authored
71 exit;
72 }
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
73 if (!$adminer->selectEmailProcess($where, $foreign_keys)) {
d90bde5 Fix delete in select
jakubvrana authored
74 if ($_POST["save"] || $_POST["delete"]) { // edit
00d9b36 E-mail sending only in Editor
jakubvrana authored
75 $result = true;
76 $affected = 0;
60c7ed9 @vrana MS SQL schema support
authored
77 $query = table($TABLE);
28b2b8d Readable variable initialization
jakubvrana authored
78 $set = array();
00d9b36 E-mail sending only in Editor
jakubvrana authored
79 if (!$_POST["delete"]) {
80 foreach ($columns as $name => $val) { //! should check also for edit or insert privileges
a0def47 Date localization
jakubvrana authored
81 $val = process_input($fields[$name]);
3f5b683 Reintegrate sqlite branch
jakubvrana authored
82 if ($val !== null) {
83 if ($_POST["clone"]) {
84 $set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name));
85 } elseif ($val !== false) {
86 $set[] = idf_escape($name) . " = $val";
87 }
00d9b36 E-mail sending only in Editor
jakubvrana authored
88 }
e7eb28d CSV import
jakubvrana authored
89 }
60c7ed9 @vrana MS SQL schema support
authored
90 $query .= ($_POST["clone"] ? " (" . implode(", ", array_keys($set)) . ")\nSELECT " . implode(", ", $set) . "\nFROM " . table($TABLE) : " SET\n" . implode(",\n", $set));
e7eb28d CSV import
jakubvrana authored
91 }
00d9b36 E-mail sending only in Editor
jakubvrana authored
92 if ($_POST["delete"] || $set) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
93 $command = "UPDATE";
94 if ($_POST["delete"]) {
95 $command = "DELETE";
96 $query = "FROM $query";
97 }
98 if ($_POST["clone"]) {
99 $command = "INSERT";
100 $query = "INTO $query";
101 }
102 if ($_POST["all"] || ($primary === array() && $_POST["check"]) || count($group) < count($select)) {
103 $result = queries($command . " $query" . ($_POST["all"] ? ($where ? "\nWHERE " . implode(" AND ", $where) : "") : "\nWHERE $where_check"));
64d616c Rename get_dbh to connection
jakubvrana authored
104 $affected = $connection->affected_rows;
00d9b36 E-mail sending only in Editor
jakubvrana authored
105 } else {
106 foreach ((array) $_POST["check"] as $val) {
107 // where is not unique so OR can't be used
ee3e045 @vrana Separate $where in limit function
authored
108 $result = queries($command . limit1($query, "\nWHERE " . where_check($val)));
00d9b36 E-mail sending only in Editor
jakubvrana authored
109 if (!$result) {
110 break;
111 }
64d616c Rename get_dbh to connection
jakubvrana authored
112 $affected += $connection->affected_rows;
38059b6 Remove empty if
jakubvrana authored
113 }
e7eb28d CSV import
jakubvrana authored
114 }
78639a9 Function results in edit
jakubvrana authored
115 }
dbdd40a Introduce queries_redirect function
jakubvrana authored
116 queries_redirect(remove_from_uri("page"), lang('%d item(s) have been affected.', $affected), $result);
00d9b36 E-mail sending only in Editor
jakubvrana authored
117 //! display edit page in case of an error
e0d9b3c In-place editation in select
jakubvrana authored
118 } elseif (!$_POST["import"]) { // modify
5050de5 @vrana Display modify hint as title
authored
119 if (!$_POST["val"]) {
120 $error = lang('Double click on a value to modify it.');
121 } else {
122 $result = true;
123 $affected = 0;
124 foreach ($_POST["val"] as $unique_idf => $row) {
125 $set = array();
126 foreach ($row as $key => $val) {
127 $key = bracket_escape($key, 1); // 1 - back
128 $set[] = idf_escape($key) . " = " . $adminer->processInput($fields[$key], $val);
129 }
ee3e045 @vrana Separate $where in limit function
authored
130 $result = queries("UPDATE" . limit1(table($TABLE) . " SET " . implode(", ", $set), " WHERE " . where_check($unique_idf) . ($where ? " AND " . implode(" AND ", $where) : ""))); // can change row on a different page without unique key
5050de5 @vrana Display modify hint as title
authored
131 if (!$result) {
132 break;
133 }
134 $affected += $connection->affected_rows;
e0d9b3c In-place editation in select
jakubvrana authored
135 }
5050de5 @vrana Display modify hint as title
authored
136 queries_redirect(remove_from_uri(), lang('%d item(s) have been affected.', $affected), $result);
e0d9b3c In-place editation in select
jakubvrana authored
137 }
25f01d3 Compress export and import
jakubvrana authored
138 } elseif (is_string($file = get_file("csv_file", true))) {
00d9b36 E-mail sending only in Editor
jakubvrana authored
139 $file = preg_replace("~^\xEF\xBB\xBF~", '', $file); //! character set
cb370a8 Respect max_allowed_packet in CSV import
jakubvrana authored
140 $result = true;
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
141 $cols = array_keys($fields);
8a04897 Use atomic group for CSV regexp
jakubvrana authored
142 preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches);
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
143 $affected = count($matches[0]);
d0c72ec Driver specific BEGIN
jakubvrana authored
144 begin();
acf7a42 Improve CSV; export
jakubvrana authored
145 $separator = ($_POST["separator"] == "csv" ? "," : ";");
00d9b36 E-mail sending only in Editor
jakubvrana authored
146 foreach ($matches[0] as $key => $val) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
147 preg_match_all("~((\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
148 if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n
00d9b36 E-mail sending only in Editor
jakubvrana authored
149 // first row corresponds to column names - use it for table structure
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
150 $cols = $matches2[1];
151 $affected--;
00d9b36 E-mail sending only in Editor
jakubvrana authored
152 } else {
782921b @vrana Finish SQLite
authored
153 $set = array();
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
154 foreach ($matches2[1] as $i => $col) {
782921b @vrana Finish SQLite
authored
155 $set[idf_escape($cols[$i])] = ($col == "" && $fields[$cols[$i]]["null"] ? "NULL" : $connection->quote(str_replace('""', '"', preg_replace('~^"|"$~', '', $col))));
00d9b36 E-mail sending only in Editor
jakubvrana authored
156 }
c505440 @vrana PostgreSQL import support
authored
157 $result = insert_update($TABLE, $set, $indexes);
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
158 if (!$result) {
159 break;
cb370a8 Respect max_allowed_packet in CSV import
jakubvrana authored
160 }
161 }
162 }
6ba224b Rollback unsuccessful CSV import
jakubvrana authored
163 if ($result) {
acf7a42 Improve CSV; export
jakubvrana authored
164 queries("COMMIT");
6ba224b Rollback unsuccessful CSV import
jakubvrana authored
165 }
dbdd40a Introduce queries_redirect function
jakubvrana authored
166 queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result);
782921b @vrana Finish SQLite
authored
167 queries("ROLLBACK"); // after queries_redirect() to not overwrite error
00d9b36 E-mail sending only in Editor
jakubvrana authored
168 } else {
169 $error = upload_error($file);
d83b654 Detect import errors
jakubvrana authored
170 }
ec23248 Exportable select
jakubvrana authored
171 }
116faf2 Mass delete
jakubvrana authored
172 }
c16c57b E-mail sending
jakubvrana authored
173
b9ffd64 Remove common prefix in backward key
jakubvrana authored
174 $table_name = $adminer->tableName($table_status);
175 page_header(lang('Select') . ": $table_name", $error);
e0d9b3c In-place editation in select
jakubvrana authored
176 session_write_close();
116faf2 Mass delete
jakubvrana authored
177
f2ed237 Display table links above table structure
jakubvrana authored
178 $set = null;
430034c Cottage homework
jakubvrana authored
179 if (isset($rights["insert"])) {
98507da Function verify_version doesn't use version parameter
jakubvrana authored
180 $set = "";
181 foreach ((array) $_GET["where"] as $val) {
182 if (count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
a1609c7 Align numbers to right in select
jakubvrana authored
183 || (!$val["op"] && !ereg('[_%]', $val["val"])) // LIKE in Editor
98507da Function verify_version doesn't use version parameter
jakubvrana authored
184 )) {
185 $set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
186 }
187 }
667bfec Decomposition
jakubvrana authored
188 }
f2ed237 Display table links above table structure
jakubvrana authored
189 $adminer->selectLinks($table_status, $set);
667bfec Decomposition
jakubvrana authored
190
ffcea8b Rights
jakubvrana authored
191 if (!$columns) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
192 echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "." : ": " . error()) . "\n";
ffcea8b Rights
jakubvrana authored
193 } else {
5ee29cb Select columns, aggregation
jakubvrana authored
194 echo "<form action='' id='form'>\n";
d24ad78 Select boxes customization
jakubvrana authored
195 echo "<div style='display: none;'>";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
196 hidden_fields_get();
8878799 @vrana Respect namespace
authored
197 echo (DB != "" ? '<input type="hidden" name="db" value="' . h(DB) . '">' . (isset($_GET["ns"]) ? '<input type="hidden" name="ns" value="' . h($_GET["ns"]) . '">' : "") : ""); // not used in Editor
79d1902 Substitute table name to $TABLE
jakubvrana authored
198 echo '<input type="hidden" name="select" value="' . h($TABLE) . '">';
d24ad78 Select boxes customization
jakubvrana authored
199 echo "</div>\n";
200 $adminer->selectColumnsPrint($select, $columns);
201 $adminer->selectSearchPrint($where, $columns, $indexes);
202 $adminer->selectOrderPrint($order, $columns, $indexes);
203 $adminer->selectLimitPrint($limit);
204 $adminer->selectLengthPrint($text_length);
205 $adminer->selectActionPrint($text_length);
ffcea8b Rights
jakubvrana authored
206 echo "</form>\n";
207
bd25295 Don't redirect from last page
jakubvrana authored
208 $page = $_GET["page"];
209 if ($page == "last") {
60c7ed9 @vrana MS SQL schema support
authored
210 $found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
bd25295 Don't redirect from last page
jakubvrana authored
211 $page = floor(($found_rows - 1) / $limit);
212 }
213
ee3e045 @vrana Separate $where in limit function
authored
214 $query = "SELECT" . limit((intval($limit) && $group && count($group) < count($select) && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . $from, ($where ? "\nWHERE " . implode(" AND ", $where) : "") . $group_by, ($limit != "" ? intval($limit) : null), ($page ? $limit * $page : 0), "\n");
c64c4fd Adminer class
jakubvrana authored
215 echo $adminer->selectQuery($query);
8b74511 Print SQL query (fixes #2082448)
jakubvrana authored
216
64d616c Rename get_dbh to connection
jakubvrana authored
217 $result = $connection->query($query);
21ea4ae Check errors
jakubvrana authored
218 if (!$result) {
c1130ed Simplify SQL syntax errors everywhere
jakubvrana authored
219 echo "<p class='error'>" . error() . "\n";
ffcea8b Rights
jakubvrana authored
220 } else {
e672694 @vrana Rename $driver to $jush
authored
221 if ($jush == "mssql") {
1b144a1 MS SQL pagination
jakubvrana authored
222 $result->seek($limit * $page);
223 }
f2365d0 Typo
jakubvrana authored
224 $email_fields = array();
e7eb28d CSV import
jakubvrana authored
225 echo "<form action='' method='post' enctype='multipart/form-data'>\n";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
226 $rows = array();
227 while ($row = $result->fetch_assoc()) {
228 $rows[] = $row;
229 }
230 // use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
1b144a1 MS SQL pagination
jakubvrana authored
231 if ($_GET["page"] != "last") {
232 $found_rows = (intval($limit) && $group && count($group) < count($select)
e672694 @vrana Rename $driver to $jush
authored
233 ? ($jush == "sql" ? $connection->result(" SELECT FOUND_ROWS()") : $connection->result("SELECT COUNT(*) FROM ($query) x")) // space to allow mysql.trace_mode
1b144a1 MS SQL pagination
jakubvrana authored
234 : count($rows)
235 );
236 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
237
238 if (!$rows) {
ace55ed HTML instead of XHTML
jakubvrana authored
239 echo "<p class='message'>" . lang('No rows.') . "\n";
21ea4ae Check errors
jakubvrana authored
240 } else {
09e93de Move backward keys to Editor
jakubvrana authored
241 $backward_keys = $adminer->backwardKeys($TABLE, $table_name);
c42c46a Table relations
jakubvrana authored
242
3c5c0f0 Use camelCase in JavaScript
jakubvrana authored
243 echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n";
22a7ebd @vrana Hide edit link without columns
authored
244 echo "<thead><tr>" . (!$group && $select ? "" : "<td><input type='checkbox' id='all-page' onclick='formCheck(this, /check/);'> <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('edit') . "</a>");
5034123 Apply field name with functions
jakubvrana authored
245 $names = array();
c40d1d0 Always handle double click
jakubvrana authored
246 $functions = array();
5034123 Apply field name with functions
jakubvrana authored
247 reset($select);
23df820 Distinguish no column order in fieldName
jakubvrana authored
248 $order = 1;
ba90d60 Introduce adminer_select_val
jakubvrana authored
249 foreach ($rows[0] as $key => $val) {
5034123 Apply field name with functions
jakubvrana authored
250 $val = $_GET["columns"][key($select)];
ba9c9a5 Display SQL function with braces in select heading
jakubvrana authored
251 $field = $fields[$select ? $val["col"] : $key];
6c97b80 Display only first five columns in Editor example
jakubvrana authored
252 $name = ($field ? $adminer->fieldName($field, $order) : "*");
7352c28 Replace strlen() by != ""
jakubvrana authored
253 if ($name != "") {
6c97b80 Display only first five columns in Editor example
jakubvrana authored
254 $order++;
5034123 Apply field name with functions
jakubvrana authored
255 $names[$key] = $name;
305a055 Go to first page after sorting (thanks to Jan Cerny)
jakubvrana authored
256 echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key) . ($_GET["order"][0] == $key && !$_GET["desc"][0] ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
116c873 Ignore tables and fields with empty name
jakubvrana authored
257 }
c40d1d0 Always handle double click
jakubvrana authored
258 $functions[$key] = $val["fun"];
5034123 Apply field name with functions
jakubvrana authored
259 next($select);
ba90d60 Introduce adminer_select_val
jakubvrana authored
260 }
e0d9b3c In-place editation in select
jakubvrana authored
261 $lengths = array();
262 if ($_GET["modify"]) {
263 foreach ($rows as $row) {
264 foreach ($row as $key => $val) {
265 $lengths[$key] = max($lengths[$key], min(40, strlen(utf8_decode($val))));
266 }
267 }
268 }
09e93de Move backward keys to Editor
jakubvrana authored
269 echo ($backward_keys ? "<th>" . lang('Relations') : "") . "</thead>\n";
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
270 foreach ($adminer->rowDescriptions($rows, $foreign_keys) as $n => $row) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
271 $unique_array = unique_array($rows[$n], $indexes);
16290b0 Respect where in COUNT(*) link
jakubvrana authored
272 $unique_idf = "";
273 foreach ($unique_array as $key => $val) {
274 $unique_idf .= "&" . (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
275 }
22a7ebd @vrana Hide edit link without columns
authored
276 echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . (count($group) < count($select) || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>"));
21ea4ae Check errors
jakubvrana authored
277 foreach ($row as $key => $val) {
78e49f0 Pass $field to select_val
jakubvrana authored
278 if (isset($names[$key])) {
a1609c7 Align numbers to right in select
jakubvrana authored
279 $field = $fields[$key];
7352c28 Replace strlen() by != ""
jakubvrana authored
280 if ($val != "" && (!isset($email_fields[$key]) || $email_fields[$key] != "")) {
e0d9b3c In-place editation in select
jakubvrana authored
281 $email_fields[$key] = (is_email($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
116c873 Ignore tables and fields with empty name
jakubvrana authored
282 }
5911cf1 Always call select_val
jakubvrana authored
283 $link = "";
a1609c7 Align numbers to right in select
jakubvrana authored
284 $val = $adminer->editVal($val, $field);
116c873 Ignore tables and fields with empty name
jakubvrana authored
285 if (!isset($val)) {
286 $val = "<i>NULL</i>";
21ea4ae Check errors
jakubvrana authored
287 } else {
375a5c8 @vrana Non-MySQL binary types
authored
288 if (ereg('binary|blob|bytea|raw|file', $field["type"]) && $val != "") {
35ec64c Link COUNT(*) result to listing
jakubvrana authored
289 $link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf);
97b8c7b Display images in Editor
jakubvrana authored
290 }
7352c28 Replace strlen() by != ""
jakubvrana authored
291 if ($val == "") {
116c873 Ignore tables and fields with empty name
jakubvrana authored
292 $val = "&nbsp;";
7352c28 Replace strlen() by != ""
jakubvrana authored
293 } elseif ($text_length != "" && ereg('text|blob', $field["type"]) && is_utf8($val)) {
1859adc Comments
jakubvrana authored
294 $val = shorten_utf8($val, max(0, intval($text_length))); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
116c873 Ignore tables and fields with empty name
jakubvrana authored
295 } else {
50881f8 Move whitespace to CSS
jakubvrana authored
296 $val = h($val);
21ea4ae Check errors
jakubvrana authored
297 }
116c873 Ignore tables and fields with empty name
jakubvrana authored
298
db46fc2 Maintain insert prefill value
jakubvrana authored
299 if (!$link) { // link related items
300 foreach ((array) $foreign_keys[$key] as $foreign_key) {
301 if (count($foreign_keys[$key]) == 1 || count($foreign_key["source"]) == 1) {
302 foreach ($foreign_key["source"] as $i => $source) {
303 $link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
304 }
7352c28 Replace strlen() by != ""
jakubvrana authored
305 $link = h(($foreign_key["db"] != "" ? preg_replace('~([?&]db=)[^&]+~', '\\1' . urlencode($foreign_key["db"]), ME) : ME) . 'select=' . urlencode($foreign_key["table"]) . $link); // InnoDB supports non-UNIQUE keys
db46fc2 Maintain insert prefill value
jakubvrana authored
306 break;
116c873 Ignore tables and fields with empty name
jakubvrana authored
307 }
21ea4ae Check errors
jakubvrana authored
308 }
ffcea8b Rights
jakubvrana authored
309 }
35ec64c Link COUNT(*) result to listing
jakubvrana authored
310 if ($key == "COUNT(*)") { //! columns looking like functions
311 $link = h(ME . "select=" . urlencode($TABLE));
312 $i = 0;
16290b0 Respect where in COUNT(*) link
jakubvrana authored
313 foreach ((array) $_GET["where"] as $v) {
314 if (!array_key_exists($v["col"], $unique_array)) {
22eb69b @vrana Remove operator double encode
authored
315 $link .= h(where_link($i++, $v["col"], $v["val"], $v["op"]));
16290b0 Respect where in COUNT(*) link
jakubvrana authored
316 }
317 }
318 foreach ($unique_array as $k => $v) {
186c058 Utilize where_link function
jakubvrana authored
319 $link .= h(where_link($i++, $k, $v, (isset($v) ? "=" : "IS NULL")));
35ec64c Link COUNT(*) result to listing
jakubvrana authored
320 }
321 }
fa3dd55 Parent
jakubvrana authored
322 }
2cec758 @vrana Direct links from HTTPS to HTTP
authored
323 if (!$link) {
324 if (is_email($val)) {
325 $link = "mailto:$val";
326 }
327 if ($protocol = is_url($row[$key])) {
328 $link = ($protocol == "http" && $HTTPS
329 ? $row[$key] // HTTP links from HTTPS pages don't receive Referer automatically
330 : "$protocol://www.adminer.org/redirect/?url=" . urlencode($row[$key]) // intermediate page to hide Referer, may be changed to rel="noreferrer" in HTML5
331 );
332 }
bc78866 Link URLs in select
jakubvrana authored
333 }
e0d9b3c In-place editation in select
jakubvrana authored
334 $id = h("val[$unique_idf][" . bracket_escape($key) . "]");
335 $value = $_POST["val"][$unique_idf][bracket_escape($key)];
336 $h_value = h(isset($value) ? $value : $row[$key]);
687b3fd @vrana Replace <strong> by <b> and <em> by <i>
authored
337 $long = strpos($val, "<i>...</i>");
c40d1d0 Always handle double click
jakubvrana authored
338 $editable = is_utf8($val) && !$long && $rows[$n][$key] == $row[$key] && !$functions[$key];
375a5c8 @vrana Non-MySQL binary types
authored
339 $text = ereg('text|lob', $field["type"]);
e0d9b3c In-place editation in select
jakubvrana authored
340 echo (($_GET["modify"] && $editable) || isset($value)
341 ? "<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]'>")
4489bb7 @vrana Update translations
authored
342 : "<td id='$id' ondblclick=\"" . ($editable ? "selectDblClick(this, event" . ($text ? ", 1" : "") . ")" : "alert('" . h($long ? lang('Increase text length to modify this value.') : lang('Use edit link to modify this value.')) . "')") . ";\">" . $adminer->selectVal($val, $link, $field)
e0d9b3c In-place editation in select
jakubvrana authored
343 );
667bfec Decomposition
jakubvrana authored
344 }
345 }
09e93de Move backward keys to Editor
jakubvrana authored
346 $adminer->backwardKeysPrint($backward_keys, $rows[$n]);
26e8ab9 Close </tr> because of white-space: pre
jakubvrana authored
347 echo "</tr>\n"; // close to allow white-space: pre
5ab708a Compact pages
jakubvrana authored
348 }
21ea4ae Check errors
jakubvrana authored
349 echo "</table>\n";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
350 }
351
352 parse_str($_COOKIE["adminer_export"], $adminer_export);
353
bd25295 Don't redirect from last page
jakubvrana authored
354 if ($rows || $page) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
355 $exact_count = true;
1b144a1 MS SQL pagination
jakubvrana authored
356 if ($_GET["page"] != "last" && intval($limit) && count($group) >= count($select) && ($found_rows >= $limit || $page)) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
357 $found_rows = $table_status["Rows"];
bd25295 Don't redirect from last page
jakubvrana authored
358 if (!isset($found_rows) || $where || 2 * $page * $limit > $found_rows || ($table_status["Engine"] == "InnoDB" && $found_rows < 1e4)) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
359 // slow with big tables
360 ob_flush();
361 flush();
60c7ed9 @vrana MS SQL schema support
authored
362 $found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
3f5b683 Reintegrate sqlite branch
jakubvrana authored
363 } else {
364 $exact_count = false;
365 }
4cdc459 FOUND_ROWS works with last SELECT
jakubvrana authored
366 }
fde1171 Add CSS classes (thanks to cvicebni ubor)
jakubvrana authored
367 echo "<p class='pages'>";
e4b188c Display found rows
jakubvrana authored
368 if (intval($limit) && $found_rows > $limit) {
bd25295 Don't redirect from last page
jakubvrana authored
369 // display first, previous 4, next 4 and last page
21ea4ae Check errors
jakubvrana authored
370 $max_page = floor(($found_rows - 1) / $limit);
5a11c99 @vrana Ability to jump to any page by JavaScript
authored
371 echo '<a href="' . h(remove_from_uri("page")) . "\" onclick=\"var page = +prompt('" . lang('Page') . "', '" . ($page + 1) . "'); if (!isNaN(page) &amp;&amp; page) location.href = this.href + (page != 1 ? '&amp;page=' + (page - 1) : ''); return false;\">" . lang('Page') . "</a>:" . pagination(0, $page) . ($page > 5 ? " ..." : "");
bd25295 Don't redirect from last page
jakubvrana authored
372 for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
373 echo pagination($i, $page);
21ea4ae Check errors
jakubvrana authored
374 }
bd25295 Don't redirect from last page
jakubvrana authored
375 echo ($page + 5 < $max_page ? " ..." : "") . ($exact_count ? pagination($max_page, $page) : ' <a href="' . h(remove_from_uri() . "&page=last") . '">' . lang('last') . "</a>");
5ab708a Compact pages
jakubvrana authored
376 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
377 echo " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " . checkbox("all", 1, 0, lang('whole result')) . "\n";
8b74511 Print SQL query (fixes #2082448)
jakubvrana authored
378
e0d9b3c In-place editation in select
jakubvrana authored
379 if (!information_schema(DB)) {
380 ?>
381 <fieldset><legend><?php echo lang('Edit'); ?></legend><div>
5050de5 @vrana Display modify hint as title
authored
382 <input type="submit" value="<?php echo lang('Save'); ?>" title="<?php echo lang('Double click on a value to modify it.'); ?>">
e0d9b3c In-place editation in select
jakubvrana authored
383 <input type="submit" name="edit" value="<?php echo lang('Edit'); ?>">
384 <input type="submit" name="clone" value="<?php echo lang('Clone'); ?>">
385 <input type="submit" name="delete" value="<?php echo lang('Delete'); ?>" onclick="return confirm('<?php echo lang('Are you sure?'); ?> (' + (this.form['all'].checked ? <?php echo $found_rows; ?> : formChecked(this, /check/)) + ')');">
386 </div></fieldset>
387 <?php
388 }
dc667ea Hide select export and import
jakubvrana authored
389 print_fieldset("export", lang('Export'));
3f5b683 Reintegrate sqlite branch
jakubvrana authored
390 echo $adminer->dumpOutput(1, $adminer_export["output"]) . " " . $adminer->dumpFormat(1, $adminer_export["format"]); // 1 - select
e40612a Use radio in export
jakubvrana authored
391 echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
dc667ea Hide select export and import
jakubvrana authored
392 echo "</div></fieldset>\n";
667bfec Decomposition
jakubvrana authored
393 }
dc667ea Hide select export and import
jakubvrana authored
394 print_fieldset("import", lang('CSV Import'), !$result->num_rows);
3f5b683 Reintegrate sqlite branch
jakubvrana authored
395 echo "<input type='hidden' name='token' value='$token'><input type='file' name='csv_file'> ";
acf7a42 Improve CSV; export
jakubvrana authored
396 echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;"), $adminer_export["format"], 1); // 1 - select
3f5b683 Reintegrate sqlite branch
jakubvrana authored
397 echo " <input type='submit' name='import' value='" . lang('Import') . "'>\n";
dc667ea Hide select export and import
jakubvrana authored
398 echo "</div></fieldset>\n";
c16c57b E-mail sending
jakubvrana authored
399
1e55d47 User interface for e-mail {$name}
jakubvrana authored
400 $adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);
c16c57b E-mail sending
jakubvrana authored
401
e7eb28d CSV import
jakubvrana authored
402 echo "</form>\n";
667bfec Decomposition
jakubvrana authored
403 }
404 }
Something went wrong with that request. Please try again.