From 7b6664f0f7a4a4756f86cbb2b96e7d54a36f92ad Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 10 Aug 2017 12:38:32 +0000 Subject: [PATCH] Improved parameter handling --- include/dba.php | 53 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/include/dba.php b/include/dba.php index 5e2e4b419a..dd95a74c53 100644 --- a/include/dba.php +++ b/include/dba.php @@ -509,6 +509,22 @@ class dba { return $sql; } + /** + * @brief Convert parameter array to an universal form + * @param array $args Parameter array + * @return array universalized parameter array + */ + private static function getParam($args) { + unset($args[0]); + + // When the second function parameter is an array then use this as the parameter array + if ((count($args) > 0) && (is_array($args[1]))) { + return $args[1]; + } else { + return $args; + } + } + /** * @brief Executes a prepared statement that returns data * @usage Example: $r = p("SELECT * FROM `item` WHERE `guid` = ?", $guid); @@ -520,15 +536,7 @@ class dba { $stamp1 = microtime(true); - $args = func_get_args(); - unset($args[0]); - - // When the second function parameter is an array then use this as the parameter array - if ((count($args) > 0) && (is_array($args[1]))) { - $params = $args[1]; - } else { - $params = $args; - } + $params = self::getParam(func_get_args()); // Renumber the array keys to be sure that they fit $i = 0; @@ -560,10 +568,10 @@ class dba { self::$dbo->affected_rows = 0; // We have to make some things different if this function is called from "e" - $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); - if (isset($trace[2])) { - $called_from = $trace[2]; + if (isset($trace[1])) { + $called_from = $trace[1]; } else { // We use just something that is defined to avoid warnings $called_from = $trace[0]; @@ -719,13 +727,13 @@ class dba { $stamp = microtime(true); - $args = func_get_args(); + $params = self::getParam(func_get_args()); // In a case of a deadlock we are repeating the query 20 times $timeout = 20; do { - $stmt = call_user_func_array('self::p', $args); + $stmt = self::p($sql, $params); if (is_bool($stmt)) { $retval = $stmt; @@ -744,15 +752,6 @@ class dba { $error = self::$dbo->error; $errorno = self::$dbo->errorno; - array_shift($args); - - // When the second function parameter is an array then use this as the parameter array - if ((count($args) > 0) && (is_array($args[0]))) { - $params = $args[0]; - } else { - $params = $args; - } - logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n". $a->callstack(8)."\n".self::replace_parameters($sql, $params)); @@ -772,9 +771,9 @@ class dba { * @return boolean Are there rows for that query? */ static public function exists($sql) { - $args = func_get_args(); + $params = self::getParam(func_get_args()); - $stmt = call_user_func_array('self::p', $args); + $stmt = self::p($sql, $params); if (is_bool($stmt)) { $retval = $stmt; @@ -794,9 +793,9 @@ class dba { * @return array first row of query */ static public function fetch_first($sql) { - $args = func_get_args(); + $params = self::getParam(func_get_args()); - $stmt = call_user_func_array('self::p', $args); + $stmt = self::p($sql, $params); if (is_bool($stmt)) { $retval = $stmt;