Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 429 lines (410 sloc) 19.113 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);
f425601 Jakub Vrána Hide hidden columns in PostgreSQL (thanks to Pavel Stehule)
authored
5 $fields = fields($TABLE);
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
6 $foreign_keys = column_foreign_keys($TABLE);
37d8146 Jakub Vrána Utilize oids in PostgreSQL
authored
7 if ($table_status["Oid"] == "t") {
8 $indexes[] = array("type" => "PRIMARY", "columns" => array("oid"));
9 }
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
10
64ba924 Comments
jakubvrana authored
11 $rights = array(); // privilege => 0
12 $columns = array(); // selectable columns
0115315 Init with null
jakubvrana authored
13 $text_length = null;
ffcea8b Rights
jakubvrana authored
14 foreach ($fields as $key => $field) {
c64c4fd Adminer class
jakubvrana authored
15 $name = $adminer->fieldName($field);
7352c28 Replace strlen() by != ""
jakubvrana authored
16 if (isset($field["privileges"]["select"]) && $name != "") {
1e4d11e Select from foreign keys in Editor
jakubvrana authored
17 $columns[$key] = html_entity_decode(strip_tags($name));
375a5c8 Jakub Vrána Non-MySQL binary types
authored
18 if (ereg('text|lob', $field["type"])) {
d24ad78 Select boxes customization
jakubvrana authored
19 $text_length = $adminer->selectLengthProcess();
16c4ddb Single faster POST query with primary key
jakubvrana authored
20 }
ffcea8b Rights
jakubvrana authored
21 }
430034c Cottage homework
jakubvrana authored
22 $rights += $field["privileges"];
23 }
24
d24ad78 Select boxes customization
jakubvrana authored
25 list($select, $group) = $adminer->selectColumnsProcess($columns, $indexes);
07e1ae1 FOUND_ROWS only with GROUP BY
jakubvrana authored
26 $where = $adminer->selectSearchProcess($fields, $indexes);
27 $order = $adminer->selectOrderProcess($fields, $indexes);
d24ad78 Select boxes customization
jakubvrana authored
28 $limit = $adminer->selectLimitProcess();
37d8146 Jakub Vrána Utilize oids in PostgreSQL
authored
29 $from = ($select ? implode(", ", $select) : ($table_status["Oid"] == "t" ? "oid, " : "") . "*") . "\nFROM " . table($TABLE);
e44fbc2 Wrap SQL query
jakubvrana authored
30 $group_by = ($group && count($group) < count($select) ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
116faf2 Mass delete
jakubvrana authored
31
390e38b Jakub Vrána Load long texts for inline-edit by AJAX
authored
32 if ($_GET["val"] && is_ajax()) {
33 header("Content-Type: text/plain; charset=utf-8");
34 foreach ($_GET["val"] as $unique_idf => $row) {
35 echo $connection->result("SELECT" . limit(idf_escape(key($row)) . " FROM " . table($TABLE), " WHERE " . where_check($unique_idf) . ($where ? " AND " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : ""), 1));
36 }
37 exit;
38 }
39
116faf2 Mass delete
jakubvrana authored
40 if ($_POST && !$error) {
56948c9 $_POST[check] may be empty
jakubvrana authored
41 $where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")";
6e50eb8 Jakub Vrána Pass primary key to insert_update function
authored
42 $primary = $unselected = null;
2ad8ab4 Jakub Vrána Primary key detection for other drivers
authored
43 foreach ($indexes as $index) {
44 if ($index["type"] == "PRIMARY") {
6e50eb8 Jakub Vrána Pass primary key to insert_update function
authored
45 $primary = array_flip($index["columns"]);
46 $unselected = ($select ? $primary : array());
2ad8ab4 Jakub Vrána Primary key detection for other drivers
authored
47 break;
48 }
49 }
d2c513d Jakub Vrána Column names customization (bug #3194500)
authored
50 foreach ((array) $unselected as $key => $val) {
51 if (in_array(idf_escape($key), $select)) {
52 unset($unselected[$key]);
d24ad78 Select boxes customization
jakubvrana authored
53 }
54 }
78639a9 Function results in edit
jakubvrana authored
55 if ($_POST["export"]) {
8ab6fff Jakub Vrána Centralize dump_headers
authored
56 dump_headers($TABLE);
095d472 Jakub Vrána Customizable export
authored
57 $adminer->dumpTable($TABLE, "");
6e50eb8 Jakub Vrána Pass primary key to insert_update function
authored
58 if (!is_array($_POST["check"]) || $unselected === array()) {
ee3e045 Jakub Vrána Separate $where in limit function
authored
59 $where2 = $where;
60 if (is_array($_POST["check"])) {
61 $where2[] = "($where_check)";
62 }
15715b3 Jakub Vrána Export SQL command result (bug #3116854)
authored
63 $query = "SELECT $from" . ($where2 ? "\nWHERE " . implode(" AND ", $where2) : "") . $group_by;
16c4ddb Single faster POST query with primary key
jakubvrana authored
64 } else {
fa5c952 Use extended INSERT in select export
jakubvrana authored
65 $union = array();
f7452ad Import and export
jakubvrana authored
66 foreach ($_POST["check"] as $val) {
16c4ddb Single faster POST query with primary key
jakubvrana authored
67 // where is not unique so OR can't be used
ee3e045 Jakub Vrána Separate $where in limit function
authored
68 $union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val) . $group_by, 1) . ")";
116faf2 Mass delete
jakubvrana authored
69 }
15715b3 Jakub Vrána Export SQL command result (bug #3116854)
authored
70 $query = implode(" UNION ALL ", $union);
116faf2 Mass delete
jakubvrana authored
71 }
15715b3 Jakub Vrána Export SQL command result (bug #3116854)
authored
72 $adminer->dumpData($TABLE, "table", $query);
78639a9 Function results in edit
jakubvrana authored
73 exit;
74 }
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
75 if (!$adminer->selectEmailProcess($where, $foreign_keys)) {
d90bde5 Fix delete in select
jakubvrana authored
76 if ($_POST["save"] || $_POST["delete"]) { // edit
00d9b36 E-mail sending only in Editor
jakubvrana authored
77 $result = true;
78 $affected = 0;
60c7ed9 Jakub Vrána MS SQL schema support
authored
79 $query = table($TABLE);
28b2b8d Readable variable initialization
jakubvrana authored
80 $set = array();
00d9b36 E-mail sending only in Editor
jakubvrana authored
81 if (!$_POST["delete"]) {
82 foreach ($columns as $name => $val) { //! should check also for edit or insert privileges
a0def47 Date localization
jakubvrana authored
83 $val = process_input($fields[$name]);
3f5b683 Reintegrate sqlite branch
jakubvrana authored
84 if ($val !== null) {
85 if ($_POST["clone"]) {
86 $set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name));
87 } elseif ($val !== false) {
88 $set[] = idf_escape($name) . " = $val";
89 }
00d9b36 E-mail sending only in Editor
jakubvrana authored
90 }
e7eb28d CSV import
jakubvrana authored
91 }
60c7ed9 Jakub Vrána MS SQL schema support
authored
92 $query .= ($_POST["clone"] ? " (" . implode(", ", array_keys($set)) . ")\nSELECT " . implode(", ", $set) . "\nFROM " . table($TABLE) : " SET\n" . implode(",\n", $set));
e7eb28d CSV import
jakubvrana authored
93 }
00d9b36 E-mail sending only in Editor
jakubvrana authored
94 if ($_POST["delete"] || $set) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
95 $command = "UPDATE";
96 if ($_POST["delete"]) {
97 $command = "DELETE";
98 $query = "FROM $query";
99 }
100 if ($_POST["clone"]) {
101 $command = "INSERT";
102 $query = "INTO $query";
103 }
6e50eb8 Jakub Vrána Pass primary key to insert_update function
authored
104 if ($_POST["all"] || ($unselected === array() && $_POST["check"]) || count($group) < count($select)) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
105 $result = queries($command . " $query" . ($_POST["all"] ? ($where ? "\nWHERE " . implode(" AND ", $where) : "") : "\nWHERE $where_check"));
64d616c Rename get_dbh to connection
jakubvrana authored
106 $affected = $connection->affected_rows;
00d9b36 E-mail sending only in Editor
jakubvrana authored
107 } else {
108 foreach ((array) $_POST["check"] as $val) {
109 // where is not unique so OR can't be used
ee3e045 Jakub Vrána Separate $where in limit function
authored
110 $result = queries($command . limit1($query, "\nWHERE " . where_check($val)));
00d9b36 E-mail sending only in Editor
jakubvrana authored
111 if (!$result) {
112 break;
113 }
64d616c Rename get_dbh to connection
jakubvrana authored
114 $affected += $connection->affected_rows;
38059b6 Remove empty if
jakubvrana authored
115 }
e7eb28d CSV import
jakubvrana authored
116 }
78639a9 Function results in edit
jakubvrana authored
117 }
dbdd40a Introduce queries_redirect function
jakubvrana authored
118 queries_redirect(remove_from_uri("page"), lang('%d item(s) have been affected.', $affected), $result);
00d9b36 E-mail sending only in Editor
jakubvrana authored
119 //! display edit page in case of an error
e0d9b3c In-place editation in select
jakubvrana authored
120 } elseif (!$_POST["import"]) { // modify
5050de5 Jakub Vrána Display modify hint as title
authored
121 if (!$_POST["val"]) {
122 $error = lang('Double click on a value to modify it.');
123 } else {
124 $result = true;
125 $affected = 0;
126 foreach ($_POST["val"] as $unique_idf => $row) {
127 $set = array();
128 foreach ($row as $key => $val) {
129 $key = bracket_escape($key, 1); // 1 - back
0782a7b Jakub Vrána Save '' instead of NULL for empty char (some drivers don't have varchar)
authored
130 $set[] = idf_escape($key) . " = " . (ereg('char|text', $fields[$key]["type"]) || $val != "" ? $adminer->processInput($fields[$key], $val) : "NULL");
5050de5 Jakub Vrána Display modify hint as title
authored
131 }
ca27ffc Jakub Vrána Display 0 in SQLite (bug #3120685)
authored
132 $query = table($TABLE) . " SET " . implode(", ", $set);
133 $where2 = " WHERE " . where_check($unique_idf) . ($where ? " AND " . implode(" AND ", $where) : "");
134 $result = queries("UPDATE" . (count($group) < count($select) ? " $query$where2" : limit1($query, $where2))); // can change row on a different page without unique key
5050de5 Jakub Vrána Display modify hint as title
authored
135 if (!$result) {
136 break;
137 }
138 $affected += $connection->affected_rows;
e0d9b3c In-place editation in select
jakubvrana authored
139 }
5050de5 Jakub Vrána Display modify hint as title
authored
140 queries_redirect(remove_from_uri(), lang('%d item(s) have been affected.', $affected), $result);
e0d9b3c In-place editation in select
jakubvrana authored
141 }
25f01d3 Compress export and import
jakubvrana authored
142 } elseif (is_string($file = get_file("csv_file", true))) {
9ff10f8 Jakub Vrána Parse UTF-16 and UTF-8 BOM in all text uploads
authored
143 //! character set
cb370a8 Respect max_allowed_packet in CSV import
jakubvrana authored
144 $result = true;
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
145 $cols = array_keys($fields);
8a04897 Use atomic group for CSV regexp
jakubvrana authored
146 preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches);
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
147 $affected = count($matches[0]);
d0c72ec Driver specific BEGIN
jakubvrana authored
148 begin();
e225d22 Jakub Vrána TSV export and import (bug #3097657)
authored
149 $separator = ($_POST["separator"] == "csv" ? "," : ($_POST["separator"] == "tsv" ? "\t" : ";"));
00d9b36 E-mail sending only in Editor
jakubvrana authored
150 foreach ($matches[0] as $key => $val) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
151 preg_match_all("~((\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
152 if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n
00d9b36 E-mail sending only in Editor
jakubvrana authored
153 // first row corresponds to column names - use it for table structure
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
154 $cols = $matches2[1];
155 $affected--;
00d9b36 E-mail sending only in Editor
jakubvrana authored
156 } else {
782921b Jakub Vrána Finish SQLite
authored
157 $set = array();
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
158 foreach ($matches2[1] as $i => $col) {
7e644b4 Jakub Vrána Save bytes ($connection->quote shortcut)
authored
159 $set[idf_escape($cols[$i])] = ($col == "" && $fields[$cols[$i]]["null"] ? "NULL" : q(str_replace('""', '"', preg_replace('~^"|"$~', '', $col))));
00d9b36 E-mail sending only in Editor
jakubvrana authored
160 }
6e50eb8 Jakub Vrána Pass primary key to insert_update function
authored
161 $result = insert_update($TABLE, $set, $primary);
e895368 Use ON DUPLICATE KEY UPDATE for CSV import
jakubvrana authored
162 if (!$result) {
163 break;
cb370a8 Respect max_allowed_packet in CSV import
jakubvrana authored
164 }
165 }
166 }
6ba224b Rollback unsuccessful CSV import
jakubvrana authored
167 if ($result) {
acf7a42 Improve CSV; export
jakubvrana authored
168 queries("COMMIT");
6ba224b Rollback unsuccessful CSV import
jakubvrana authored
169 }
dbdd40a Introduce queries_redirect function
jakubvrana authored
170 queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result);
782921b Jakub Vrána Finish SQLite
authored
171 queries("ROLLBACK"); // after queries_redirect() to not overwrite error
00d9b36 E-mail sending only in Editor
jakubvrana authored
172 } else {
173 $error = upload_error($file);
d83b654 Detect import errors
jakubvrana authored
174 }
ec23248 Exportable select
jakubvrana authored
175 }
116faf2 Mass delete
jakubvrana authored
176 }
c16c57b E-mail sending
jakubvrana authored
177
b9ffd64 Remove common prefix in backward key
jakubvrana authored
178 $table_name = $adminer->tableName($table_status);
179 page_header(lang('Select') . ": $table_name", $error);
e0d9b3c In-place editation in select
jakubvrana authored
180 session_write_close();
116faf2 Mass delete
jakubvrana authored
181
f2ed237 Display table links above table structure
jakubvrana authored
182 $set = null;
430034c Cottage homework
jakubvrana authored
183 if (isset($rights["insert"])) {
98507da Function verify_version doesn't use version parameter
jakubvrana authored
184 $set = "";
185 foreach ((array) $_GET["where"] as $val) {
186 if (count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
a1609c7 Align numbers to right in select
jakubvrana authored
187 || (!$val["op"] && !ereg('[_%]', $val["val"])) // LIKE in Editor
98507da Function verify_version doesn't use version parameter
jakubvrana authored
188 )) {
189 $set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
190 }
191 }
667bfec Decomposition
jakubvrana authored
192 }
f2ed237 Display table links above table structure
jakubvrana authored
193 $adminer->selectLinks($table_status, $set);
667bfec Decomposition
jakubvrana authored
194
ffcea8b Rights
jakubvrana authored
195 if (!$columns) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
196 echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "." : ": " . error()) . "\n";
ffcea8b Rights
jakubvrana authored
197 } else {
b68ddca Jakub Vrána Send all forms by Ctrl+Enter on <select>
authored
198 echo "<form action='' id='form'>\n";
d24ad78 Select boxes customization
jakubvrana authored
199 echo "<div style='display: none;'>";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
200 hidden_fields_get();
8878799 Jakub Vrána Respect namespace
authored
201 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
202 echo '<input type="hidden" name="select" value="' . h($TABLE) . '">';
d24ad78 Select boxes customization
jakubvrana authored
203 echo "</div>\n";
204 $adminer->selectColumnsPrint($select, $columns);
205 $adminer->selectSearchPrint($where, $columns, $indexes);
206 $adminer->selectOrderPrint($order, $columns, $indexes);
207 $adminer->selectLimitPrint($limit);
208 $adminer->selectLengthPrint($text_length);
d7183de Jakub Vrána Typo
authored
209 $adminer->selectActionPrint();
ffcea8b Rights
jakubvrana authored
210 echo "</form>\n";
211
bd25295 Don't redirect from last page
jakubvrana authored
212 $page = $_GET["page"];
213 if ($page == "last") {
60c7ed9 Jakub Vrána MS SQL schema support
authored
214 $found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
31afb96 Jakub Vrána Last page with empty result (thanks to Frantisek Svoboda)
authored
215 $page = floor(max(0, $found_rows - 1) / $limit);
bd25295 Don't redirect from last page
jakubvrana authored
216 }
217
04eccba Jakub Vrána Allow bigger numbers under 32 bits
authored
218 $query = "SELECT" . limit((+$limit && $group && count($group) < count($select) && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . $from, ($where ? "\nWHERE " . implode(" AND ", $where) : "") . $group_by, ($limit != "" ? +$limit : null), ($page ? $limit * $page : 0), "\n");
c64c4fd Adminer class
jakubvrana authored
219 echo $adminer->selectQuery($query);
8b74511 Print SQL query (fixes #2082448)
jakubvrana authored
220
64d616c Rename get_dbh to connection
jakubvrana authored
221 $result = $connection->query($query);
21ea4ae Check errors
jakubvrana authored
222 if (!$result) {
c1130ed Simplify SQL syntax errors everywhere
jakubvrana authored
223 echo "<p class='error'>" . error() . "\n";
ffcea8b Rights
jakubvrana authored
224 } else {
e672694 Jakub Vrána Rename $driver to $jush
authored
225 if ($jush == "mssql") {
1b144a1 MS SQL pagination
jakubvrana authored
226 $result->seek($limit * $page);
227 }
f2365d0 Typo
jakubvrana authored
228 $email_fields = array();
b535853 Jakub Vrána Full AJAX only with pushState to work correctly with history
authored
229 echo "<form action='' method='post' enctype='multipart/form-data'>\n";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
230 $rows = array();
231 while ($row = $result->fetch_assoc()) {
6a49137 Jakub Vrána Pagination support in Oracle (bug #3306828)
authored
232 if ($page && $jush == "oracle") {
233 unset($row["RNUM"]);
234 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
235 $rows[] = $row;
236 }
237 // use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
1b144a1 MS SQL pagination
jakubvrana authored
238 if ($_GET["page"] != "last") {
04eccba Jakub Vrána Allow bigger numbers under 32 bits
authored
239 $found_rows = (+$limit && $group && count($group) < count($select)
e672694 Jakub Vrána Rename $driver to $jush
authored
240 ? ($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
241 : count($rows)
242 );
243 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
244
245 if (!$rows) {
ace55ed HTML instead of XHTML
jakubvrana authored
246 echo "<p class='message'>" . lang('No rows.') . "\n";
21ea4ae Check errors
jakubvrana authored
247 } else {
09e93de Move backward keys to Editor
jakubvrana authored
248 $backward_keys = $adminer->backwardKeys($TABLE, $table_name);
c42c46a Table relations
jakubvrana authored
249
241fc4e Jakub Vrána Ctrl+Up and Down in edit and in-place edit
authored
250 echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);' onkeydown='return editingKeydown(event);'>\n";
22a7ebd Jakub Vrána Hide edit link without columns
authored
251 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
252 $names = array();
c40d1d0 Always handle double click
jakubvrana authored
253 $functions = array();
5034123 Apply field name with functions
jakubvrana authored
254 reset($select);
9bc9b9f Jakub Vrána Don't overwrite variable
authored
255 $rank = 1;
ba90d60 Introduce adminer_select_val
jakubvrana authored
256 foreach ($rows[0] as $key => $val) {
37d8146 Jakub Vrána Utilize oids in PostgreSQL
authored
257 if ($table_status["Oid"] != "t" || $key != "oid") {
258 $val = $_GET["columns"][key($select)];
d2c513d Jakub Vrána Column names customization (bug #3194500)
authored
259 $field = $fields[$select ? ($val ? $val["col"] : current($select)) : $key];
37d8146 Jakub Vrána Utilize oids in PostgreSQL
authored
260 $name = ($field ? $adminer->fieldName($field, $rank) : "*");
261 if ($name != "") {
262 $rank++;
263 $names[$key] = $name;
264 $column = idf_escape($key);
d2c513d Jakub Vrána Column names customization (bug #3194500)
authored
265 echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key)
266 . ($order[0] == $column || $order[0] == $key || (!$order && count($group) < count($select) && $group[0] == $column) ? '&desc%5B0%5D=1' : '') // $order[0] == $key - COUNT(*)
267 ) . '">' . (!$select || $val ? apply_sql_function($val["fun"], $name) : h(current($select))) . "</a>"; //! columns looking like functions
37d8146 Jakub Vrána Utilize oids in PostgreSQL
authored
268 }
269 $functions[$key] = $val["fun"];
270 next($select);
116c873 Ignore tables and fields with empty name
jakubvrana authored
271 }
ba90d60 Introduce adminer_select_val
jakubvrana authored
272 }
e0d9b3c In-place editation in select
jakubvrana authored
273 $lengths = array();
274 if ($_GET["modify"]) {
275 foreach ($rows as $row) {
276 foreach ($row as $key => $val) {
277 $lengths[$key] = max($lengths[$key], min(40, strlen(utf8_decode($val))));
278 }
279 }
280 }
09e93de Move backward keys to Editor
jakubvrana authored
281 echo ($backward_keys ? "<th>" . lang('Relations') : "") . "</thead>\n";
dea345c Substitute foreign keys in e-mail fields
jakubvrana authored
282 foreach ($adminer->rowDescriptions($rows, $foreign_keys) as $n => $row) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
283 $unique_array = unique_array($rows[$n], $indexes);
16290b0 Respect where in COUNT(*) link
jakubvrana authored
284 $unique_idf = "";
285 foreach ($unique_array as $key => $val) {
286 $unique_idf .= "&" . (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
287 }
22a7ebd Jakub Vrána Hide edit link without columns
authored
288 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
289 foreach ($row as $key => $val) {
78e49f0 Pass $field to select_val
jakubvrana authored
290 if (isset($names[$key])) {
a1609c7 Align numbers to right in select
jakubvrana authored
291 $field = $fields[$key];
7352c28 Replace strlen() by != ""
jakubvrana authored
292 if ($val != "" && (!isset($email_fields[$key]) || $email_fields[$key] != "")) {
1cf374b Jakub Vrána Rename functions (avoid conflict with WordPress)
authored
293 $email_fields[$key] = (is_mail($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
116c873 Ignore tables and fields with empty name
jakubvrana authored
294 }
5911cf1 Always call select_val
jakubvrana authored
295 $link = "";
a1609c7 Align numbers to right in select
jakubvrana authored
296 $val = $adminer->editVal($val, $field);
116c873 Ignore tables and fields with empty name
jakubvrana authored
297 if (!isset($val)) {
298 $val = "<i>NULL</i>";
21ea4ae Check errors
jakubvrana authored
299 } else {
5a73c01 Jakub Vrána Treat binary type as hex
authored
300 if (ereg('blob|bytea|raw|file', $field["type"]) && $val != "") {
35ec64c Link COUNT(*) result to listing
jakubvrana authored
301 $link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf);
97b8c7b Display images in Editor
jakubvrana authored
302 }
ca27ffc Jakub Vrána Display 0 in SQLite (bug #3120685)
authored
303 if ($val === "") { // === - may be int
116c873 Ignore tables and fields with empty name
jakubvrana authored
304 $val = "&nbsp;";
7352c28 Replace strlen() by != ""
jakubvrana authored
305 } elseif ($text_length != "" && ereg('text|blob', $field["type"]) && is_utf8($val)) {
04eccba Jakub Vrána Allow bigger numbers under 32 bits
authored
306 $val = shorten_utf8($val, max(0, +$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
307 } else {
50881f8 Move whitespace to CSS
jakubvrana authored
308 $val = h($val);
21ea4ae Check errors
jakubvrana authored
309 }
116c873 Ignore tables and fields with empty name
jakubvrana authored
310
db46fc2 Maintain insert prefill value
jakubvrana authored
311 if (!$link) { // link related items
312 foreach ((array) $foreign_keys[$key] as $foreign_key) {
81f58ed Jakub Vrána Link more foreign keys
authored
313 if (count($foreign_keys[$key]) == 1 || end($foreign_key["source"]) == $key) {
314 $link = "";
db46fc2 Maintain insert prefill value
jakubvrana authored
315 foreach ($foreign_key["source"] as $i => $source) {
316 $link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
317 }
7352c28 Replace strlen() by != ""
jakubvrana authored
318 $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
81f58ed Jakub Vrána Link more foreign keys
authored
319 if (count($foreign_key["source"]) == 1) {
320 break;
321 }
116c873 Ignore tables and fields with empty name
jakubvrana authored
322 }
21ea4ae Check errors
jakubvrana authored
323 }
ffcea8b Rights
jakubvrana authored
324 }
35ec64c Link COUNT(*) result to listing
jakubvrana authored
325 if ($key == "COUNT(*)") { //! columns looking like functions
326 $link = h(ME . "select=" . urlencode($TABLE));
327 $i = 0;
16290b0 Respect where in COUNT(*) link
jakubvrana authored
328 foreach ((array) $_GET["where"] as $v) {
329 if (!array_key_exists($v["col"], $unique_array)) {
22eb69b Jakub Vrána Remove operator double encode
authored
330 $link .= h(where_link($i++, $v["col"], $v["val"], $v["op"]));
16290b0 Respect where in COUNT(*) link
jakubvrana authored
331 }
332 }
333 foreach ($unique_array as $k => $v) {
8062648 Jakub Vrána Use IS NULL operator for null value in where_link function
authored
334 $link .= h(where_link($i++, $k, $v));
35ec64c Link COUNT(*) result to listing
jakubvrana authored
335 }
336 }
fa3dd55 Parent
jakubvrana authored
337 }
2cec758 Jakub Vrána Direct links from HTTPS to HTTP
authored
338 if (!$link) {
1cf374b Jakub Vrána Rename functions (avoid conflict with WordPress)
authored
339 if (is_mail($val)) {
2cec758 Jakub Vrána Direct links from HTTPS to HTTP
authored
340 $link = "mailto:$val";
341 }
342 if ($protocol = is_url($row[$key])) {
343 $link = ($protocol == "http" && $HTTPS
344 ? $row[$key] // HTTP links from HTTPS pages don't receive Referer automatically
345 : "$protocol://www.adminer.org/redirect/?url=" . urlencode($row[$key]) // intermediate page to hide Referer, may be changed to rel="noreferrer" in HTML5
346 );
347 }
bc78866 Link URLs in select
jakubvrana authored
348 }
e0d9b3c In-place editation in select
jakubvrana authored
349 $id = h("val[$unique_idf][" . bracket_escape($key) . "]");
de24145 Jakub Vrána Clear POST with AJAX redirect
authored
350 $value = $_POST["val"][$unique_idf][bracket_escape($key)];
e0d9b3c In-place editation in select
jakubvrana authored
351 $h_value = h(isset($value) ? $value : $row[$key]);
687b3fd Jakub Vrána Replace <strong> by <b> and <em> by <i>
authored
352 $long = strpos($val, "<i>...</i>");
390e38b Jakub Vrána Load long texts for inline-edit by AJAX
authored
353 $editable = is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key];
375a5c8 Jakub Vrána Non-MySQL binary types
authored
354 $text = ereg('text|lob', $field["type"]);
e0d9b3c In-place editation in select
jakubvrana authored
355 echo (($_GET["modify"] && $editable) || isset($value)
7d152fb Jakub Vrána Utilize bodyKeydown function
authored
356 ? "<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]'>")
390e38b Jakub Vrána Load long texts for inline-edit by AJAX
authored
357 : "<td id='$id' ondblclick=\"" . ($editable ? "selectDblClick(this, event" . ($long ? ", 2" : ($text ? ", 1" : "")) . ")" : "alert('" . h(lang('Use edit link to modify this value.')) . "')") . ";\">" . $adminer->selectVal($val, $link, $field)
e0d9b3c In-place editation in select
jakubvrana authored
358 );
667bfec Decomposition
jakubvrana authored
359 }
360 }
33aec2c Jakub Vrána Move <td> from Adminer::backwardKeysPrint
authored
361 if ($backward_keys) {
362 echo "<td>";
363 }
09e93de Move backward keys to Editor
jakubvrana authored
364 $adminer->backwardKeysPrint($backward_keys, $rows[$n]);
26e8ab9 Close </tr> because of white-space: pre
jakubvrana authored
365 echo "</tr>\n"; // close to allow white-space: pre
5ab708a Compact pages
jakubvrana authored
366 }
21ea4ae Check errors
jakubvrana authored
367 echo "</table>\n";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
368 }
369
370 parse_str($_COOKIE["adminer_export"], $adminer_export);
371
bd25295 Don't redirect from last page
jakubvrana authored
372 if ($rows || $page) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
373 $exact_count = true;
04eccba Jakub Vrána Allow bigger numbers under 32 bits
authored
374 if ($_GET["page"] != "last" && +$limit && count($group) >= count($select) && ($found_rows >= $limit || $page)) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
375 $found_rows = $table_status["Rows"];
15ab4d2 Jakub Vrána Find exact count on big page only with InnoDB
authored
376 if (!isset($found_rows) || $where || ($table_status["Engine"] == "InnoDB" && $found_rows < max(1e4, 2 * ($page + 1) * $limit))) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
377 // slow with big tables
15ab4d2 Jakub Vrána Find exact count on big page only with InnoDB
authored
378 ob_flush(); //! doesn't work with AJAX
3f5b683 Reintegrate sqlite branch
jakubvrana authored
379 flush();
60c7ed9 Jakub Vrána MS SQL schema support
authored
380 $found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
3f5b683 Reintegrate sqlite branch
jakubvrana authored
381 } else {
382 $exact_count = false;
383 }
4cdc459 FOUND_ROWS works with last SELECT
jakubvrana authored
384 }
fde1171 Add CSS classes (thanks to cvicebni ubor)
jakubvrana authored
385 echo "<p class='pages'>";
04eccba Jakub Vrána Allow bigger numbers under 32 bits
authored
386 if (+$limit && $found_rows > $limit) {
bd25295 Don't redirect from last page
jakubvrana authored
387 // display first, previous 4, next 4 and last page
21ea4ae Check errors
jakubvrana authored
388 $max_page = floor(($found_rows - 1) / $limit);
9802869 Jakub Vrána Merge from master
authored
389 echo '<a href="' . h(remove_from_uri("page")) . "\" onclick=\"pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "'), event); return false;\">" . lang('Page') . "</a>:";
6e3c7cb Jakub Vrána Use AJAX for pagination
authored
390 echo pagination(0, $page) . ($page > 5 ? " ..." : "");
bd25295 Don't redirect from last page
jakubvrana authored
391 for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
392 echo pagination($i, $page);
21ea4ae Check errors
jakubvrana authored
393 }
6585b23 Jakub Vrána Generic AJAX links
authored
394 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
395 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
396 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
397
e641e5c Jakub Vrána Limit commands and import in customization (bug #3194432)
authored
398 if ($adminer->selectCommandPrint()) {
e0d9b3c In-place editation in select
jakubvrana authored
399 ?>
400 <fieldset><legend><?php echo lang('Edit'); ?></legend><div>
b68ddca Jakub Vrána Send all forms by Ctrl+Enter on <select>
authored
401 <input type="submit" value="<?php echo lang('Save'); ?>" title="<?php echo lang('Double click on a value to modify it.'); ?>" class="jsonly">
38894b2 Jakub Vrána Send all forms by AJAX
authored
402 <input type="submit" name="edit" value="<?php echo lang('Edit'); ?>">
403 <input type="submit" name="clone" value="<?php echo lang('Clone'); ?>">
404 <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/)) + ')');">
e0d9b3c In-place editation in select
jakubvrana authored
405 </div></fieldset>
406 <?php
407 }
dc667ea Hide select export and import
jakubvrana authored
408 print_fieldset("export", lang('Export'));
be3410f Jakub Vrána Simplify dumpOutput, dumpFormat and dumpData methods
authored
409 $output = $adminer->dumpOutput();
9e8ab1d Jakub Vrána Whitespace
authored
410 echo ($output ? html_select("output", $output, $adminer_export["output"]) . " " : "");
411 echo html_select("format", $adminer->dumpFormat(), $adminer_export["format"]);
fc6e71a Jakub Vrána Disable AJAX export
authored
412 echo " <input type='submit' name='export' value='" . lang('Export') . "' onclick='eventStop(event);'>\n";
dc667ea Hide select export and import
jakubvrana authored
413 echo "</div></fieldset>\n";
667bfec Decomposition
jakubvrana authored
414 }
e641e5c Jakub Vrána Limit commands and import in customization (bug #3194432)
authored
415 if ($adminer->selectImportPrint()) {
416 print_fieldset("import", lang('Import'), !$rows);
417 echo "<input type='file' name='csv_file'> ";
418 echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_export["format"], 1); // 1 - select
419 echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
420 echo "<input type='hidden' name='token' value='$token'>\n";
421 echo "</div></fieldset>\n";
422 }
c16c57b E-mail sending
jakubvrana authored
423
1e55d47 User interface for e-mail {$name}
jakubvrana authored
424 $adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);
c16c57b E-mail sending
jakubvrana authored
425
e7eb28d CSV import
jakubvrana authored
426 echo "</form>\n";
667bfec Decomposition
jakubvrana authored
427 }
428 }
Something went wrong with that request. Please try again.