+ public static function connected() {
+ $connected = false;
+
+ switch (self::$driver) {
+ case 'pdo':
+ $r = dba::p("SELECT 1");
+ if (DBM::is_result($r)) {
+ $row = dba::inArray($r);
+ $connected = ($row[0]['1'] == '1');
+ }
+ break;
+ case 'mysqli':
+ $connected = self::$db->ping();
+ break;
+ }
+ return $connected;
+ }
+
+ /**
+ * @brief Replaces ANY_VALUE() function by MIN() function,
+ * if the database server does not support ANY_VALUE().
+ *
+ * Considerations for Standard SQL, or MySQL with ONLY_FULL_GROUP_BY (default since 5.7.5).
+ * ANY_VALUE() is available from MySQL 5.7.5 https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html
+ * A standard fall-back is to use MIN().
+ *
+ * @param string $sql An SQL string without the values
+ * @return string The input SQL string modified if necessary.
+ */
+ public static function any_value_fallback($sql) {
+ $server_info = self::server_info();
+ if (version_compare($server_info, '5.7.5', '<') ||
+ (stripos($server_info, 'MariaDB') !== false)) {
+ $sql = str_ireplace('ANY_VALUE(', 'MIN(', $sql);
+ }
+ return $sql;
+ }
+
+ /**
+ * @brief beautifies the query - useful for "SHOW PROCESSLIST"
+ *
+ * This is safe when we bind the parameters later.
+ * The parameter values aren't part of the SQL.
+ *
+ * @param string $sql An SQL string without the values
+ * @return string The input SQL string modified if necessary.
+ */
+ public static function clean_query($sql) {
+ $search = array("\t", "\n", "\r", " ");
+ $replace = array(' ', ' ', ' ', ' ');
+ do {
+ $oldsql = $sql;
+ $sql = str_replace($search, $replace, $sql);
+ } while ($oldsql != $sql);
+
+ return $sql;
+ }
+
+
+ /**
+ * @brief Replaces the ? placeholders with the parameters in the $args array
+ *
+ * @param string $sql SQL query
+ * @param array $args The parameters that are to replace the ? placeholders
+ * @return string The replaced SQL query
+ */
+ private static function replace_parameters($sql, $args) {
+ $offset = 0;
+ foreach ($args AS $param => $value) {
+ if (is_int($args[$param]) || is_float($args[$param])) {
+ $replace = intval($args[$param]);
+ } else {
+ $replace = "'".self::escape($args[$param])."'";
+ }
+
+ $pos = strpos($sql, '?', $offset);
+ if ($pos !== false) {
+ $sql = substr_replace($sql, $replace, $pos, 1);
+ }
+ $offset = $pos + strlen($replace);