$v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = ($filter ? $v : stripslashes($v)); } } } } } /** Escape or unescape string to use inside form [] * @param string * @param bool * @return string */ function bracket_escape($idf, $back = false) { // escape brackets inside name="x[]" static $trans = array(':' => ':1', ']' => ':2', '[' => ':3', '"' => ':4'); return strtr($idf, ($back ? array_flip($trans) : $trans)); } /** Check if connection has at least the given version * @param string required version * @param string required MariaDB version * @param Min_DB defaults to $connection * @return bool */ function min_version($version, $maria_db = "", $connection2 = null) { global $connection; if (!$connection2) { $connection2 = $connection; } $server_info = $connection2->server_info; if ($maria_db && preg_match('~([\d.]+)-MariaDB~', $server_info, $match)) { $server_info = $match[1]; $version = $maria_db; } return (version_compare($server_info, $version) >= 0); } /** Get connection charset * @param Min_DB * @return string */ function charset($connection) { return (min_version("5.5.3", 0, $connection) ? "utf8mb4" : "utf8"); // SHOW CHARSET would require an extra query } /** Return $trailing"; } /** Return \n"; } /** Get a nonce="" attribute with CSP nonce * @return string */ function nonce() { return ' nonce="' . get_nonce() . '"'; } /** Get a target="_blank" attribute * @return string */ function target_blank() { return ' target="_blank" rel="noreferrer noopener"'; } /** Escape for HTML * @param string * @return string */ function h($string) { return str_replace("\0", "�", htmlspecialchars($string, ENT_QUOTES, 'utf-8')); } /** Convert \n to
* @param string * @return string */ function nl_br($string) { return str_replace("\n", "
", $string); // nl2br() uses XHTML before PHP 5.3 } /** Generate HTML checkbox * @param string * @param string * @param bool * @param string * @param string * @param string * @param string * @return string */ function checkbox($name, $value, $checked, $label = "", $onclick = "", $class = "", $labelled_by = "") { $return = "" . ($onclick ? script("qsl('input').onclick = function () { $onclick };", "") : "") ; return ($label != "" || $class ? "$return" . h($label) . "" : $return); } /** Generate list of HTML options * @param array array of strings or arrays (creates optgroup) * @param mixed * @param bool always use array keys for value="", otherwise only string keys are used * @return string */ function optionlist($options, $selected = null, $use_keys = false) { $return = ""; foreach ($options as $k => $v) { $opts = array($k => $v); if (is_array($v)) { $return .= ''; $opts = $v; } foreach ($opts as $key => $val) { $return .= '' . h($val); } if (is_array($v)) { $return .= ''; } } return $return; } /** Generate HTML radio list * @param string * @param array * @param string * @param string true for no onchange, false for radio * @param string * @return string */ function html_select($name, $options, $value = "", $onchange = true, $labelled_by = "") { if ($onchange) { return "" . (is_string($onchange) ? script("qsl('select').onchange = function () { $onchange };", "") : "") ; } $return = ""; foreach ($options as $key => $val) { $return .= ""; } return $return; } /** Generate HTML if $options are empty * @param string * @param array * @param string * @param string * @param string * @return string */ function select_input($attrs, $options, $value = "", $onchange = "", $placeholder = "") { $tag = ($options ? "select" : "input"); return "<$tag$attrs" . ($options ? ">