Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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