Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 542 lines (504 sloc) 16.637 kb
667bfec Decomposition
jakubvrana authored
1 <?php
9a176b0 Comments
jakubvrana authored
2 /** Get database connection
3 * @return Min_DB
4 */
64d616c Rename get_dbh to connection
jakubvrana authored
5 function connection() {
6 // can be used in customization, $connection is minified
7 global $connection;
8 return $connection;
c64c4fd Adminer class
jakubvrana authored
9 }
10
9a176b0 Comments
jakubvrana authored
11 /** Escape database identifier
12 * @param string
13 * @return string
14 */
667bfec Decomposition
jakubvrana authored
15 function idf_escape($idf) {
16 return "`" . str_replace("`", "``", $idf) . "`";
17 }
18
9a176b0 Comments
jakubvrana authored
19 /** Unescape database identifier
20 * @param string text inside ``
21 * @return string
22 */
667bfec Decomposition
jakubvrana authored
23 function idf_unescape($idf) {
24 return str_replace("``", "`", $idf);
25 }
26
5e01a62 Prepare for SQLite
jakubvrana authored
27 /** Escape string to use inside ''
28 * @param string
29 * @return string
30 */
31 function escape_string($val) {
32 global $connection;
33 return substr($connection->quote($val), 1, -1);
34 }
35
9a176b0 Comments
jakubvrana authored
36 /** Escape or unescape string to use inside form []
37 * @param string
38 * @param bool
39 * @return string
40 */
667bfec Decomposition
jakubvrana authored
41 function bracket_escape($idf, $back = false) {
64ba924 Comments
jakubvrana authored
42 // escape brackets inside name="x[]"
73e8631 Move stuff to functions.inc.php
jakubvrana authored
43 static $trans = array(':' => ':1', ']' => ':2', '[' => ':3');
667bfec Decomposition
jakubvrana authored
44 return strtr($idf, ($back ? array_flip($trans) : $trans));
45 }
46
9a176b0 Comments
jakubvrana authored
47 /** Escape for HTML
48 * @param string
49 * @return string
50 */
689699a Shortcut for htmlspecialchars
jakubvrana authored
51 function h($string) {
52 return htmlspecialchars($string, ENT_QUOTES);
53 }
54
9a176b0 Comments
jakubvrana authored
55 /** Escape for TD
56 * @param string
57 * @return string
58 */
c196985 Function nbsp
jakubvrana authored
59 function nbsp($string) {
60 return (strlen(trim($string)) ? h($string) : "&nbsp;");
61 }
62
6b30cfa Separate checkbox
jakubvrana authored
63 /** Generate HTML checkbox
64 * @param string
65 * @param string
66 * @param bool
67 * @param string
68 * @param string
69 * @return string
70 */
71 function checkbox($name, $value, $checked, $label = "", $onclick = "") {
c4fe12a Clickable labels in IE6
jakubvrana authored
72 static $id = 0;
73 $id++;
74 $return = "<input type='checkbox' name='$name' value='" . h($value) . "'" . ($checked ? " checked" : "") . ($onclick ? " onclick=\"$onclick\"" : "") . " id='checkbox-$id'>";
75 return (strlen($label) ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return);
6b30cfa Separate checkbox
jakubvrana authored
76 }
77
e40612a Use radio in export
jakubvrana authored
78 /** Generate HTML radio list
79 * @param string
80 * @param array
81 * @param string
0698409 Utilize html_select
jakubvrana authored
82 * @param string true for no onchange, false for radio
e40612a Use radio in export
jakubvrana authored
83 * @return string
84 */
0698409 Utilize html_select
jakubvrana authored
85 function html_select($name, $options, $value = "", $onchange = true) {
86 if ($onchange) {
87 return "<select name='" . h($name) . "'" . (is_string($onchange) ? " onchange=\"$onchange\"" : "") . ">" . optionlist($options, $value) . "</select>";
e40612a Use radio in export
jakubvrana authored
88 }
89 $return = "";
90 foreach ($options as $key => $val) {
91 $return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>";
92 }
93 return $return;
94 }
95
9a176b0 Comments
jakubvrana authored
96 /** Generate list of HTML options
97 * @param array array of strings or arrays (creates optgroup)
98 * @param mixed
99 * @param bool always use array keys for value="", otherwise only string keys are used
100 * @return string
101 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
102 function optionlist($options, $selected = null, $use_keys = false) {
667bfec Decomposition
jakubvrana authored
103 $return = "";
104 foreach ($options as $k => $v) {
105 if (is_array($v)) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
106 $return .= '<optgroup label="' . h($k) . '">';
667bfec Decomposition
jakubvrana authored
107 }
ced9de9 Create single column foreign key in table structure
jakubvrana authored
108 foreach ((is_array($v) ? $v : array($k => $v)) as $key => $val) {
cb6d36c HTML instead of XHTML
jakubvrana authored
109 $return .= '<option' . ($use_keys || is_string($key) ? ' value="' . h($key) . '"' : '') . (($use_keys || is_string($key) ? (string) $key : $val) === $selected ? ' selected' : '') . '>' . h($val);
667bfec Decomposition
jakubvrana authored
110 }
111 if (is_array($v)) {
112 $return .= '</optgroup>';
113 }
114 }
115 return $return;
116 }
117
9a176b0 Comments
jakubvrana authored
118 /** Get list of values from database
119 * @param string
120 * @param mixed
121 * @return array
122 */
0bd864e Allow specifying column in get_vals
jakubvrana authored
123 function get_vals($query, $column = 0) {
64d616c Rename get_dbh to connection
jakubvrana authored
124 global $connection;
7769f2c Separate get_vals
jakubvrana authored
125 $return = array();
64d616c Rename get_dbh to connection
jakubvrana authored
126 $result = $connection->query($query);
49f7886 SHOW DATABASES can be revoked
jakubvrana authored
127 if ($result) {
128 while ($row = $result->fetch_row()) {
0bd864e Allow specifying column in get_vals
jakubvrana authored
129 $return[] = $row[$column];
49f7886 SHOW DATABASES can be revoked
jakubvrana authored
130 }
7769f2c Separate get_vals
jakubvrana authored
131 }
132 return $return;
133 }
134
9a176b0 Comments
jakubvrana authored
135 /** Find unique identifier of a row
136 * @param array
137 * @param array result of indexes()
138 * @return string query string
139 */
667bfec Decomposition
jakubvrana authored
140 function unique_idf($row, $indexes) {
720f5fc Restructure indexes
jakubvrana authored
141 foreach ($indexes as $index) {
4b3d569 Save bytes
jakubvrana authored
142 if (ereg("PRIMARY|UNIQUE", $index["type"])) {
720f5fc Restructure indexes
jakubvrana authored
143 $return = array();
144 foreach ($index["columns"] as $key) {
64ba924 Comments
jakubvrana authored
145 if (!isset($row[$key])) { // NULL is ambiguous
720f5fc Restructure indexes
jakubvrana authored
146 continue 2;
667bfec Decomposition
jakubvrana authored
147 }
430034c Cottage homework
jakubvrana authored
148 $return[] = urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($row[$key]);
667bfec Decomposition
jakubvrana authored
149 }
720f5fc Restructure indexes
jakubvrana authored
150 return $return;
667bfec Decomposition
jakubvrana authored
151 }
152 }
153 $return = array();
154 foreach ($row as $key => $val) {
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
155 if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions
988a29f Don't use aggregation functions in unique_idf
jakubvrana authored
156 $return[] = (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
157 }
430034c Cottage homework
jakubvrana authored
158 }
159 return $return;
160 }
161
9a176b0 Comments
jakubvrana authored
162 /** Create SQL condition from parsed query string
163 * @param array parsed query string
164 * @return string
165 */
9ea3112 Mandatory $where in where()
jakubvrana authored
166 function where($where) {
430034c Cottage homework
jakubvrana authored
167 $return = array();
116faf2 Mass delete
jakubvrana authored
168 foreach ((array) $where["where"] as $key => $val) {
581bd35 Respect function results in where()
jakubvrana authored
169 $key = bracket_escape($key, "back");
ffc103d Compare floats as strings (bug #2886518)
jakubvrana authored
170 $return[] = (preg_match('~^[A-Z0-9_]+\\(`(?:[^`]|``)+`\\)$~', $key) ? $key : idf_escape($key)) . " LIKE " . exact_value(addcslashes($val, "%_")); // LIKE because of floats //! enum and set, columns looking like functions
430034c Cottage homework
jakubvrana authored
171 }
116faf2 Mass delete
jakubvrana authored
172 foreach ((array) $where["null"] as $key) {
581bd35 Respect function results in where()
jakubvrana authored
173 $key = bracket_escape($key, "back");
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
174 $return[] = (preg_match('~^[A-Z0-9_]+\\(`(?:[^`]|``)+`\\)$~', $key) ? $key : idf_escape($key)) . " IS NULL";
667bfec Decomposition
jakubvrana authored
175 }
c16c57b E-mail sending
jakubvrana authored
176 return implode(" AND ", $return);
667bfec Decomposition
jakubvrana authored
177 }
178
9a176b0 Comments
jakubvrana authored
179 /** Create SQL condition from query string
180 * @param string
181 * @return string
182 */
0cd2afb Remove single item clone
jakubvrana authored
183 function where_check($val) {
184 parse_str($val, $check);
185 return where($check);
186 }
187
9a176b0 Comments
jakubvrana authored
188 /** Create query string where condition from value
189 * @param int condition order
190 * @param string column identifier
191 * @param string
192 * @return string
193 */
c42c46a Table relations
jakubvrana authored
194 function where_link($i, $column, $value) {
db46fc2 Maintain insert prefill value
jakubvrana authored
195 return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=%3D&where%5B$i%5D%5Bval%5D=" . urlencode($value);
c42c46a Table relations
jakubvrana authored
196 }
197
319cba4 Save e-mail from to cookie
jakubvrana authored
198 /** Set cookie valid for 1 month
199 * @param string
200 * @param string
201 * @return bool
202 */
203 function cookie($name, $value) {
3675fe6 Simplify cookie expiration
jakubvrana authored
204 return setcookie($name, $value, time() + 2592000, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"])); // 2592000 = 30 * 24 * 60 * 60
319cba4 Save e-mail from to cookie
jakubvrana authored
205 }
206
f9a2023 Improve concurrency
jakubvrana authored
207 /** Restart stopped session
208 * @return null
209 */
210 function restart_session() {
211 if (!ini_get("session.use_cookies")) {
212 session_start();
213 }
214 }
215
9a176b0 Comments
jakubvrana authored
216 /** Send Location header and exit
217 * @param string
218 * @param string
219 * @return null
220 */
430034c Cottage homework
jakubvrana authored
221 function redirect($location, $message = null) {
222 if (isset($message)) {
be49e08 Improve session restarting
jakubvrana authored
223 restart_session();
ff74bf0 Allow multiple messages
jakubvrana authored
224 $_SESSION["messages"][] = $message;
430034c Cottage homework
jakubvrana authored
225 }
226 header("Location: " . (strlen($location) ? $location : "."));
227 exit;
228 }
229
9a176b0 Comments
jakubvrana authored
230 /** Execute query and redirect if successful
231 * @param string
232 * @param string
233 * @param string
234 * @param bool
235 * @param bool
236 * @param bool
237 * @return bool
238 */
748ee83 Print SQL command with multiple queries
jakubvrana authored
239 function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false) {
64d616c Rename get_dbh to connection
jakubvrana authored
240 global $connection, $error, $adminer;
f9a2023 Improve concurrency
jakubvrana authored
241 if ($execute) {
242 $failed = !$connection->query($query);
243 }
10bdbed Save queries to history
jakubvrana authored
244 $sql = "";
245 if ($query) {
c64c4fd Adminer class
jakubvrana authored
246 $sql = $adminer->messageQuery($query);
10bdbed Save queries to history
jakubvrana authored
247 }
748ee83 Print SQL command with multiple queries
jakubvrana authored
248 if ($failed) {
64d616c Rename get_dbh to connection
jakubvrana authored
249 $error = h($connection->error) . $sql;
c48a017 Print SQL query by error
jakubvrana authored
250 return false;
f91b2c4 Print SQL query by message
jakubvrana authored
251 }
c48a017 Print SQL query by error
jakubvrana authored
252 if ($redirect) {
253 redirect($location, $message . $sql);
254 }
255 return true;
f91b2c4 Print SQL query by message
jakubvrana authored
256 }
257
9a176b0 Comments
jakubvrana authored
258 /** Execute and remember query
259 * @param string null to return remembered queries
260 * @return Min_Result
261 */
748ee83 Print SQL command with multiple queries
jakubvrana authored
262 function queries($query = null) {
64d616c Rename get_dbh to connection
jakubvrana authored
263 global $connection;
748ee83 Print SQL command with multiple queries
jakubvrana authored
264 static $queries = array();
265 if (!isset($query)) {
64ba924 Comments
jakubvrana authored
266 // return executed queries without parameter
36950eb Tables and views
jakubvrana authored
267 return implode(";\n", $queries);
748ee83 Print SQL command with multiple queries
jakubvrana authored
268 }
269 $queries[] = $query;
64d616c Rename get_dbh to connection
jakubvrana authored
270 return $connection->query($query);
748ee83 Print SQL command with multiple queries
jakubvrana authored
271 }
272
dbdd40a Introduce queries_redirect function
jakubvrana authored
273 /** Redirect by remembered queries
274 * @param string
275 * @param string
276 * @param bool
277 */
278 function queries_redirect($location, $message, $redirect) {
279 return query_redirect(queries(), $location, $message, $redirect, false, !$redirect);
280 }
281
9a176b0 Comments
jakubvrana authored
282 /** Remove parameter from query string
283 * @param string
284 * @return string
285 */
d41d446 remove_from_uri()
jakubvrana authored
286 function remove_from_uri($param = "") {
6272cae Unconditionally remove session_name() in remove_from_uri()
jakubvrana authored
287 $param = "($param|" . session_name() . ")";
5f83619 Session management
jakubvrana authored
288 return substr(preg_replace("~([?&])$param=[^&]*&~", '\\1', "$_SERVER[REQUEST_URI]&"), 0, -1);
d41d446 remove_from_uri()
jakubvrana authored
289 }
290
9a176b0 Comments
jakubvrana authored
291 /** Generate page number for pagination
292 * @param int
293 * @return string
294 */
c565c54 Let pagination function return
jakubvrana authored
295 function pagination($page) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
296 return " " . ($page == $_GET["page"] ? $page + 1 : '<a href="' . h(remove_from_uri("page") . ($page ? "&page=$page" : "")) . '">' . ($page + 1) . "</a>");
1456283 Pages on last page
jakubvrana authored
297 }
298
9a176b0 Comments
jakubvrana authored
299 /** Get file contents from $_FILES or $_POST["files"]
300 * @param string
301 * @param bool
302 * @return string
303 */
25f01d3 Compress export and import
jakubvrana authored
304 function get_file($key, $decompress = false) {
64ba924 Comments
jakubvrana authored
305 // returns int for error, string otherwise
25f01d3 Compress export and import
jakubvrana authored
306 $file = $_POST["files"][$key];
307 if (isset($file)) {
64ba924 Comments
jakubvrana authored
308 // get the file from hidden field if the user was logged out
25f01d3 Compress export and import
jakubvrana authored
309 $length = strlen($file);
310 if ($length && $length < 4) {
311 return intval($file);
312 }
313 return base64_decode($file);
314 }
315 $file = $_FILES[$key];
316 if (!$file || $file["error"]) {
317 return $file["error"];
430034c Cottage homework
jakubvrana authored
318 }
0a2d81d Bzip2 import
jakubvrana authored
319 return file_get_contents($decompress && ereg('\\.gz$', $file["name"]) ? "compress.zlib://$file[tmp_name]"
320 : ($decompress && ereg('\\.bz2$', $file["name"]) ? "compress.bzip2://$file[tmp_name]"
321 : $file["tmp_name"]
322 )); //! may not be reachable because of open_basedir
430034c Cottage homework
jakubvrana authored
323 }
324
9a176b0 Comments
jakubvrana authored
325 /** Determine upload error
326 * @param int
327 * @return string
328 */
e2a03c0 Show upload_max_filesize
jakubvrana authored
329 function upload_error($error) {
330 $max_size = ($error == UPLOAD_ERR_INI_SIZE ? ini_get("upload_max_filesize") : null); // post_max_size is checked in index.php
b2a7c7a Execute SQL file stored on server disk
jakubvrana authored
331 return ($error ? lang('Unable to upload a file.') . ($max_size ? " " . lang('Maximum allowed file size is %sB.', $max_size) : "") : lang('File does not exist.'));
e2a03c0 Show upload_max_filesize
jakubvrana authored
332 }
333
9a176b0 Comments
jakubvrana authored
334 /** Generate class for odd rows
335 * @param string return this for odd rows, empty to reset counter
336 * @return string
337 */
338 function odd($return = ' class="odd"') {
4e5b126 Highlight odd and hover rows
jakubvrana authored
339 static $i = 0;
9a176b0 Comments
jakubvrana authored
340 if (!$return) { // reset counter
1b97f48 Reset odd() for each result
jakubvrana authored
341 $i = -1;
4e5b126 Highlight odd and hover rows
jakubvrana authored
342 }
9a176b0 Comments
jakubvrana authored
343 return ($i++ % 2 ? $return : '');
4e5b126 Highlight odd and hover rows
jakubvrana authored
344 }
345
9a176b0 Comments
jakubvrana authored
346 /** Check whether the string is in UTF-8
347 * @param string
348 * @return bool
349 */
017ffb5 Better UTF-8 detection
jakubvrana authored
350 function is_utf8($val) {
64ba924 Comments
jakubvrana authored
351 // don't print control chars except \t\r\n
017ffb5 Better UTF-8 detection
jakubvrana authored
352 return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val));
353 }
354
9a176b0 Comments
jakubvrana authored
355 /** Shorten UTF-8 string
356 * @param string
357 * @param int
358 * @param string
359 * @return string escaped string with appended ...
360 */
cd07584 Save SQL query to history
jakubvrana authored
361 function shorten_utf8($string, $length = 80, $suffix = "") {
11982f1 Shorten printed SQL query
jakubvrana authored
362 if (!preg_match("(^([\t\r\n -\x{FFFF}]{0,$length})($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
363 preg_match("(^([\t\r\n -~]{0,$length})($)?)", $string, $match);
95764b0 Shorten binary strings
jakubvrana authored
364 }
11982f1 Shorten printed SQL query
jakubvrana authored
365 return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<em>...</em>");
02a851c Shorten texts in PHP
jakubvrana authored
366 }
3920ebb Remove InnoDB table comment in Tables and views
jakubvrana authored
367
9a176b0 Comments
jakubvrana authored
368 /** Generate friendly URL
369 * @param string
370 * @return string
371 */
8251896 Downloaded file name
jakubvrana authored
372 function friendly_url($val) {
64ba924 Comments
jakubvrana authored
373 // used for blobs and export
8251896 Downloaded file name
jakubvrana authored
374 return preg_replace('~[^a-z0-9_]~i', '-', $val);
375 }
376
9a176b0 Comments
jakubvrana authored
377 /** Print hidden fields
378 * @param array
379 * @param array
380 * @return null
381 */
820c882 Bulk clone
jakubvrana authored
382 function hidden_fields($process, $ignore = array()) {
5d7071a Choose language through option-list
jakubvrana authored
383 while (list($key, $val) = each($process)) {
384 if (is_array($val)) {
385 foreach ($val as $k => $v) {
386 $process[$key . "[$k]"] = $v;
387 }
388 } elseif (!in_array($key, $ignore)) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
389 echo '<input type="hidden" name="' . h($key) . '" value="' . h($val) . '">';
5d7071a Choose language through option-list
jakubvrana authored
390 }
391 }
392 }
61640ee Move common functions
jakubvrana authored
393
9a176b0 Comments
jakubvrana authored
394 /** Find out foreign keys for each column
395 * @param string
396 * @return array array($col => array())
397 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
398 function column_foreign_keys($table) {
399 $return = array();
400 foreach (foreign_keys($table) as $foreign_key) {
401 foreach ($foreign_key["source"] as $val) {
402 $return[$val][] = $foreign_key;
403 }
404 }
405 return $return;
406 }
407
9a176b0 Comments
jakubvrana authored
408 /** Print edit input field
409 * @param array one field from fields()
410 * @param mixed
411 * @param string
412 * @return null
413 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
414 function input($field, $value, $function) {
c64c4fd Adminer class
jakubvrana authored
415 global $types, $adminer;
689699a Shortcut for htmlspecialchars
jakubvrana authored
416 $name = h(bracket_escape($field["field"]));
61640ee Move common functions
jakubvrana authored
417 echo "<td class='function'>";
6758477 Hide NULL in Editor enum
jakubvrana authored
418 $functions = (isset($_GET["select"]) ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field);
61640ee Move common functions
jakubvrana authored
419 if ($field["type"] == "enum") {
6758477 Hide NULL in Editor enum
jakubvrana authored
420 echo "&nbsp;<td>" . ($functions["orig"] ? "<label><input type='radio' name='fields[$name]' value='-1' checked><em>$functions[orig]</em></label> " : "");
421 if (in_array("NULL", $functions)) {
422 echo "<label><input type='radio' name='fields[$name]' value=''" . (isset($value) || $functions["orig"] ? '' : ' checked') . "><em>NULL</em></label> ";
61640ee Move common functions
jakubvrana authored
423 }
4cead56 Edit default values directly in table creation
jakubvrana authored
424 echo "<input type='radio' name='fields[$name]' value='0'" . ($value === 0 ? ' checked' : '') . '>';
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
425 preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
61640ee Move common functions
jakubvrana authored
426 foreach ($matches[1] as $i => $val) {
427 $val = stripcslashes(str_replace("''", "'", $val));
428 $checked = (is_int($value) ? $value == $i+1 : $value === $val);
4cead56 Edit default values directly in table creation
jakubvrana authored
429 echo " <label><input type='radio' name='fields[$name]' value='" . ($i+1) . "'" . ($checked ? ' checked' : '') . '>' . h($val) . '</label>';
61640ee Move common functions
jakubvrana authored
430 }
431 } else {
9903946 Use original values in Editor multi edit
jakubvrana authored
432 $first = 0;
433 foreach ($functions as $key => $val) {
434 if ($key === "" || !$val) {
435 break;
436 }
437 $first++;
438 }
689699a Shortcut for htmlspecialchars
jakubvrana authored
439 $onchange = ($first ? " onchange=\"var f = this.form['function[" . addcslashes($name, "\r\n'\\") . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : "");
a561252 Use distinct name for blob inputs
jakubvrana authored
440 $attrs = " name='fields[$name]'$onchange";
0698409 Utilize html_select
jakubvrana authored
441 echo (count($functions) > 1 ? html_select("function[$name]", $functions, !isset($function) || in_array($function, $functions) ? $function : "") : nbsp(reset($functions))) . '<td>';
a561252 Use distinct name for blob inputs
jakubvrana authored
442 $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
e1abcda Treat tinyint(1) as boolean
jakubvrana authored
443 if (strlen($input)) {
444 echo $input;
1e4d11e Select from foreign keys in Editor
jakubvrana authored
445 } elseif ($field["type"] == "set") { //! 64 bits
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
446 preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
61640ee Move common functions
jakubvrana authored
447 foreach ($matches[1] as $i => $val) {
448 $val = stripcslashes(str_replace("''", "'", $val));
449 $checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true));
4cead56 Edit default values directly in table creation
jakubvrana authored
450 echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($val) . '</label>';
61640ee Move common functions
jakubvrana authored
451 }
2204cef Use textarea for blob with disabled file uploads
jakubvrana authored
452 } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) {
a561252 Use distinct name for blob inputs
jakubvrana authored
453 echo "<input type='file' name='fields-$name'$onchange>";
2204cef Use textarea for blob with disabled file uploads
jakubvrana authored
454 } elseif (ereg('text|blob', $field["type"])) {
a561252 Use distinct name for blob inputs
jakubvrana authored
455 echo "<textarea cols='50' rows='12'$attrs>" . h($value) . '</textarea>';
61640ee Move common functions
jakubvrana authored
456 } else {
457 // int(3) is only a display hint
458 $maxlength = (!ereg('int', $field["type"]) && preg_match('~^([0-9]+)(,([0-9]+))?$~', $field["length"], $match) ? ($match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
a561252 Use distinct name for blob inputs
jakubvrana authored
459 echo "<input value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char', $field["type"]) && $field["length"] > 20 ? " size='40'" : "") . "$attrs>";
61640ee Move common functions
jakubvrana authored
460 }
461 }
462 }
463
9a176b0 Comments
jakubvrana authored
464 /** Process edit input field
465 * @param one field from fields()
466 * @return string
467 */
a0def47 Date localization
jakubvrana authored
468 function process_input($field) {
64d616c Rename get_dbh to connection
jakubvrana authored
469 global $connection, $adminer;
a0def47 Date localization
jakubvrana authored
470 $idf = bracket_escape($field["field"]);
61640ee Move common functions
jakubvrana authored
471 $function = $_POST["function"][$idf];
472 $value = $_POST["fields"][$idf];
473 if ($field["type"] == "enum" ? $value == -1 : $function == "orig") {
474 return false;
475 } elseif ($field["type"] == "enum" || $field["auto_increment"] ? !strlen($value) : $function == "NULL") {
476 return "NULL";
477 } elseif ($field["type"] == "enum") {
4cead56 Edit default values directly in table creation
jakubvrana authored
478 return intval($value);
61640ee Move common functions
jakubvrana authored
479 } elseif ($field["type"] == "set") {
4cead56 Edit default values directly in table creation
jakubvrana authored
480 return array_sum((array) $value);
2204cef Use textarea for blob with disabled file uploads
jakubvrana authored
481 } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) {
a561252 Use distinct name for blob inputs
jakubvrana authored
482 $file = get_file("fields-$idf");
61640ee Move common functions
jakubvrana authored
483 if (!is_string($file)) {
484 return false; //! report errors
485 }
91cb95a Remove unnecessary _binary
jakubvrana authored
486 return $connection->quote($file);
61640ee Move common functions
jakubvrana authored
487 } else {
a0def47 Date localization
jakubvrana authored
488 return $adminer->processInput($field, $value, $function);
61640ee Move common functions
jakubvrana authored
489 }
490 }
491
9a176b0 Comments
jakubvrana authored
492 /** Print CSV row
493 * @param array
494 * @return null
495 */
61640ee Move common functions
jakubvrana authored
496 function dump_csv($row) {
497 foreach ($row as $key => $val) {
498 if (preg_match("~[\"\n,]~", $val) || (isset($val) && !strlen($val))) {
499 $row[$key] = '"' . str_replace('"', '""', $val) . '"';
500 }
501 }
89a60e7 Use output buffering for dump compression
jakubvrana authored
502 echo implode(",", $row) . "\n";
61640ee Move common functions
jakubvrana authored
503 }
c16c57b E-mail sending
jakubvrana authored
504
9a176b0 Comments
jakubvrana authored
505 /** Apply SQL function
506 * @param string
507 * @param string escaped column identifier
508 * @return string
509 */
e331067 Move apply_sql_function
jakubvrana authored
510 function apply_sql_function($function, $column) {
511 return ($function ? ($function == "count distinct" ? "COUNT(DISTINCT " : strtoupper("$function(")) . "$column)" : $column);
512 }
513
9a176b0 Comments
jakubvrana authored
514 /** Check whether the string is e-mail address
515 * @param string
516 * @return bool
517 */
c16c57b E-mail sending
jakubvrana authored
518 function is_email($email) {
519 $atom = '[-a-z0-9!#$%&\'*+/=?^_`{|}~]'; // characters of local-name
520 $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
fb141cc Speedup
jakubvrana authored
521 return preg_match("(^$atom+(\\.$atom+)*@($domain?\\.)+$domain\$)i", $email);
c16c57b E-mail sending
jakubvrana authored
522 }
dc667ea Hide select export and import
jakubvrana authored
523
bc78866 Link URLs in select
jakubvrana authored
524 /** Check whether the string is URL address
525 * @param string
526 * @return bool
527 */
528 function is_url($string) {
529 $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
530 return preg_match("~^https?://($domain?\\.)+$domain(:[0-9]+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string); //! restrict path, query and fragment characters
531 }
532
dc667ea Hide select export and import
jakubvrana authored
533 /** Print header for hidden fieldset (close by </div></fieldset>)
534 * @param string
535 * @param string
536 * @param bool
537 * @return null
538 */
539 function print_fieldset($id, $legend, $visible = false) {
540 echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
541 }
Something went wrong with that request. Please try again.