Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 564 lines (524 sloc) 17.294 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) {
7352c28 Replace strlen() by != ""
jakubvrana authored
60 return (trim($string) != "" ? h($string) : "&nbsp;");
c196985 Function nbsp
jakubvrana authored
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'>";
7352c28 Replace strlen() by != ""
jakubvrana authored
75 return ($label != "" ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return);
6b30cfa Separate checkbox
jakubvrana authored
76 }
77
9a176b0 Comments
jakubvrana authored
78 /** Generate list of HTML options
79 * @param array array of strings or arrays (creates optgroup)
80 * @param mixed
81 * @param bool always use array keys for value="", otherwise only string keys are used
82 * @return string
83 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
84 function optionlist($options, $selected = null, $use_keys = false) {
667bfec Decomposition
jakubvrana authored
85 $return = "";
86 foreach ($options as $k => $v) {
87 if (is_array($v)) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
88 $return .= '<optgroup label="' . h($k) . '">';
667bfec Decomposition
jakubvrana authored
89 }
ced9de9 Create single column foreign key in table structure
jakubvrana authored
90 foreach ((is_array($v) ? $v : array($k => $v)) as $key => $val) {
cb6d36c HTML instead of XHTML
jakubvrana authored
91 $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
92 }
93 if (is_array($v)) {
94 $return .= '</optgroup>';
95 }
96 }
97 return $return;
98 }
99
098b74b Move function
jakubvrana authored
100 /** Generate HTML radio list
101 * @param string
102 * @param array
103 * @param string
104 * @param string true for no onchange, false for radio
105 * @return string
106 */
107 function html_select($name, $options, $value = "", $onchange = true) {
108 if ($onchange) {
109 return "<select name='" . h($name) . "'" . (is_string($onchange) ? " onchange=\"$onchange\"" : "") . ">" . optionlist($options, $value) . "</select>";
110 }
111 $return = "";
112 foreach ($options as $key => $val) {
113 $return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>";
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()
35ec64c Link COUNT(*) result to listing
jakubvrana authored
138 * @return array
9a176b0 Comments
jakubvrana authored
139 */
35ec64c Link COUNT(*) result to listing
jakubvrana authored
140 function unique_array($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 }
35ec64c Link COUNT(*) result to listing
jakubvrana authored
148 $return[$key] = $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
35ec64c Link COUNT(*) result to listing
jakubvrana authored
156 $return[$key] = $val;
988a29f Don't use aggregation functions in unique_idf
jakubvrana authored
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();
16290b0 Respect where in COUNT(*) link
jakubvrana authored
168 foreach (array("where", "null") as $type) {
169 foreach ((array) $where[$type] as $key => $val) {
170 $key = bracket_escape($key, "back");
171 $return[] = (preg_match('~^[A-Z0-9_]+\\(`(?:[^`]|``)+`\\)$~', $key) ? $key : idf_escape($key)) . ($type == "null" ? " IS NULL" : (ereg('\\.', $val) ? " LIKE " . exact_value(addcslashes($val, "%_")) : " = " . exact_value($val))); // LIKE because of floats, but slow with ints //! enum and set, columns looking like functions
172 }
667bfec Decomposition
jakubvrana authored
173 }
c16c57b E-mail sending
jakubvrana authored
174 return implode(" AND ", $return);
667bfec Decomposition
jakubvrana authored
175 }
176
9a176b0 Comments
jakubvrana authored
177 /** Create SQL condition from query string
178 * @param string
179 * @return string
180 */
0cd2afb Remove single item clone
jakubvrana authored
181 function where_check($val) {
182 parse_str($val, $check);
183 return where($check);
184 }
185
9a176b0 Comments
jakubvrana authored
186 /** Create query string where condition from value
187 * @param int condition order
188 * @param string column identifier
189 * @param string
190 * @return string
186c058 Utilize where_link function
jakubvrana authored
191 * @return string
9a176b0 Comments
jakubvrana authored
192 */
186c058 Utilize where_link function
jakubvrana authored
193 function where_link($i, $column, $value, $operator = "=") {
194 return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=" . urlencode($operator) . "&where%5B$i%5D%5Bval%5D=" . urlencode($value);
c42c46a Table relations
jakubvrana authored
195 }
196
319cba4 Save e-mail from to cookie
jakubvrana authored
197 /** Set cookie valid for 1 month
198 * @param string
199 * @param string
200 * @return bool
201 */
202 function cookie($name, $value) {
9319b57 Case-insensitive $_SERVER["HTTPS"] compare
jakubvrana authored
203 $params = array($name, $value, time() + 2592000, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")); // 2592000 = 30 * 24 * 60 * 60
c2334db Secure cookies
jakubvrana authored
204 if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
205 $params[] = true; // HttpOnly
206 }
207 return call_user_func_array('setcookie', $params);
319cba4 Save e-mail from to cookie
jakubvrana authored
208 }
209
f9a2023 Improve concurrency
jakubvrana authored
210 /** Restart stopped session
211 * @return null
212 */
213 function restart_session() {
214 if (!ini_get("session.use_cookies")) {
215 session_start();
216 }
217 }
218
9a176b0 Comments
jakubvrana authored
219 /** Send Location header and exit
220 * @param string
221 * @param string
222 * @return null
223 */
430034c Cottage homework
jakubvrana authored
224 function redirect($location, $message = null) {
225 if (isset($message)) {
be49e08 Improve session restarting
jakubvrana authored
226 restart_session();
ff74bf0 Allow multiple messages
jakubvrana authored
227 $_SESSION["messages"][] = $message;
430034c Cottage homework
jakubvrana authored
228 }
7352c28 Replace strlen() by != ""
jakubvrana authored
229 header("Location: " . ($location != "" ? $location : "."));
430034c Cottage homework
jakubvrana authored
230 exit;
231 }
232
9a176b0 Comments
jakubvrana authored
233 /** Execute query and redirect if successful
234 * @param string
235 * @param string
236 * @param string
237 * @param bool
238 * @param bool
239 * @param bool
240 * @return bool
241 */
748ee83 Print SQL command with multiple queries
jakubvrana authored
242 function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false) {
64d616c Rename get_dbh to connection
jakubvrana authored
243 global $connection, $error, $adminer;
f9a2023 Improve concurrency
jakubvrana authored
244 if ($execute) {
245 $failed = !$connection->query($query);
246 }
10bdbed Save queries to history
jakubvrana authored
247 $sql = "";
248 if ($query) {
c64c4fd Adminer class
jakubvrana authored
249 $sql = $adminer->messageQuery($query);
10bdbed Save queries to history
jakubvrana authored
250 }
748ee83 Print SQL command with multiple queries
jakubvrana authored
251 if ($failed) {
c1130ed Simplify SQL syntax errors everywhere
jakubvrana authored
252 $error = error() . $sql;
c48a017 Print SQL query by error
jakubvrana authored
253 return false;
f91b2c4 Print SQL query by message
jakubvrana authored
254 }
c48a017 Print SQL query by error
jakubvrana authored
255 if ($redirect) {
256 redirect($location, $message . $sql);
257 }
258 return true;
f91b2c4 Print SQL query by message
jakubvrana authored
259 }
260
9a176b0 Comments
jakubvrana authored
261 /** Execute and remember query
262 * @param string null to return remembered queries
263 * @return Min_Result
264 */
748ee83 Print SQL command with multiple queries
jakubvrana authored
265 function queries($query = null) {
64d616c Rename get_dbh to connection
jakubvrana authored
266 global $connection;
748ee83 Print SQL command with multiple queries
jakubvrana authored
267 static $queries = array();
268 if (!isset($query)) {
64ba924 Comments
jakubvrana authored
269 // return executed queries without parameter
36950eb Tables and views
jakubvrana authored
270 return implode(";\n", $queries);
748ee83 Print SQL command with multiple queries
jakubvrana authored
271 }
272 $queries[] = $query;
64d616c Rename get_dbh to connection
jakubvrana authored
273 return $connection->query($query);
748ee83 Print SQL command with multiple queries
jakubvrana authored
274 }
275
dbdd40a Introduce queries_redirect function
jakubvrana authored
276 /** Redirect by remembered queries
277 * @param string
278 * @param string
279 * @param bool
280 */
281 function queries_redirect($location, $message, $redirect) {
282 return query_redirect(queries(), $location, $message, $redirect, false, !$redirect);
283 }
284
9a176b0 Comments
jakubvrana authored
285 /** Remove parameter from query string
286 * @param string
287 * @return string
288 */
d41d446 remove_from_uri()
jakubvrana authored
289 function remove_from_uri($param = "") {
483d7dc Remove session_name() only without SID (bug #2910681)
jakubvrana authored
290 return substr(preg_replace("~(?<=[?&])($param" . (SID ? "" : "|" . session_name()) . ")=[^&]*&~", '', "$_SERVER[REQUEST_URI]&"), 0, -1);
d41d446 remove_from_uri()
jakubvrana authored
291 }
292
9a176b0 Comments
jakubvrana authored
293 /** Generate page number for pagination
294 * @param int
295 * @return string
296 */
c565c54 Let pagination function return
jakubvrana authored
297 function pagination($page) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
298 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
299 }
300
3e9b1ba Don't store files in hidden fields
jakubvrana authored
301 /** Get file contents from $_FILES
9a176b0 Comments
jakubvrana authored
302 * @param string
303 * @param bool
3e9b1ba Don't store files in hidden fields
jakubvrana authored
304 * @return mixed int for error, string otherwise
9a176b0 Comments
jakubvrana authored
305 */
25f01d3 Compress export and import
jakubvrana authored
306 function get_file($key, $decompress = false) {
307 $file = $_FILES[$key];
308 if (!$file || $file["error"]) {
309 return $file["error"];
430034c Cottage homework
jakubvrana authored
310 }
0a2d81d Bzip2 import
jakubvrana authored
311 return file_get_contents($decompress && ereg('\\.gz$', $file["name"]) ? "compress.zlib://$file[tmp_name]"
312 : ($decompress && ereg('\\.bz2$', $file["name"]) ? "compress.bzip2://$file[tmp_name]"
313 : $file["tmp_name"]
314 )); //! may not be reachable because of open_basedir
430034c Cottage homework
jakubvrana authored
315 }
316
9a176b0 Comments
jakubvrana authored
317 /** Determine upload error
318 * @param int
319 * @return string
320 */
e2a03c0 Show upload_max_filesize
jakubvrana authored
321 function upload_error($error) {
322 $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
323 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
324 }
325
9a176b0 Comments
jakubvrana authored
326 /** Generate class for odd rows
327 * @param string return this for odd rows, empty to reset counter
328 * @return string
329 */
330 function odd($return = ' class="odd"') {
4e5b126 Highlight odd and hover rows
jakubvrana authored
331 static $i = 0;
9a176b0 Comments
jakubvrana authored
332 if (!$return) { // reset counter
1b97f48 Reset odd() for each result
jakubvrana authored
333 $i = -1;
4e5b126 Highlight odd and hover rows
jakubvrana authored
334 }
9a176b0 Comments
jakubvrana authored
335 return ($i++ % 2 ? $return : '');
4e5b126 Highlight odd and hover rows
jakubvrana authored
336 }
337
9a176b0 Comments
jakubvrana authored
338 /** Check whether the string is in UTF-8
339 * @param string
340 * @return bool
341 */
017ffb5 Better UTF-8 detection
jakubvrana authored
342 function is_utf8($val) {
64ba924 Comments
jakubvrana authored
343 // don't print control chars except \t\r\n
017ffb5 Better UTF-8 detection
jakubvrana authored
344 return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val));
345 }
346
9a176b0 Comments
jakubvrana authored
347 /** Shorten UTF-8 string
348 * @param string
349 * @param int
350 * @param string
351 * @return string escaped string with appended ...
352 */
cd07584 Save SQL query to history
jakubvrana authored
353 function shorten_utf8($string, $length = 80, $suffix = "") {
11982f1 Shorten printed SQL query
jakubvrana authored
354 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
355 preg_match("(^([\t\r\n -~]{0,$length})($)?)", $string, $match);
95764b0 Shorten binary strings
jakubvrana authored
356 }
11982f1 Shorten printed SQL query
jakubvrana authored
357 return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<em>...</em>");
02a851c Shorten texts in PHP
jakubvrana authored
358 }
3920ebb Remove InnoDB table comment in Tables and views
jakubvrana authored
359
9a176b0 Comments
jakubvrana authored
360 /** Generate friendly URL
361 * @param string
362 * @return string
363 */
8251896 Downloaded file name
jakubvrana authored
364 function friendly_url($val) {
64ba924 Comments
jakubvrana authored
365 // used for blobs and export
8251896 Downloaded file name
jakubvrana authored
366 return preg_replace('~[^a-z0-9_]~i', '-', $val);
367 }
368
9a176b0 Comments
jakubvrana authored
369 /** Print hidden fields
370 * @param array
371 * @param array
372 * @return null
373 */
820c882 Bulk clone
jakubvrana authored
374 function hidden_fields($process, $ignore = array()) {
5d7071a Choose language through option-list
jakubvrana authored
375 while (list($key, $val) = each($process)) {
376 if (is_array($val)) {
377 foreach ($val as $k => $v) {
378 $process[$key . "[$k]"] = $v;
379 }
380 } elseif (!in_array($key, $ignore)) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
381 echo '<input type="hidden" name="' . h($key) . '" value="' . h($val) . '">';
5d7071a Choose language through option-list
jakubvrana authored
382 }
383 }
384 }
61640ee Move common functions
jakubvrana authored
385
9a176b0 Comments
jakubvrana authored
386 /** Find out foreign keys for each column
387 * @param string
388 * @return array array($col => array())
389 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
390 function column_foreign_keys($table) {
391 $return = array();
392 foreach (foreign_keys($table) as $foreign_key) {
393 foreach ($foreign_key["source"] as $val) {
394 $return[$val][] = $foreign_key;
395 }
396 }
397 return $return;
398 }
399
9a176b0 Comments
jakubvrana authored
400 /** Print edit input field
401 * @param array one field from fields()
402 * @param mixed
403 * @param string
404 * @return null
405 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
406 function input($field, $value, $function) {
c64c4fd Adminer class
jakubvrana authored
407 global $types, $adminer;
689699a Shortcut for htmlspecialchars
jakubvrana authored
408 $name = h(bracket_escape($field["field"]));
61640ee Move common functions
jakubvrana authored
409 echo "<td class='function'>";
6758477 Hide NULL in Editor enum
jakubvrana authored
410 $functions = (isset($_GET["select"]) ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field);
61640ee Move common functions
jakubvrana authored
411 if ($field["type"] == "enum") {
ec0282b Enum editing
jakubvrana authored
412 echo nbsp($functions[""]) . "<td>" . ($functions["orig"] ? "<label><input type='radio' name='fields[$name]' value='-1' checked><em>$functions[orig]</em></label> " : "");
413 echo $adminer->editInput($_GET["edit"], $field, " name='fields[$name]'", $value);
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
414 preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
61640ee Move common functions
jakubvrana authored
415 foreach ($matches[1] as $i => $val) {
416 $val = stripcslashes(str_replace("''", "'", $val));
417 $checked = (is_int($value) ? $value == $i+1 : $value === $val);
4cead56 Edit default values directly in table creation
jakubvrana authored
418 echo " <label><input type='radio' name='fields[$name]' value='" . ($i+1) . "'" . ($checked ? ' checked' : '') . '>' . h($val) . '</label>';
61640ee Move common functions
jakubvrana authored
419 }
420 } else {
9903946 Use original values in Editor multi edit
jakubvrana authored
421 $first = 0;
422 foreach ($functions as $key => $val) {
423 if ($key === "" || !$val) {
424 break;
425 }
426 $first++;
427 }
689699a Shortcut for htmlspecialchars
jakubvrana authored
428 $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
429 $attrs = " name='fields[$name]'$onchange";
0698409 Utilize html_select
jakubvrana authored
430 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
431 $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
7352c28 Replace strlen() by != ""
jakubvrana authored
432 if ($input != "") {
e1abcda Treat tinyint(1) as boolean
jakubvrana authored
433 echo $input;
1e4d11e Select from foreign keys in Editor
jakubvrana authored
434 } elseif ($field["type"] == "set") { //! 64 bits
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
435 preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
61640ee Move common functions
jakubvrana authored
436 foreach ($matches[1] as $i => $val) {
437 $val = stripcslashes(str_replace("''", "'", $val));
438 $checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true));
4cead56 Edit default values directly in table creation
jakubvrana authored
439 echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($val) . '</label>';
61640ee Move common functions
jakubvrana authored
440 }
2204cef Use textarea for blob with disabled file uploads
jakubvrana authored
441 } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) {
a561252 Use distinct name for blob inputs
jakubvrana authored
442 echo "<input type='file' name='fields-$name'$onchange>";
2204cef Use textarea for blob with disabled file uploads
jakubvrana authored
443 } elseif (ereg('text|blob', $field["type"])) {
a561252 Use distinct name for blob inputs
jakubvrana authored
444 echo "<textarea cols='50' rows='12'$attrs>" . h($value) . '</textarea>';
61640ee Move common functions
jakubvrana authored
445 } else {
446 // int(3) is only a display hint
447 $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
448 echo "<input value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char', $field["type"]) && $field["length"] > 20 ? " size='40'" : "") . "$attrs>";
61640ee Move common functions
jakubvrana authored
449 }
450 }
451 }
452
9a176b0 Comments
jakubvrana authored
453 /** Process edit input field
454 * @param one field from fields()
455 * @return string
456 */
a0def47 Date localization
jakubvrana authored
457 function process_input($field) {
64d616c Rename get_dbh to connection
jakubvrana authored
458 global $connection, $adminer;
a0def47 Date localization
jakubvrana authored
459 $idf = bracket_escape($field["field"]);
61640ee Move common functions
jakubvrana authored
460 $function = $_POST["function"][$idf];
461 $value = $_POST["fields"][$idf];
462 if ($field["type"] == "enum" ? $value == -1 : $function == "orig") {
463 return false;
7352c28 Replace strlen() by != ""
jakubvrana authored
464 } elseif ($field["type"] == "enum" || $field["auto_increment"] ? $value == "" : $function == "NULL") {
61640ee Move common functions
jakubvrana authored
465 return "NULL";
466 } elseif ($field["type"] == "enum") {
4cead56 Edit default values directly in table creation
jakubvrana authored
467 return intval($value);
61640ee Move common functions
jakubvrana authored
468 } elseif ($field["type"] == "set") {
4cead56 Edit default values directly in table creation
jakubvrana authored
469 return array_sum((array) $value);
2204cef Use textarea for blob with disabled file uploads
jakubvrana authored
470 } elseif (ereg('binary|blob', $field["type"]) && ini_get("file_uploads")) {
a561252 Use distinct name for blob inputs
jakubvrana authored
471 $file = get_file("fields-$idf");
61640ee Move common functions
jakubvrana authored
472 if (!is_string($file)) {
473 return false; //! report errors
474 }
91cb95a Remove unnecessary _binary
jakubvrana authored
475 return $connection->quote($file);
61640ee Move common functions
jakubvrana authored
476 } else {
a0def47 Date localization
jakubvrana authored
477 return $adminer->processInput($field, $value, $function);
61640ee Move common functions
jakubvrana authored
478 }
479 }
480
db07325 Search in all tables
jakubvrana authored
481 /** Print results of search in all tables
482 * @uses $_GET["where"][0]
483 * @uses $_POST["tables"]
484 * @return null
485 */
486 function search_tables() {
487 global $adminer, $connection;
488 $found = false;
489 foreach (table_status() as $table => $table_status) {
490 $name = $adminer->tableName($table_status);
491 if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) {
899e434 Update translations
jakubvrana authored
492 $result = $connection->query("SELECT 1 FROM " . idf_escape($table) . " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())) . " LIMIT 1");
db07325 Search in all tables
jakubvrana authored
493 if ($result->num_rows) {
494 if (!$found) {
495 echo "<ul>\n";
496 $found = true;
497 }
498 echo "<li><a href='" . h(ME . "select=" . urlencode($table) . "&where[0][op]=" . urlencode($_GET["where"][0]["op"]) . "&where[0][val]=" . urlencode($_GET["where"][0]["val"])) . "'>" . h($name) . "</a>\n";
499 }
500 }
501 }
502 echo ($found ? "</ul>" : "<p class='message'>" . lang('No tables.')) . "\n";
503 }
504
9a176b0 Comments
jakubvrana authored
505 /** Print CSV row
506 * @param array
507 * @return null
508 */
61640ee Move common functions
jakubvrana authored
509 function dump_csv($row) {
510 foreach ($row as $key => $val) {
7352c28 Replace strlen() by != ""
jakubvrana authored
511 if (preg_match("~[\"\n,]~", $val) || $val === "") {
61640ee Move common functions
jakubvrana authored
512 $row[$key] = '"' . str_replace('"', '""', $val) . '"';
513 }
514 }
89a60e7 Use output buffering for dump compression
jakubvrana authored
515 echo implode(",", $row) . "\n";
61640ee Move common functions
jakubvrana authored
516 }
c16c57b E-mail sending
jakubvrana authored
517
9a176b0 Comments
jakubvrana authored
518 /** Apply SQL function
519 * @param string
520 * @param string escaped column identifier
521 * @return string
522 */
e331067 Move apply_sql_function
jakubvrana authored
523 function apply_sql_function($function, $column) {
524 return ($function ? ($function == "count distinct" ? "COUNT(DISTINCT " : strtoupper("$function(")) . "$column)" : $column);
525 }
526
9a176b0 Comments
jakubvrana authored
527 /** Check whether the string is e-mail address
528 * @param string
529 * @return bool
530 */
c16c57b E-mail sending
jakubvrana authored
531 function is_email($email) {
532 $atom = '[-a-z0-9!#$%&\'*+/=?^_`{|}~]'; // characters of local-name
533 $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
fb141cc Speedup
jakubvrana authored
534 return preg_match("(^$atom+(\\.$atom+)*@($domain?\\.)+$domain\$)i", $email);
c16c57b E-mail sending
jakubvrana authored
535 }
dc667ea Hide select export and import
jakubvrana authored
536
bc78866 Link URLs in select
jakubvrana authored
537 /** Check whether the string is URL address
538 * @param string
539 * @return bool
540 */
541 function is_url($string) {
542 $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
543 return preg_match("~^https?://($domain?\\.)+$domain(:[0-9]+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string); //! restrict path, query and fragment characters
544 }
545
dc667ea Hide select export and import
jakubvrana authored
546 /** Print header for hidden fieldset (close by </div></fieldset>)
547 * @param string
548 * @param string
549 * @param bool
550 * @return null
551 */
552 function print_fieldset($id, $legend, $visible = false) {
553 echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
554 }
94a2be5 Highlight current links
jakubvrana authored
555
556 /** Enclose $string to <b> if $bold is true
557 * @param string
558 * @param bool
559 * @return string
560 */
561 function bold($string, $bold) {
562 return ($bold ? "<b>$string</b>" : $string);
563 }
Something went wrong with that request. Please try again.