+ // We use just something that is defined to avoid warnings
+ $called_from = $trace[0];
+ }
+ // We are having an own error logging in the function "e"
+ $called_from_e = ($called_from['function'] == 'e');
+
+ switch (self::$driver) {
+ case 'pdo':
+ // If there are no arguments we use "query"
+ if (count($args) == 0) {
+ if (!$retval = self::$db->query($sql)) {
+ $errorInfo = self::$db->errorInfo();
+ self::$error = $errorInfo[2];
+ self::$errorno = $errorInfo[1];
+ $retval = false;
+ break;
+ }
+ self::$affected_rows = $retval->rowCount();
+ break;
+ }
+
+ if (!$stmt = self::$db->prepare($sql)) {
+ $errorInfo = self::$db->errorInfo();
+ self::$error = $errorInfo[2];
+ self::$errorno = $errorInfo[1];
+ $retval = false;
+ break;
+ }
+
+ foreach ($args AS $param => $value) {
+ $stmt->bindParam($param, $args[$param]);
+ }
+
+ if (!$stmt->execute()) {
+ $errorInfo = $stmt->errorInfo();
+ self::$error = $errorInfo[2];
+ self::$errorno = $errorInfo[1];
+ $retval = false;
+ } else {
+ $retval = $stmt;
+ self::$affected_rows = $retval->rowCount();
+ }
+ break;
+ case 'mysqli':
+ // There are SQL statements that cannot be executed with a prepared statement
+ $parts = explode(' ', $orig_sql);
+ $command = strtolower($parts[0]);
+ $can_be_prepared = in_array($command, array('select', 'update', 'insert', 'delete'));
+
+ // The fallback routine is called as well when there are no arguments
+ if (!$can_be_prepared || (count($args) == 0)) {
+ $retval = self::$db->query(self::replace_parameters($sql, $args));
+ if (self::$db->errno) {
+ self::$error = self::$db->error;
+ self::$errorno = self::$db->errno;
+ $retval = false;
+ } else {
+ if (isset($retval->num_rows)) {
+ self::$affected_rows = $retval->num_rows;
+ } else {
+ self::$affected_rows = self::$db->affected_rows;
+ }
+ }
+ break;
+ }
+
+ $stmt = self::$db->stmt_init();
+
+ if (!$stmt->prepare($sql)) {
+ self::$error = $stmt->error;
+ self::$errorno = $stmt->errno;
+ $retval = false;
+ break;
+ }
+
+ $params = '';
+ $values = array();
+ foreach ($args AS $param => $value) {
+ if (is_int($args[$param])) {
+ $params .= 'i';
+ } elseif (is_float($args[$param])) {
+ $params .= 'd';
+ } elseif (is_string($args[$param])) {
+ $params .= 's';
+ } else {
+ $params .= 'b';
+ }
+ $values[] = &$args[$param];
+ }
+
+ if (count($values) > 0) {
+ array_unshift($values, $params);
+ call_user_func_array(array($stmt, 'bind_param'), $values);
+ }
+
+ if (!$stmt->execute()) {
+ self::$error = self::$db->error;
+ self::$errorno = self::$db->errno;
+ $retval = false;
+ } else {
+ $stmt->store_result();
+ $retval = $stmt;
+ self::$affected_rows = $retval->affected_rows;
+ }
+ break;