Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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