diff --git a/pinc/CharSuites.inc b/pinc/CharSuites.inc index ac6364501..eae5173c0 100644 --- a/pinc/CharSuites.inc +++ b/pinc/CharSuites.inc @@ -88,11 +88,8 @@ class CharSuite } // If we don't recognize the property, raise a notice and return null - $trace = debug_backtrace(); trigger_error( - 'Undefined property via __get(): ' . $name . - ' in ' . $trace[0]['file'] . - ' on line ' . $trace[0]['line'], + "Undefined property via __get(): $name " . get_backtrace_loc(), E_USER_NOTICE ); return null; @@ -105,11 +102,8 @@ class CharSuite $this->_pickerset->name = $this->name; } else { // If we don't recognize the property, raise a notice - $trace = debug_backtrace(); trigger_error( - 'Undefined property via __get(): ' . $name . - ' in ' . $trace[0]['file'] . - ' on line ' . $trace[0]['line'], + "Undefined property via __set(): $name " . get_backtrace_loc(), E_USER_NOTICE ); } diff --git a/pinc/DPDatabase.inc b/pinc/DPDatabase.inc index 639d4ac75..b69917b29 100644 --- a/pinc/DPDatabase.inc +++ b/pinc/DPDatabase.inc @@ -123,10 +123,9 @@ final class DPDatabase { // Log the SQL error to the PHP error log and return a generic error // for display to the user - $backtrace = debug_backtrace(); - $caller = $backtrace[$backtrace_level]['file'] . ":" . $backtrace[$backtrace_level]['line']; + $from_caller = get_backtrace_loc($backtrace_level + 1); $error = str_replace("\n", "\\n", mysqli_error(DPDatabase::get_connection())); - error_log("DPDatabase.inc - log_error from $caller: $error"); + error_log("DPDatabase.inc - log_error $from_caller: $error"); return _("An error occurred during a database query and has been logged."); } @@ -196,13 +195,11 @@ final class DPDatabase } try { - $backtrace = debug_backtrace(); - $caller = $backtrace[1]['file'] . ":" . $backtrace[1]['line']; $message = sprintf( "%s %s %s\n", date("c"), - $caller, + get_backtrace_loc(depth: 2), preg_replace("/\s+/", " ", $sql) ); $fp = fopen(DPDatabase::$tracing_log, 'a'); diff --git a/pinc/Project.inc b/pinc/Project.inc index d844c8848..121282138 100644 --- a/pinc/Project.inc +++ b/pinc/Project.inc @@ -731,11 +731,8 @@ class Project } // If we don't recognize the property, raise a notice and return null - $trace = debug_backtrace(); trigger_error( - 'Undefined property via __get(): ' . $name . - ' in ' . $trace[0]['file'] . - ' on line ' . $trace[0]['line'], + "Undefined property via __get(): $name " . get_backtrace_loc(), E_USER_NOTICE ); return null; diff --git a/pinc/misc.inc b/pinc/misc.inc index a6913d964..e2cdd3085 100644 --- a/pinc/misc.inc +++ b/pinc/misc.inc @@ -1664,6 +1664,26 @@ function validate_csrf_token(): void } } +/** + * @param int $depth + * How deep in the call stack to get the location. 0 is the caller + * of `get_backtrace_loc`, 1 is the caller of that function, etc + * @return string + * Returns a trace location like "in foo.php on line 742" + * Omits the file name or linenumber clauses if they can't be found + */ +function get_backtrace_loc(int $depth = 1): string +{ + $trace = debug_backtrace(); + $loc = []; + if (($file = $trace[$depth]["file"] ?? "")) { + $loc[] = "in $file"; + } + if (($line = $trace[$depth]["line"] ?? "")) { + $loc[] = "on line $line"; + } + return join(" ", $loc); +} // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX