Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 886 lines (826 sloc) 26.221 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
71e0db4 @vrana Log to "$database.sql" by default
authored
11 /** Get Adminer object
12 * @return Adminer
13 */
14 function adminer() {
15 global $adminer;
16 return $adminer;
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) {
a29ac72 Improve drivers
jakubvrana authored
24 $last = substr($idf, -1);
25 return str_replace($last . $last, $last, substr($idf, 1, -1));
667bfec Decomposition
jakubvrana authored
26 }
27
5e01a62 Prepare for SQLite
jakubvrana authored
28 /** Escape string to use inside ''
29 * @param string
30 * @return string
31 */
32 function escape_string($val) {
7e644b4 @vrana Save bytes ($connection->quote shortcut)
authored
33 return substr(q($val), 1, -1);
5e01a62 Prepare for SQLite
jakubvrana authored
34 }
35
72f4d9e @vrana Function parse_str respects magic_quotes_gpc (bug #3034575)
authored
36 /** Disable magic_quotes_gpc
37 * @param array e.g. (&$_GET, &$_POST, &$_COOKIE)
83d82d6 @vrana Pass $filter to remove_slashes (thanks to juzna)
authored
38 * @param bool whether to leave values as is
72f4d9e @vrana Function parse_str respects magic_quotes_gpc (bug #3034575)
authored
39 * @return null modified in place
40 */
83d82d6 @vrana Pass $filter to remove_slashes (thanks to juzna)
authored
41 function remove_slashes($process, $filter = false) {
72f4d9e @vrana Function parse_str respects magic_quotes_gpc (bug #3034575)
authored
42 if (get_magic_quotes_gpc()) {
43 while (list($key, $val) = each($process)) {
44 foreach ($val as $k => $v) {
45 unset($process[$key][$k]);
46 if (is_array($v)) {
47 $process[$key][stripslashes($k)] = $v;
48 $process[] = &$process[$key][stripslashes($k)];
49 } else {
50 $process[$key][stripslashes($k)] = ($filter ? $v : stripslashes($v));
51 }
52 }
53 }
54 }
55 }
56
9a176b0 Comments
jakubvrana authored
57 /** Escape or unescape string to use inside form []
58 * @param string
59 * @param bool
60 * @return string
61 */
667bfec Decomposition
jakubvrana authored
62 function bracket_escape($idf, $back = false) {
64ba924 Comments
jakubvrana authored
63 // escape brackets inside name="x[]"
73e8631 Move stuff to functions.inc.php
jakubvrana authored
64 static $trans = array(':' => ':1', ']' => ':2', '[' => ':3');
667bfec Decomposition
jakubvrana authored
65 return strtr($idf, ($back ? array_flip($trans) : $trans));
66 }
67
9a176b0 Comments
jakubvrana authored
68 /** Escape for HTML
69 * @param string
70 * @return string
71 */
689699a Shortcut for htmlspecialchars
jakubvrana authored
72 function h($string) {
0474c21 @vrana Hide null byte in HTML (bug #3358372)
authored
73 return htmlspecialchars(str_replace("\0", "", $string), ENT_QUOTES);
689699a Shortcut for htmlspecialchars
jakubvrana authored
74 }
75
9a176b0 Comments
jakubvrana authored
76 /** Escape for TD
77 * @param string
78 * @return string
79 */
c196985 Function nbsp
jakubvrana authored
80 function nbsp($string) {
7352c28 Replace strlen() by != ""
jakubvrana authored
81 return (trim($string) != "" ? h($string) : "&nbsp;");
c196985 Function nbsp
jakubvrana authored
82 }
83
3f5b683 Reintegrate sqlite branch
jakubvrana authored
84 /** Convert \n to <br>
85 * @param string
86 * @return string
87 */
88 function nl_br($string) {
89 return str_replace("\n", "<br>", $string); // nl2br() uses XHTML before PHP 5.3
90 }
91
6b30cfa Separate checkbox
jakubvrana authored
92 /** Generate HTML checkbox
93 * @param string
94 * @param string
95 * @param bool
96 * @param string
97 * @param string
3a14845 @vrana Respect defaults and comments checkbox after post (bug #3311791)
authored
98 * @param bool
6b30cfa Separate checkbox
jakubvrana authored
99 * @return string
100 */
3a14845 @vrana Respect defaults and comments checkbox after post (bug #3311791)
authored
101 function checkbox($name, $value, $checked, $label = "", $onclick = "", $jsonly = false) {
c4fe12a Clickable labels in IE6
jakubvrana authored
102 static $id = 0;
103 $id++;
be4f2ef @vrana More thorough escaping
authored
104 $return = "<input type='checkbox' name='$name' value='" . h($value) . "'" . ($checked ? " checked" : "") . ($onclick ? ' onclick="' . h($onclick) . '"' : '') . ($jsonly ? " class='jsonly'" : "") . " id='checkbox-$id'>";
7352c28 Replace strlen() by != ""
jakubvrana authored
105 return ($label != "" ? "<label for='checkbox-$id'>$return" . h($label) . "</label>" : $return);
6b30cfa Separate checkbox
jakubvrana authored
106 }
107
9a176b0 Comments
jakubvrana authored
108 /** Generate list of HTML options
109 * @param array array of strings or arrays (creates optgroup)
110 * @param mixed
111 * @param bool always use array keys for value="", otherwise only string keys are used
112 * @return string
113 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
114 function optionlist($options, $selected = null, $use_keys = false) {
667bfec Decomposition
jakubvrana authored
115 $return = "";
116 foreach ($options as $k => $v) {
2f76084 @vrana Avoid big ternary operator (saves memory)
authored
117 $opts = array($k => $v);
667bfec Decomposition
jakubvrana authored
118 if (is_array($v)) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
119 $return .= '<optgroup label="' . h($k) . '">';
2f76084 @vrana Avoid big ternary operator (saves memory)
authored
120 $opts = $v;
667bfec Decomposition
jakubvrana authored
121 }
2f76084 @vrana Avoid big ternary operator (saves memory)
authored
122 foreach ($opts as $key => $val) {
cb6d36c HTML instead of XHTML
jakubvrana authored
123 $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
124 }
125 if (is_array($v)) {
126 $return .= '</optgroup>';
127 }
128 }
129 return $return;
130 }
131
098b74b Move function
jakubvrana authored
132 /** Generate HTML radio list
133 * @param string
134 * @param array
135 * @param string
136 * @param string true for no onchange, false for radio
137 * @return string
138 */
139 function html_select($name, $options, $value = "", $onchange = true) {
140 if ($onchange) {
037c547 @vrana Fix XSS (thanks to Jigal van Hemert)
authored
141 return "<select name='" . h($name) . "'" . (is_string($onchange) ? ' onchange="' . h($onchange) . '"' : "") . ">" . optionlist($options, $value) . "</select>";
098b74b Move function
jakubvrana authored
142 }
143 $return = "";
144 foreach ($options as $key => $val) {
145 $return .= "<label><input type='radio' name='" . h($name) . "' value='" . h($key) . "'" . ($key == $value ? " checked" : "") . ">" . h($val) . "</label>";
146 }
147 return $return;
148 }
149
a93bc19 @vrana Create confirm function
authored
150 /** Get onclick confirmation
151 * @param string JavaScript expression
152 * @return string
153 */
f498219 @vrana Remove eventStop() used by AJAXification in past
authored
154 function confirm($count = "") {
155 return " onclick=\"return confirm('" . lang('Are you sure?') . ($count ? " (' + $count + ')" : "") . "');\"";
a93bc19 @vrana Create confirm function
authored
156 }
157
4b40554 @vrana Reorganize functions
authored
158 /** Print header for hidden fieldset (close by </div></fieldset>)
159 * @param string
160 * @param string
161 * @param bool
162 * @param string
163 * @return null
164 */
165 function print_fieldset($id, $legend, $visible = false, $onclick = "") {
166 echo "<fieldset><legend><a href='#fieldset-$id' onclick=\"" . h($onclick) . "return !toggle('fieldset-$id');\">$legend</a></legend><div id='fieldset-$id'" . ($visible ? "" : " class='hidden'") . ">\n";
167 }
168
169 /** Return class='active' if $bold is true
170 * @param bool
171 * @return string
172 */
173 function bold($bold) {
174 return ($bold ? " class='active'" : "");
175 }
176
177 /** Generate class for odd rows
178 * @param string return this for odd rows, empty to reset counter
179 * @return string
180 */
181 function odd($return = ' class="odd"') {
182 static $i = 0;
183 if (!$return) { // reset counter
184 $i = -1;
185 }
186 return ($i++ % 2 ? $return : '');
187 }
188
28f21aa @vrana Escape JavaScript strings (bug #3093243)
authored
189 /** Escape string for JavaScript apostrophes
190 * @param string
191 * @return string
192 */
193 function js_escape($string) {
194 return addcslashes($string, "\r\n'\\/"); // slash for <script>
195 }
196
4b40554 @vrana Reorganize functions
authored
197 /** Print one row in JSON object
198 * @param string or "" to close the object
199 * @param string
200 * @return null
201 */
202 function json_row($key, $val = null) {
203 static $first = true;
204 if ($first) {
205 echo "{";
206 }
207 if ($key != "") {
6591d48 @vrana Replace isset($var) by $var !== null
authored
208 echo ($first ? "" : ",") . "\n\t\"" . addcslashes($key, "\r\n\"\\") . '": ' . ($val !== null ? '"' . addcslashes($val, "\r\n\"\\") . '"' : 'undefined');
4b40554 @vrana Reorganize functions
authored
209 $first = false;
210 } else {
211 echo "\n}\n";
212 $first = true;
213 }
214 }
215
3f5b683 Reintegrate sqlite branch
jakubvrana authored
216 /** Get INI boolean value
217 * @param string
218 * @return bool
219 */
220 function ini_bool($ini) {
221 $val = ini_get($ini);
222 return (eregi('^(on|true|yes)$', $val) || (int) $val); // boolean values set by php_value are strings
223 }
224
f30fd12 @vrana Work without session.use_cookies (bug #3138640)
authored
225 /** Check if SID is neccessary
226 * @return bool
227 */
228 function sid() {
876af58 @vrana Fix sid function
authored
229 static $return;
6591d48 @vrana Replace isset($var) by $var !== null
authored
230 if ($return === null) { // restart_session() defines SID
876af58 @vrana Fix sid function
authored
231 $return = (SID && !($_COOKIE && ini_bool("session.use_cookies"))); // $_COOKIE - don't pass SID with permanent login
232 }
233 return $return;
f30fd12 @vrana Work without session.use_cookies (bug #3138640)
authored
234 }
235
236 /** Shortcut for $connection->quote($string)
237 * @param string
238 * @return string
239 */
7e644b4 @vrana Save bytes ($connection->quote shortcut)
authored
240 function q($string) {
241 global $connection;
242 return $connection->quote($string);
243 }
244
9a176b0 Comments
jakubvrana authored
245 /** Get list of values from database
246 * @param string
247 * @param mixed
248 * @return array
249 */
0bd864e Allow specifying column in get_vals
jakubvrana authored
250 function get_vals($query, $column = 0) {
64d616c Rename get_dbh to connection
jakubvrana authored
251 global $connection;
7769f2c Separate get_vals
jakubvrana authored
252 $return = array();
64d616c Rename get_dbh to connection
jakubvrana authored
253 $result = $connection->query($query);
b84252f Display SQLite compile options
jakubvrana authored
254 if (is_object($result)) {
49f7886 SHOW DATABASES can be revoked
jakubvrana authored
255 while ($row = $result->fetch_row()) {
0bd864e Allow specifying column in get_vals
jakubvrana authored
256 $return[] = $row[$column];
49f7886 SHOW DATABASES can be revoked
jakubvrana authored
257 }
7769f2c Separate get_vals
jakubvrana authored
258 }
259 return $return;
260 }
261
3f5b683 Reintegrate sqlite branch
jakubvrana authored
262 /** Get keys from first column and values from second
263 * @param string
264 * @param Min_DB
265 * @return array
266 */
267 function get_key_vals($query, $connection2 = null) {
268 global $connection;
269 if (!is_object($connection2)) {
270 $connection2 = $connection;
271 }
272 $return = array();
273 $result = $connection2->query($query);
e26b186 @vrana Avoid fatal error (bug #3110257)
authored
274 if (is_object($result)) {
275 while ($row = $result->fetch_row()) {
276 $return[$row[0]] = $row[1];
277 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
278 }
279 return $return;
280 }
281
b0d637b @vrana Avoid fatal errors
authored
282 /** Get all rows of result
283 * @param string
6bcbb0f @vrana Don't report previous error on primary connection
authored
284 * @param Min_DB
285 * @param string
b0d637b @vrana Avoid fatal errors
authored
286 * @return array associative
287 */
96544ba @vrana Report errors in get_rows()
authored
288 function get_rows($query, $connection2 = null, $error = "<p class='error'>") {
b0d637b @vrana Avoid fatal errors
authored
289 global $connection;
6bcbb0f @vrana Don't report previous error on primary connection
authored
290 $conn = (is_object($connection2) ? $connection2 : $connection);
b0d637b @vrana Avoid fatal errors
authored
291 $return = array();
6bcbb0f @vrana Don't report previous error on primary connection
authored
292 $result = $conn->query($query);
b0d637b @vrana Avoid fatal errors
authored
293 if (is_object($result)) { // can return true
294 while ($row = $result->fetch_assoc()) {
295 $return[] = $row;
296 }
6bcbb0f @vrana Don't report previous error on primary connection
authored
297 } elseif (!$result && !is_object($connection2) && $error && defined("PAGE_HEADER")) {
96544ba @vrana Report errors in get_rows()
authored
298 echo $error . error() . "\n";
b0d637b @vrana Avoid fatal errors
authored
299 }
300 return $return;
301 }
302
9a176b0 Comments
jakubvrana authored
303 /** Find unique identifier of a row
304 * @param array
305 * @param array result of indexes()
35ec64c Link COUNT(*) result to listing
jakubvrana authored
306 * @return array
9a176b0 Comments
jakubvrana authored
307 */
35ec64c Link COUNT(*) result to listing
jakubvrana authored
308 function unique_array($row, $indexes) {
720f5fc Restructure indexes
jakubvrana authored
309 foreach ($indexes as $index) {
4b3d569 Save bytes
jakubvrana authored
310 if (ereg("PRIMARY|UNIQUE", $index["type"])) {
720f5fc Restructure indexes
jakubvrana authored
311 $return = array();
312 foreach ($index["columns"] as $key) {
64ba924 Comments
jakubvrana authored
313 if (!isset($row[$key])) { // NULL is ambiguous
720f5fc Restructure indexes
jakubvrana authored
314 continue 2;
667bfec Decomposition
jakubvrana authored
315 }
35ec64c Link COUNT(*) result to listing
jakubvrana authored
316 $return[$key] = $row[$key];
667bfec Decomposition
jakubvrana authored
317 }
720f5fc Restructure indexes
jakubvrana authored
318 return $return;
667bfec Decomposition
jakubvrana authored
319 }
320 }
321 $return = array();
322 foreach ($row as $key => $val) {
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
323 if (!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~', $key)) { //! columns looking like functions
35ec64c Link COUNT(*) result to listing
jakubvrana authored
324 $return[$key] = $val;
988a29f Don't use aggregation functions in unique_idf
jakubvrana authored
325 }
430034c Cottage homework
jakubvrana authored
326 }
327 return $return;
328 }
329
9a176b0 Comments
jakubvrana authored
330 /** Create SQL condition from parsed query string
331 * @param array parsed query string
332 * @return string
333 */
9ea3112 Mandatory $where in where()
jakubvrana authored
334 function where($where) {
1a8d7f1 @vrana Use LIKE for text comparison in MS SQL (bug #3088222)
authored
335 global $jush;
430034c Cottage homework
jakubvrana authored
336 $return = array();
341362a Driver specific INSERT INTO
jakubvrana authored
337 foreach ((array) $where["where"] as $key => $val) {
66ff153 Use bracket_escape function
jakubvrana authored
338 $return[] = idf_escape(bracket_escape($key, 1)) // 1 - back
3c5c08e @vrana Don't use LIKE for numbers in SQLite (bug #3420408)
authored
339 . (($jush == "sql" && ereg('\\.', $val)) || $jush == "mssql" ? " LIKE " . exact_value(addcslashes($val, "%_\\")) : " = " . exact_value($val)) // LIKE because of floats, but slow with ints, in MS SQL because of text
66ff153 Use bracket_escape function
jakubvrana authored
340 ; //! enum and set
341362a Driver specific INSERT INTO
jakubvrana authored
341 }
342 foreach ((array) $where["null"] as $key) {
343 $return[] = idf_escape($key) . " IS NULL";
667bfec Decomposition
jakubvrana authored
344 }
c16c57b E-mail sending
jakubvrana authored
345 return implode(" AND ", $return);
667bfec Decomposition
jakubvrana authored
346 }
347
9a176b0 Comments
jakubvrana authored
348 /** Create SQL condition from query string
349 * @param string
350 * @return string
351 */
0cd2afb Remove single item clone
jakubvrana authored
352 function where_check($val) {
353 parse_str($val, $check);
72f4d9e @vrana Function parse_str respects magic_quotes_gpc (bug #3034575)
authored
354 remove_slashes(array(&$check));
0cd2afb Remove single item clone
jakubvrana authored
355 return where($check);
356 }
357
9a176b0 Comments
jakubvrana authored
358 /** Create query string where condition from value
359 * @param int condition order
360 * @param string column identifier
361 * @param string
362 * @return string
186c058 Utilize where_link function
jakubvrana authored
363 * @return string
9a176b0 Comments
jakubvrana authored
364 */
186c058 Utilize where_link function
jakubvrana authored
365 function where_link($i, $column, $value, $operator = "=") {
6591d48 @vrana Replace isset($var) by $var !== null
authored
366 return "&where%5B$i%5D%5Bcol%5D=" . urlencode($column) . "&where%5B$i%5D%5Bop%5D=" . urlencode(($value !== null ? $operator : "IS NULL")) . "&where%5B$i%5D%5Bval%5D=" . urlencode($value);
c42c46a Table relations
jakubvrana authored
367 }
368
319cba4 Save e-mail from to cookie
jakubvrana authored
369 /** Set cookie valid for 1 month
370 * @param string
371 * @param string
372 * @return bool
373 */
374 function cookie($name, $value) {
2cec758 @vrana Direct links from HTTPS to HTTP
authored
375 global $HTTPS;
3f5b683 Reintegrate sqlite branch
jakubvrana authored
376 $params = array(
377 $name,
378 (ereg("\n", $value) ? "" : $value), // HTTP Response Splitting protection in PHP < 5.1.2
379 time() + 2592000, // 2592000 - 30 days
380 preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]),
381 "",
2cec758 @vrana Direct links from HTTPS to HTTP
authored
382 $HTTPS
3f5b683 Reintegrate sqlite branch
jakubvrana authored
383 );
c2334db Secure cookies
jakubvrana authored
384 if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
385 $params[] = true; // HttpOnly
386 }
387 return call_user_func_array('setcookie', $params);
319cba4 Save e-mail from to cookie
jakubvrana authored
388 }
389
f9a2023 Improve concurrency
jakubvrana authored
390 /** Restart stopped session
391 * @return null
392 */
393 function restart_session() {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
394 if (!ini_bool("session.use_cookies")) {
f9a2023 Improve concurrency
jakubvrana authored
395 session_start();
396 }
397 }
398
3f5b683 Reintegrate sqlite branch
jakubvrana authored
399 /** Get session variable for current server
400 * @param string
401 * @return mixed
402 */
403 function &get_session($key) {
404 return $_SESSION[$key][DRIVER][SERVER][$_GET["username"]];
405 }
406
407 /** Set session variable for current server
408 * @param string
409 * @param mixed
410 * @return mixed
411 */
412 function set_session($key, $val) {
413 $_SESSION[$key][DRIVER][SERVER][$_GET["username"]] = $val; // used also in auth.inc.php
414 }
415
605b093 @vrana List authentications
authored
416 /** Get authenticated URL
417 * @param string
418 * @param string
419 * @param string
8be29af @vrana Allow specifying database in login form (bug #3499359)
authored
420 * @param string
605b093 @vrana List authentications
authored
421 * @return string
422 */
8be29af @vrana Allow specifying database in login form (bug #3499359)
authored
423 function auth_url($driver, $server, $username, $db = null) {
605b093 @vrana List authentications
authored
424 global $drivers;
8be29af @vrana Allow specifying database in login form (bug #3499359)
authored
425 preg_match('~([^?]*)\\??(.*)~', remove_from_uri(implode("|", array_keys($drivers)) . "|username|" . ($db !== null ? "db|" : "") . session_name()), $match);
605b093 @vrana List authentications
authored
426 return "$match[1]?"
f30fd12 @vrana Work without session.use_cookies (bug #3138640)
authored
427 . (sid() ? SID . "&" : "")
605b093 @vrana List authentications
authored
428 . ($driver != "server" || $server != "" ? urlencode($driver) . "=" . urlencode($server) . "&" : "")
429 . "username=" . urlencode($username)
8be29af @vrana Allow specifying database in login form (bug #3499359)
authored
430 . ($db != "" ? "&db=" . urlencode($db) : "")
605b093 @vrana List authentications
authored
431 . ($match[2] ? "&$match[2]" : "")
432 ;
433 }
434
390e38b @vrana Load long texts for inline-edit by AJAX
authored
435 /** Find whether it is an AJAX request
436 * @return bool
437 */
438 function is_ajax() {
fdea197 @vrana Simplify AJAX redirect
authored
439 return ($_SERVER["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest");
390e38b @vrana Load long texts for inline-edit by AJAX
authored
440 }
441
9a176b0 Comments
jakubvrana authored
442 /** Send Location header and exit
9bb1909 Fix Save and continue edit
jakubvrana authored
443 * @param string null to only set a message
9a176b0 Comments
jakubvrana authored
444 * @param string
445 * @return null
446 */
430034c Cottage homework
jakubvrana authored
447 function redirect($location, $message = null) {
6591d48 @vrana Replace isset($var) by $var !== null
authored
448 if ($message !== null) {
be49e08 Improve session restarting
jakubvrana authored
449 restart_session();
6591d48 @vrana Replace isset($var) by $var !== null
authored
450 $_SESSION["messages"][preg_replace('~^[^?]*~', '', ($location !== null ? $location : $_SERVER["REQUEST_URI"]))][] = $message;
430034c Cottage homework
jakubvrana authored
451 }
6591d48 @vrana Replace isset($var) by $var !== null
authored
452 if ($location !== null) {
b535853 @vrana Full AJAX only with pushState to work correctly with history
authored
453 if ($location == "") {
454 $location = ".";
455 }
4815c7d @vrana Don't use AJAX links and forms
authored
456 header("Location: $location");
38894b2 @vrana Send all forms by AJAX
authored
457 exit;
9bb1909 Fix Save and continue edit
jakubvrana authored
458 }
430034c Cottage homework
jakubvrana authored
459 }
460
9a176b0 Comments
jakubvrana authored
461 /** Execute query and redirect if successful
462 * @param string
463 * @param string
464 * @param string
465 * @param bool
466 * @param bool
467 * @param bool
468 * @return bool
469 */
748ee83 Print SQL command with multiple queries
jakubvrana authored
470 function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false) {
64d616c Rename get_dbh to connection
jakubvrana authored
471 global $connection, $error, $adminer;
f9a2023 Improve concurrency
jakubvrana authored
472 if ($execute) {
473 $failed = !$connection->query($query);
474 }
10bdbed Save queries to history
jakubvrana authored
475 $sql = "";
476 if ($query) {
2e6ad20 @vrana Display ; in history (thanks to Jan Cerny)
authored
477 $sql = $adminer->messageQuery("$query;");
10bdbed Save queries to history
jakubvrana authored
478 }
748ee83 Print SQL command with multiple queries
jakubvrana authored
479 if ($failed) {
c1130ed Simplify SQL syntax errors everywhere
jakubvrana authored
480 $error = error() . $sql;
c48a017 Print SQL query by error
jakubvrana authored
481 return false;
f91b2c4 Print SQL query by message
jakubvrana authored
482 }
c48a017 Print SQL query by error
jakubvrana authored
483 if ($redirect) {
484 redirect($location, $message . $sql);
485 }
486 return true;
f91b2c4 Print SQL query by message
jakubvrana authored
487 }
488
9a176b0 Comments
jakubvrana authored
489 /** Execute and remember query
d06de55 @vrana Use DELIMITER in history
authored
490 * @param string null to return remembered queries, end with ';' to use DELIMITER
9a176b0 Comments
jakubvrana authored
491 * @return Min_Result
492 */
748ee83 Print SQL command with multiple queries
jakubvrana authored
493 function queries($query = null) {
64d616c Rename get_dbh to connection
jakubvrana authored
494 global $connection;
748ee83 Print SQL command with multiple queries
jakubvrana authored
495 static $queries = array();
6591d48 @vrana Replace isset($var) by $var !== null
authored
496 if ($query === null) {
64ba924 Comments
jakubvrana authored
497 // return executed queries without parameter
2e6ad20 @vrana Display ; in history (thanks to Jan Cerny)
authored
498 return implode(";\n", $queries);
748ee83 Print SQL command with multiple queries
jakubvrana authored
499 }
2e6ad20 @vrana Display ; in history (thanks to Jan Cerny)
authored
500 $queries[] = (ereg(';$', $query) ? "DELIMITER ;;\n$query;\nDELIMITER " : $query);
64d616c Rename get_dbh to connection
jakubvrana authored
501 return $connection->query($query);
748ee83 Print SQL command with multiple queries
jakubvrana authored
502 }
503
f9bb1c5 @vrana Introduce apply_queries function
authored
504 /** Apply command to all array items
505 * @param string
506 * @param array
507 * @param callback
508 * @return bool
509 */
510 function apply_queries($query, $tables, $escape = 'table') {
511 foreach ($tables as $table) {
512 if (!queries("$query " . $escape($table))) {
513 return false;
514 }
515 }
516 return true;
517 }
518
dbdd40a Introduce queries_redirect function
jakubvrana authored
519 /** Redirect by remembered queries
520 * @param string
521 * @param string
522 * @param bool
52b9820 @vrana Comment
authored
523 * @return bool
dbdd40a Introduce queries_redirect function
jakubvrana authored
524 */
525 function queries_redirect($location, $message, $redirect) {
526 return query_redirect(queries(), $location, $message, $redirect, false, !$redirect);
527 }
528
9a176b0 Comments
jakubvrana authored
529 /** Remove parameter from query string
530 * @param string
531 * @return string
532 */
d41d446 remove_from_uri()
jakubvrana authored
533 function remove_from_uri($param = "") {
483d7dc Remove session_name() only without SID (bug #2910681)
jakubvrana authored
534 return substr(preg_replace("~(?<=[?&])($param" . (SID ? "" : "|" . session_name()) . ")=[^&]*&~", '', "$_SERVER[REQUEST_URI]&"), 0, -1);
d41d446 remove_from_uri()
jakubvrana authored
535 }
536
9a176b0 Comments
jakubvrana authored
537 /** Generate page number for pagination
538 * @param int
539 * @return string
540 */
bd25295 Don't redirect from last page
jakubvrana authored
541 function pagination($page, $current) {
6585b23 @vrana Generic AJAX links
authored
542 return " " . ($page == $current ? $page + 1 : '<a href="' . h(remove_from_uri("page") . ($page ? "&page=$page" : "")) . '">' . ($page + 1) . "</a>");
1456283 Pages on last page
jakubvrana authored
543 }
544
3e9b1ba Don't store files in hidden fields
jakubvrana authored
545 /** Get file contents from $_FILES
9a176b0 Comments
jakubvrana authored
546 * @param string
547 * @param bool
3e9b1ba Don't store files in hidden fields
jakubvrana authored
548 * @return mixed int for error, string otherwise
9a176b0 Comments
jakubvrana authored
549 */
25f01d3 Compress export and import
jakubvrana authored
550 function get_file($key, $decompress = false) {
551 $file = $_FILES[$key];
552 if (!$file || $file["error"]) {
553 return $file["error"];
430034c Cottage homework
jakubvrana authored
554 }
9ff10f8 @vrana Parse UTF-16 and UTF-8 BOM in all text uploads
authored
555 $return = file_get_contents($decompress && ereg('\\.gz$', $file["name"]) ? "compress.zlib://$file[tmp_name]"
0a2d81d Bzip2 import
jakubvrana authored
556 : ($decompress && ereg('\\.bz2$', $file["name"]) ? "compress.bzip2://$file[tmp_name]"
557 : $file["tmp_name"]
558 )); //! may not be reachable because of open_basedir
9ff10f8 @vrana Parse UTF-16 and UTF-8 BOM in all text uploads
authored
559 if ($decompress) {
b5cbbce @vrana Save memory
authored
560 $start = substr($return, 0, 3);
561 if (function_exists("iconv") && ereg("^\xFE\xFF|^\xFF\xFE", $start, $regs)) { // not ternary operator to save memory
9ff10f8 @vrana Parse UTF-16 and UTF-8 BOM in all text uploads
authored
562 $return = iconv("utf-16", "utf-8", $return);
b5cbbce @vrana Save memory
authored
563 } elseif ($start == "\xEF\xBB\xBF") { // UTF-8 BOM
564 $return = substr($return, 3);
9ff10f8 @vrana Parse UTF-16 and UTF-8 BOM in all text uploads
authored
565 }
566 }
567 return $return;
430034c Cottage homework
jakubvrana authored
568 }
569
9a176b0 Comments
jakubvrana authored
570 /** Determine upload error
571 * @param int
572 * @return string
573 */
e2a03c0 Show upload_max_filesize
jakubvrana authored
574 function upload_error($error) {
9d944c8 @vrana Respect original memory_limit
authored
575 $max_size = ($error == UPLOAD_ERR_INI_SIZE ? ini_get("upload_max_filesize") : 0); // post_max_size is checked in index.php
b2a7c7a Execute SQL file stored on server disk
jakubvrana authored
576 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
577 }
578
4b40554 @vrana Reorganize functions
authored
579 /** Create repeat pattern for preg
c313dd8 @vrana Deferred operations by AJAX instead of JS (doesn't require sending token...
authored
580 * @param string
4b40554 @vrana Reorganize functions
authored
581 * @param int
582 * @return string
c313dd8 @vrana Deferred operations by AJAX instead of JS (doesn't require sending token...
authored
583 */
4b40554 @vrana Reorganize functions
authored
584 function repeat_pattern($pattern, $length) {
585 // fix for Compilation failed: number too big in {} quantifier
586 return str_repeat("$pattern{0,65535}", $length / 65535) . "$pattern{0," . ($length % 65535) . "}"; // can create {0,0} which is OK
c313dd8 @vrana Deferred operations by AJAX instead of JS (doesn't require sending token...
authored
587 }
588
9a176b0 Comments
jakubvrana authored
589 /** Check whether the string is in UTF-8
590 * @param string
591 * @return bool
592 */
017ffb5 Better UTF-8 detection
jakubvrana authored
593 function is_utf8($val) {
64ba924 Comments
jakubvrana authored
594 // don't print control chars except \t\r\n
017ffb5 Better UTF-8 detection
jakubvrana authored
595 return (preg_match('~~u', $val) && !preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~', $val));
596 }
597
9a176b0 Comments
jakubvrana authored
598 /** Shorten UTF-8 string
599 * @param string
600 * @param int
601 * @param string
602 * @return string escaped string with appended ...
603 */
cd07584 Save SQL query to history
jakubvrana authored
604 function shorten_utf8($string, $length = 80, $suffix = "") {
1315537 @vrana No error for big text length (bug #264133)
authored
605 if (!preg_match("(^(" . repeat_pattern("[\t\r\n -\x{FFFF}]", $length) . ")($)?)u", $string, $match)) { // ~s causes trash in $match[2] under some PHP versions, (.|\n) is slow
606 preg_match("(^(" . repeat_pattern("[\t\r\n -~]", $length) . ")($)?)", $string, $match);
95764b0 Shorten binary strings
jakubvrana authored
607 }
687b3fd @vrana Replace <strong> by <b> and <em> by <i>
authored
608 return h($match[1]) . $suffix . (isset($match[2]) ? "" : "<i>...</i>");
02a851c Shorten texts in PHP
jakubvrana authored
609 }
3920ebb Remove InnoDB table comment in Tables and views
jakubvrana authored
610
9a176b0 Comments
jakubvrana authored
611 /** Generate friendly URL
612 * @param string
613 * @return string
614 */
8251896 Downloaded file name
jakubvrana authored
615 function friendly_url($val) {
64ba924 Comments
jakubvrana authored
616 // used for blobs and export
8251896 Downloaded file name
jakubvrana authored
617 return preg_replace('~[^a-z0-9_]~i', '-', $val);
618 }
619
9a176b0 Comments
jakubvrana authored
620 /** Print hidden fields
621 * @param array
622 * @param array
623 * @return null
624 */
820c882 Bulk clone
jakubvrana authored
625 function hidden_fields($process, $ignore = array()) {
5d7071a Choose language through option-list
jakubvrana authored
626 while (list($key, $val) = each($process)) {
627 if (is_array($val)) {
628 foreach ($val as $k => $v) {
629 $process[$key . "[$k]"] = $v;
630 }
631 } elseif (!in_array($key, $ignore)) {
689699a Shortcut for htmlspecialchars
jakubvrana authored
632 echo '<input type="hidden" name="' . h($key) . '" value="' . h($val) . '">';
5d7071a Choose language through option-list
jakubvrana authored
633 }
634 }
635 }
61640ee Move common functions
jakubvrana authored
636
3f5b683 Reintegrate sqlite branch
jakubvrana authored
637 /** Print hidden fields for GET forms
638 * @return null
639 */
640 function hidden_fields_get() {
f30fd12 @vrana Work without session.use_cookies (bug #3138640)
authored
641 echo (sid() ? '<input type="hidden" name="' . session_name() . '" value="' . h(session_id()) . '">' : '');
3f5b683 Reintegrate sqlite branch
jakubvrana authored
642 echo (SERVER !== null ? '<input type="hidden" name="' . DRIVER . '" value="' . h(SERVER) . '">' : "");
643 echo '<input type="hidden" name="username" value="' . h($_GET["username"]) . '">';
644 }
645
9a176b0 Comments
jakubvrana authored
646 /** Find out foreign keys for each column
647 * @param string
648 * @return array array($col => array())
649 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
650 function column_foreign_keys($table) {
753909e @vrana Support for virtual foreign keys
authored
651 global $adminer;
1e4d11e Select from foreign keys in Editor
jakubvrana authored
652 $return = array();
753909e @vrana Support for virtual foreign keys
authored
653 foreach ($adminer->foreignKeys($table) as $foreign_key) {
1e4d11e Select from foreign keys in Editor
jakubvrana authored
654 foreach ($foreign_key["source"] as $val) {
655 $return[$val][] = $foreign_key;
656 }
657 }
658 return $return;
659 }
660
3f5b683 Reintegrate sqlite branch
jakubvrana authored
661 /** Print enum input field
662 * @param string "radio"|"checkbox"
663 * @param string
664 * @param array
665 * @param mixed int|string|array
684e70d @vrana Search for empty enum
authored
666 * @param string
3f5b683 Reintegrate sqlite branch
jakubvrana authored
667 * @return null
668 */
684e70d @vrana Search for empty enum
authored
669 function enum_input($type, $attrs, $field, $value, $empty = null) {
c068206 @vrana Use $adminer->editVal in enum_input function
authored
670 global $adminer;
3f5b683 Reintegrate sqlite branch
jakubvrana authored
671 preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
6591d48 @vrana Replace isset($var) by $var !== null
authored
672 $return = ($empty !== null ? "<label><input type='$type'$attrs value='$empty'" . ((is_array($value) ? in_array($empty, $value) : $value === 0) ? " checked" : "") . "><i>" . lang('empty') . "</i></label>" : "");
3f5b683 Reintegrate sqlite branch
jakubvrana authored
673 foreach ($matches[1] as $i => $val) {
674 $val = stripcslashes(str_replace("''", "'", $val));
675 $checked = (is_int($value) ? $value == $i+1 : (is_array($value) ? in_array($i+1, $value) : $value === $val));
c068206 @vrana Use $adminer->editVal in enum_input function
authored
676 $return .= " <label><input type='$type'$attrs value='" . ($i+1) . "'" . ($checked ? ' checked' : '') . '>' . h($adminer->editVal($val, $field)) . '</label>';
3f5b683 Reintegrate sqlite branch
jakubvrana authored
677 }
fe06908 @vrana Allow redefining editInput for enum (bug #3048711)
authored
678 return $return;
3f5b683 Reintegrate sqlite branch
jakubvrana authored
679 }
680
9a176b0 Comments
jakubvrana authored
681 /** Print edit input field
682 * @param array one field from fields()
683 * @param mixed
684 * @param string
685 * @return null
686 */
1e4d11e Select from foreign keys in Editor
jakubvrana authored
687 function input($field, $value, $function) {
e672694 @vrana Rename $driver to $jush
authored
688 global $types, $adminer, $jush;
689699a Shortcut for htmlspecialchars
jakubvrana authored
689 $name = h(bracket_escape($field["field"]));
61640ee Move common functions
jakubvrana authored
690 echo "<td class='function'>";
9f69d7a @vrana MS SQL: Do not update AI value
authored
691 $reset = ($jush == "mssql" && $field["auto_increment"]);
692 if ($reset && !$_POST["save"]) {
693 $function = null;
694 }
695 $functions = (isset($_GET["select"]) || $reset ? array("orig" => lang('original')) : array()) + $adminer->editFunctions($field);
454c80f @vrana Save bytes
authored
696 $attrs = " name='fields[$name]'";
61640ee Move common functions
jakubvrana authored
697 if ($field["type"] == "enum") {
fe06908 @vrana Allow redefining editInput for enum (bug #3048711)
authored
698 echo nbsp($functions[""]) . "<td>" . $adminer->editInput($_GET["edit"], $field, $attrs, $value);
61640ee Move common functions
jakubvrana authored
699 } else {
9903946 Use original values in Editor multi edit
jakubvrana authored
700 $first = 0;
701 foreach ($functions as $key => $val) {
702 if ($key === "" || !$val) {
703 break;
704 }
705 $first++;
706 }
f80e15f @vrana Typo
authored
707 $onchange = ($first ? " onchange=\"var f = this.form['function[" . h(js_escape(bracket_escape($field["field"]))) . "]']; if ($first > f.selectedIndex) f.selectedIndex = $first;\"" : "");
454c80f @vrana Save bytes
authored
708 $attrs .= $onchange;
6591d48 @vrana Replace isset($var) by $var !== null
authored
709 echo (count($functions) > 1 ? html_select("function[$name]", $functions, $function === null || in_array($function, $functions) || isset($functions[$function]) ? $function : "", "functionChange(this);") : nbsp(reset($functions))) . '<td>';
a561252 Use distinct name for blob inputs
jakubvrana authored
710 $input = $adminer->editInput($_GET["edit"], $field, $attrs, $value); // usage in call is without a table
7352c28 Replace strlen() by != ""
jakubvrana authored
711 if ($input != "") {
e1abcda Treat tinyint(1) as boolean
jakubvrana authored
712 echo $input;
1e4d11e Select from foreign keys in Editor
jakubvrana authored
713 } elseif ($field["type"] == "set") { //! 64 bits
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
714 preg_match_all("~'((?:[^']|'')*)'~", $field["length"], $matches);
61640ee Move common functions
jakubvrana authored
715 foreach ($matches[1] as $i => $val) {
716 $val = stripcslashes(str_replace("''", "'", $val));
717 $checked = (is_int($value) ? ($value >> $i) & 1 : in_array($val, explode(",", $value), true));
045bce3 @vrana Use editVal for set values
authored
718 echo " <label><input type='checkbox' name='fields[$name][$i]' value='" . (1 << $i) . "'" . ($checked ? ' checked' : '') . "$onchange>" . h($adminer->editVal($val, $field)) . '</label>';
61640ee Move common functions
jakubvrana authored
719 }
5a73c01 @vrana Treat binary type as hex
authored
720 } elseif (ereg('blob|bytea|raw|file', $field["type"]) && ini_bool("file_uploads")) {
a561252 Use distinct name for blob inputs
jakubvrana authored
721 echo "<input type='file' name='fields-$name'$onchange>";
375a5c8 @vrana Non-MySQL binary types
authored
722 } elseif (ereg('text|lob', $field["type"])) {
7d152fb @vrana Utilize bodyKeydown function
authored
723 echo "<textarea " . ($jush != "sqlite" || ereg("\n", $value) ? "cols='50' rows='12'" : "cols='30' rows='1' style='height: 1.2em;'") . "$attrs>" . h($value) . '</textarea>'; // 1.2em - line-height
61640ee Move common functions
jakubvrana authored
724 } else {
725 // int(3) is only a display hint
5002b89 @vrana Big numbers without E
authored
726 $maxlength = (!ereg('int', $field["type"]) && preg_match('~^(\\d+)(,(\\d+))?$~', $field["length"], $match) ? ((ereg("binary", $field["type"]) ? 2 : 1) * $match[1] + ($match[3] ? 1 : 0) + ($match[2] && !$field["unsigned"] ? 1 : 0)) : ($types[$field["type"]] ? $types[$field["type"]] + ($field["unsigned"] ? 0 : 1) : 0));
5a73c01 @vrana Treat binary type as hex
authored
727 echo "<input value='" . h($value) . "'" . ($maxlength ? " maxlength='$maxlength'" : "") . (ereg('char|binary', $field["type"]) && $maxlength > 20 ? " size='40'" : "") . "$attrs>";
61640ee Move common functions
jakubvrana authored
728 }
729 }
730 }
731
9a176b0 Comments
jakubvrana authored
732 /** Process edit input field
733 * @param one field from fields()
734 * @return string
735 */
a0def47 Date localization
jakubvrana authored
736 function process_input($field) {
7e644b4 @vrana Save bytes ($connection->quote shortcut)
authored
737 global $adminer;
a0def47 Date localization
jakubvrana authored
738 $idf = bracket_escape($field["field"]);
61640ee Move common functions
jakubvrana authored
739 $function = $_POST["function"][$idf];
740 $value = $_POST["fields"][$idf];
3f5b683 Reintegrate sqlite branch
jakubvrana authored
741 if ($field["type"] == "enum") {
742 if ($value == -1) {
743 return false;
744 }
745 if ($value == "") {
746 return "NULL";
747 }
04eccba @vrana Allow bigger numbers under 32 bits
authored
748 return +$value;
3f5b683 Reintegrate sqlite branch
jakubvrana authored
749 }
750 if ($field["auto_increment"] && $value == "") {
751 return null;
752 }
753 if ($function == "orig") {
c0c21d4 @vrana Preserve original timestamp value in multiple update (bug #3312614)
authored
754 return ($field["on_update"] == "CURRENT_TIMESTAMP" ? idf_escape($field["field"]) : false);
3f5b683 Reintegrate sqlite branch
jakubvrana authored
755 }
756 if ($function == "NULL") {
61640ee Move common functions
jakubvrana authored
757 return "NULL";
3f5b683 Reintegrate sqlite branch
jakubvrana authored
758 }
759 if ($field["type"] == "set") {
4cead56 Edit default values directly in table creation
jakubvrana authored
760 return array_sum((array) $value);
3f5b683 Reintegrate sqlite branch
jakubvrana authored
761 }
5a73c01 @vrana Treat binary type as hex
authored
762 if (ereg('blob|bytea|raw|file', $field["type"]) && ini_bool("file_uploads")) {
a561252 Use distinct name for blob inputs
jakubvrana authored
763 $file = get_file("fields-$idf");
61640ee Move common functions
jakubvrana authored
764 if (!is_string($file)) {
765 return false; //! report errors
766 }
7e644b4 @vrana Save bytes ($connection->quote shortcut)
authored
767 return q($file);
61640ee Move common functions
jakubvrana authored
768 }
3f5b683 Reintegrate sqlite branch
jakubvrana authored
769 return $adminer->processInput($field, $value, $function);
61640ee Move common functions
jakubvrana authored
770 }
771
db07325 Search in all tables
jakubvrana authored
772 /** Print results of search in all tables
773 * @uses $_GET["where"][0]
774 * @uses $_POST["tables"]
775 * @return null
776 */
777 function search_tables() {
778 global $adminer, $connection;
dfa6cbf @vrana Show tables overview in Editor
authored
779 $_GET["where"][0]["op"] = "LIKE %%";
780 $_GET["where"][0]["val"] = $_POST["query"];
db07325 Search in all tables
jakubvrana authored
781 $found = false;
782 foreach (table_status() as $table => $table_status) {
783 $name = $adminer->tableName($table_status);
784 if (isset($table_status["Engine"]) && $name != "" && (!$_POST["tables"] || in_array($table, $_POST["tables"]))) {
ee3e045 @vrana Separate $where in limit function
authored
785 $result = $connection->query("SELECT" . limit("1 FROM " . table($table), " WHERE " . implode(" AND ", $adminer->selectSearchProcess(fields($table), array())), 1));
782921b @vrana Finish SQLite
authored
786 if ($result->fetch_row()) {
db07325 Search in all tables
jakubvrana authored
787 if (!$found) {
788 echo "<ul>\n";
789 $found = true;
790 }
5ee1407 @vrana Avoid double escaping
authored
791 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"])) . "'>$name</a>\n";
db07325 Search in all tables
jakubvrana authored
792 }
793 }
794 }
795 echo ($found ? "</ul>" : "<p class='message'>" . lang('No tables.')) . "\n";
796 }
797
8ab6fff @vrana Centralize dump_headers
authored
798 /** Send headers for export
799 * @param string
800 * @param bool
801 * @return string extension
802 */
803 function dump_headers($identifier, $multi_table = false) {
804 global $adminer;
805 $return = $adminer->dumpHeaders($identifier, $multi_table);
b78b0cd @vrana Plugin for including date in export filename
authored
806 $output = $_POST["output"];
807 if ($output != "text") {
808 header("Content-Disposition: attachment; filename=" . $adminer->dumpFilename($identifier) . ".$return" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : ""));
809 }
8ab6fff @vrana Centralize dump_headers
authored
810 session_write_close();
811 return $return;
812 }
813
9a176b0 Comments
jakubvrana authored
814 /** Print CSV row
815 * @param array
816 * @return null
817 */
61640ee Move common functions
jakubvrana authored
818 function dump_csv($row) {
819 foreach ($row as $key => $val) {
e225d22 @vrana TSV export and import (bug #3097657)
authored
820 if (preg_match("~[\"\n,;\t]~", $val) || $val === "") {
61640ee Move common functions
jakubvrana authored
821 $row[$key] = '"' . str_replace('"', '""', $val) . '"';
822 }
823 }
02d6b90 @vrana CR+LF in CSV export
authored
824 echo implode(($_POST["format"] == "csv" ? "," : ($_POST["format"] == "tsv" ? "\t" : ";")), $row) . "\r\n";
61640ee Move common functions
jakubvrana authored
825 }
c16c57b E-mail sending
jakubvrana authored
826
9a176b0 Comments
jakubvrana authored
827 /** Apply SQL function
828 * @param string
829 * @param string escaped column identifier
830 * @return string
831 */
e331067 Move apply_sql_function
jakubvrana authored
832 function apply_sql_function($function, $column) {
3f5b683 Reintegrate sqlite branch
jakubvrana authored
833 return ($function ? ($function == "unixepoch" ? "DATETIME($column, '$function')" : ($function == "count distinct" ? "COUNT(DISTINCT " : strtoupper("$function(")) . "$column)") : $column);
e331067 Move apply_sql_function
jakubvrana authored
834 }
835
4ba2d85 @vrana Allow permanent login without customization
authored
836 /** Read password from file adminer.key in temporary directory or create one
837 * @return string or false if the file can not be created
838 */
839 function password_file() {
840 $dir = ini_get("upload_tmp_dir"); // session_save_path() may contain other storage path
841 if (!$dir) {
842 if (function_exists('sys_get_temp_dir')) {
843 $dir = sys_get_temp_dir();
844 } else {
845 $filename = @tempnam("", ""); // @ - temp directory can be disabled by open_basedir
846 if (!$filename) {
847 return false;
848 }
849 $dir = dirname($filename);
850 unlink($filename);
851 }
852 }
853 $filename = "$dir/adminer.key";
854 $return = @file_get_contents($filename); // @ - can not exist
855 if ($return) {
856 return $return;
857 }
858 $fp = @fopen($filename, "w"); // @ - can have insufficient rights //! is not atomic
859 if ($fp) {
860 $return = md5(uniqid(mt_rand(), true));
861 fwrite($fp, $return);
862 fclose($fp);
863 }
864 return $return;
865 }
866
9a176b0 Comments
jakubvrana authored
867 /** Check whether the string is e-mail address
868 * @param string
869 * @return bool
870 */
1cf374b @vrana Rename functions (avoid conflict with WordPress)
authored
871 function is_mail($email) {
c16c57b E-mail sending
jakubvrana authored
872 $atom = '[-a-z0-9!#$%&\'*+/=?^_`{|}~]'; // characters of local-name
873 $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component
28e1dd2 Allow multiple e-mails
jakubvrana authored
874 $pattern = "$atom+(\\.$atom+)*@($domain?\\.)+$domain";
875 return preg_match("(^$pattern(,\\s*$pattern)*\$)i", $email);
c16c57b E-mail sending
jakubvrana authored
876 }
dc667ea Hide select export and import
jakubvrana authored
877
bc78866 Link URLs in select
jakubvrana authored
878 /** Check whether the string is URL address
879 * @param string
2cec758 @vrana Direct links from HTTPS to HTTP
authored
880 * @return string "http", "https" or ""
bc78866 Link URLs in select
jakubvrana authored
881 */
882 function is_url($string) {
2cec758 @vrana Direct links from HTTPS to HTTP
authored
883 $domain = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])'; // one domain component //! IDN
5002b89 @vrana Big numbers without E
authored
884 return (preg_match("~^(https?)://($domain?\\.)+$domain(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i", $string, $match) ? strtolower($match[1]) : ""); //! restrict path, query and fragment characters
bc78866 Link URLs in select
jakubvrana authored
885 }
Something went wrong with that request. Please try again.