diff --git a/src/ACL/Login.php b/src/ACL/Login.php index c4126be..92a8702 100644 --- a/src/ACL/Login.php +++ b/src/ACL/Login.php @@ -1608,7 +1608,7 @@ class Login // TODO: submit or JS to set target page as ajax call // NOTE: for the HTML block I ignore line lengths // phpcs:disable - $this->login_template['password_change'] = <<login_template['password_change'] = << @@ -1626,7 +1626,7 @@ class Login

{TITLE_PASSWORD_CHANGE}

{PASSWORD_CHANGE_SHOW} -EOM; +HTML; // phpcs:enable } if ($this->password_forgot) { @@ -1650,7 +1650,7 @@ EOM; // now check templates // TODO: submit or JS to set target page as ajax call if (!$this->login_template['template']) { - $this->login_template['template'] = <<login_template['template'] = << @@ -1712,7 +1712,7 @@ h3 { font-size: 18px; } -EOM; +HTML; } } diff --git a/src/DB/IO.php b/src/DB/IO.php index f637aa7..6d0f1e5 100644 --- a/src/DB/IO.php +++ b/src/DB/IO.php @@ -735,7 +735,10 @@ class IO */ private function __dbErrorPreprocessor(\PgSql\Result|false $cursor = false): array { - $pg_error_string = ''; + $db_prefix = ''; + $db_error_string = ''; + $db_prefix_last = ''; + $db_error_string_last = ''; // 1 = self/__dbErrorPreprocessor, 2 = __dbError, __dbWarning, // 3+ == actual source // loop until we get a null, build where called chain @@ -749,16 +752,31 @@ class IO if ($where_called === null) { $where_called = '[Unknown Method]'; } + [$db_prefix_last, $db_error_string_last] = $this->db_functions->__dbPrintLastError(); if ($cursor !== false) { - $pg_error_string = $this->db_functions->__dbPrintError($cursor); + [$db_prefix, $db_error_string] = $this->db_functions->__dbPrintError($cursor); } if ($cursor === false && method_exists($this->db_functions, '__dbPrintError')) { - $pg_error_string = $this->db_functions->__dbPrintError(); + [$db_prefix, $db_error_string] = $this->db_functions->__dbPrintError(); } - if ($pg_error_string) { - $this->__dbDebug('db', $pg_error_string, 'DB_ERROR', $where_called); + // prefix the master if not the same + if ( + !empty($db_error_string_last) && + trim($db_error_string) != trim($db_error_string_last) + ) { + $db_error_string = + $db_prefix_last . ' ' . $db_error_string_last . ';' + . $db_prefix . ' ' . $db_error_string; + } elseif (!empty($db_error_string)) { + $db_error_string = $db_prefix . ' ' . $db_error_string; } - return [$where_called, $pg_error_string]; + if ($db_error_string) { + $this->__dbDebug('db', $db_error_string, 'DB_ERROR', $where_called); + } + return [ + $where_called, + $db_error_string + ]; } /** @@ -902,11 +920,14 @@ class IO // because the placeholders start with $ and at 1, // we need to increase each key and prefix it with a $ char for ($i = 0, $iMax = count($keys); $i < $iMax; $i++) { - $keys[$i] = '$' . ($keys[$i] + 1); + // note: if I use $ here, the str_replace will + // replace it again. eg $11 '$1'1would be replaced with $1 again // prefix data set with parameter pos - $data[$i] = $keys[$i] . ':' . ($data[$i] === null ? + $data[$i] = '#' . ($keys[$i] + 1) . ':' . ($data[$i] === null ? '"NULL"' : (string)$data[$i] ); + // search part + $keys[$i] = '$' . ($keys[$i] + 1); } // simply replace the $1, $2, ... with the actual data and return it return str_replace( diff --git a/src/DB/SQL/Interface/SqlFunctions.php b/src/DB/SQL/Interface/SqlFunctions.php index 5aa7fdb..7e81a16 100644 --- a/src/DB/SQL/Interface/SqlFunctions.php +++ b/src/DB/SQL/Interface/SqlFunctions.php @@ -209,10 +209,17 @@ interface SqlFunctions /** * Undocumented function * - * @param \PgSql\Result|false $cursor - * @return string + * @return array{0:string,1:string} */ - public function __dbPrintError(\PgSql\Result|false $cursor = false): string; + public function __dbPrintLastError(): array; + + /** + * Undocumented function + * + * @param \PgSql\Result|false $cursor + * @return array{0:string,1:string} + */ + public function __dbPrintError(\PgSql\Result|false $cursor = false): array; /** * Undocumented function diff --git a/src/DB/SQL/PgSQL.php b/src/DB/SQL/PgSQL.php index 9f42f76..2d9b34e 100644 --- a/src/DB/SQL/PgSQL.php +++ b/src/DB/SQL/PgSQL.php @@ -61,7 +61,7 @@ class PgSQL implements Interface\SqlFunctions /** @var string */ private $last_error_query; /** @var \PgSql\Connection|false */ - private $dbh; + private $dbh = false; /** * queries last error query and returns true or false if error was set @@ -532,18 +532,37 @@ class PgSQL implements Interface\SqlFunctions return $this->dbh; } + /** + * Returns last error for active cursor + * + * @return array{0:string,1:string} prefix, error string + */ + public function __dbPrintLastError(): array + { + if (is_bool($this->dbh)) { + return ['', '']; + } + if (!empty($error_message = pg_last_error($this->dbh))) { + return [ + '-PostgreSQL-Error-Last-', + $error_message + ]; + } + return ['', '']; + } + /** * reads the last error for this cursor and returns * html formatted string with error name * * @param \PgSql\Result|false $cursor cursor - * or null - * @return string error string + * or null + * @return array{0:string,1:string} prefix, error string */ - public function __dbPrintError(\PgSql\Result|false $cursor = false): string + public function __dbPrintError(\PgSql\Result|false $cursor = false): array { if (is_bool($this->dbh)) { - return ''; + return ['', '']; } // run the query again for the error result here if ((is_bool($cursor)) && $this->last_error_query) { @@ -552,10 +571,12 @@ class PgSQL implements Interface\SqlFunctions $cursor = pg_get_result($this->dbh); } if ($cursor && $error_str = pg_result_error($cursor)) { - return '-PostgreSQL-Error- ' - . $error_str; + return [ + '-PostgreSQL-Error-', + $error_str + ]; } else { - return ''; + return ['', '']; } } diff --git a/test/phpunit/DB/CoreLibsDBIOTest.php b/test/phpunit/DB/CoreLibsDBIOTest.php index 0ee6e87..20e90fd 100644 --- a/test/phpunit/DB/CoreLibsDBIOTest.php +++ b/test/phpunit/DB/CoreLibsDBIOTest.php @@ -156,7 +156,7 @@ final class CoreLibsDBIOTest extends TestCase $db->dbExec("DROP TABLE test_meta"); } // uid is for internal reference tests - $base_table = <<dbExec( // primary key name is table + '_id' - <<dbExec( - <<dbExec( - << false, 'array dims' => 0, 'is enum' => false, - 'is base' => 1, + 'is base' => true, 'is composite' => false, - 'is pesudo' => false, 'description' => '', + 'is pseudo' => false ], 'row_2' => [ 'num' => 2, @@ -1355,10 +1355,10 @@ final class CoreLibsDBIOTest extends TestCase 'has default' => false, 'array dims' => 0, 'is enum' => false, - 'is base' => 1, + 'is base' => true, 'is composite' => false, - 'is pesudo' => false, 'description' => '', + 'is pseudo' => false ] ] ], @@ -1374,10 +1374,10 @@ final class CoreLibsDBIOTest extends TestCase 'has default' => false, 'array dims' => 0, 'is enum' => false, - 'is base' => 1, + 'is base' => true, 'is composite' => false, - 'is pesudo' => false, 'description' => '', + 'is pseudo' => false ], 'row_2' => [ 'num' => 2, @@ -1387,10 +1387,10 @@ final class CoreLibsDBIOTest extends TestCase 'has default' => false, 'array dims' => 0, 'is enum' => false, - 'is base' => 1, + 'is base' => true, 'is composite' => false, - 'is pesudo' => false, 'description' => '', + 'is pseudo' => false ] ] ], @@ -4425,16 +4425,16 @@ final class CoreLibsDBIOTest extends TestCase ] ] ], - // same but as EOM - 'single insert (PK), EOM string' => [ - << [ + << [ - << [ + <<