diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 177d178b..0447e953 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -505,7 +505,7 @@ if (!defined('Adminer\DRIVER')) { /** Get database collation * @param string - * @param list[] result of collations() + * @param string[][] result of collations() * @return string */ function db_collation($db, $collations) { @@ -705,7 +705,7 @@ if (!defined('Adminer\DRIVER')) { } /** Get sorted grouped list of collations - * @return list[] + * @return string[][] */ function collations() { $return = array(); @@ -743,7 +743,7 @@ if (!defined('Adminer\DRIVER')) { /** Create database * @param string * @param string - * @return string + * @return Result */ function create_database($db, $collation) { return queries("CREATE DATABASE " . idf_escape($db) . ($collation ? " COLLATE " . q($collation) : "")); @@ -813,7 +813,7 @@ if (!defined('Adminer\DRIVER')) { * @param string * @param string number * @param string - * @return bool + * @return Result|bool */ function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) { global $connection; @@ -852,7 +852,7 @@ if (!defined('Adminer\DRIVER')) { /** Run commands to alter indexes * @param string escaped table name * @param array{string, string, 'DROP'|list} of ["index type", "name", ["column definition", ...]] or ["index type", "name", "DROP"] - * @return bool + * @return Result|bool */ function alter_indexes($table, $alter) { foreach ($alter as $key => $val) { @@ -874,7 +874,7 @@ if (!defined('Adminer\DRIVER')) { /** Drop views * @param list - * @return bool + * @return Result|bool */ function drop_views($views) { return queries("DROP VIEW " . implode(", ", array_map('Adminer\table', $views))); @@ -882,7 +882,7 @@ if (!defined('Adminer\DRIVER')) { /** Drop tables * @param list - * @return bool + * @return Result|bool */ function drop_tables($tables) { return queries("DROP TABLE " . implode(", ", array_map('Adminer\table', $tables))); @@ -1014,7 +1014,7 @@ if (!defined('Adminer\DRIVER')) { "type" => strtolower($param[5]), "length" => preg_replace_callback("~$enum~s", 'Adminer\normalize_enum', $param[6]), "unsigned" => strtolower(preg_replace('~\s+~', ' ', trim("$param[8] $param[7]"))), - "null" => 1, + "null" => true, "full_type" => $param[4], "inout" => strtoupper($param[1]), "collation" => strtolower($param[9]), @@ -1073,7 +1073,7 @@ if (!defined('Adminer\DRIVER')) { /** Get approximate number of rows * @param TableStatus * @param list - * @return int or null if approximate number can't be retrieved + * @return numeric-string|void null if approximate number can't be retrieved */ function found_rows($table_status, $where) { return ($where || $table_status["Engine"] != "InnoDB" ? null : $table_status["Rows"]); @@ -1222,7 +1222,7 @@ if (!defined('Adminer\DRIVER')) { /** Kill a process * @param int - * @return bool + * @return Result|bool */ function kill_process($val) { return queries("KILL " . number($val)); @@ -1236,7 +1236,7 @@ if (!defined('Adminer\DRIVER')) { } /** Get maximum number of connections - * @return int + * @return numeric-string */ function max_connections() { return get_val("SELECT @@max_connections"); diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index be4293af..82e7166f 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -789,7 +789,6 @@ ORDER BY SPECIFIC_NAME'); if (preg_match("~ rows=([0-9]+)~", get_val("EXPLAIN SELECT * FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : "")), $regs)) { return $regs[1]; } - return false; } function types() { diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 252873b8..bdd6cf58 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -88,7 +88,7 @@ if (isset($_GET["sqlite"])) { } function __destruct() { - return $this->result->finalize(); + $this->result->finalize(); } } diff --git a/adminer/include/driver.inc.php b/adminer/include/driver.inc.php index 2ae93d96..fc3397be 100644 --- a/adminer/include/driver.inc.php +++ b/adminer/include/driver.inc.php @@ -53,7 +53,7 @@ abstract class SqlDriver { } /** Get structured types - * @return list[] [$description => [$type, ...], ...] + * @return list[]|list [$description => [$type, ...], ...] */ function structuredTypes() { return array_map('array_keys', $this->types); @@ -82,7 +82,7 @@ abstract class SqlDriver { * @param int result of $adminer->selectLimitProcess() * @param int index of page starting at zero * @param bool whether to print the query - * @return Result + * @return Result|false */ function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) { global $adminer; @@ -109,7 +109,7 @@ abstract class SqlDriver { * @param string * @param string " WHERE ..." * @param int 0 or 1 - * @return bool + * @return Result|bool */ function delete($table, $queryWhere, $limit = 0) { $query = "FROM " . table($table); @@ -122,7 +122,7 @@ abstract class SqlDriver { * @param string " WHERE ..." * @param int 0 or 1 * @param string - * @return bool + * @return Result|bool */ function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") { $values = array(); @@ -136,7 +136,7 @@ abstract class SqlDriver { /** Insert data into table * @param string * @param string[] escaped columns in keys, quoted data in values - * @return bool + * @return Result|bool */ function insert($table, $set) { return queries("INSERT INTO " . table($table) . ($set @@ -145,7 +145,7 @@ abstract class SqlDriver { ) . $this->insertReturning($table)); } - /** Get RETURNING clause for INSERT queries, PostgreSQL specific + /** Get RETURNING clause for INSERT queries (PostgreSQL specific) * @param string * @return string */ @@ -157,28 +157,28 @@ abstract class SqlDriver { * @param string * @param list of arrays with escaped columns in keys and quoted data in values * @param int[] column names in keys - * @return bool + * @return Result|bool */ function insertUpdate($table, $rows, $primary) { return false; } /** Begin transaction - * @return bool + * @return Result|bool */ function begin() { return queries("BEGIN"); } /** Commit transaction - * @return bool + * @return Result|bool */ function commit() { return queries("COMMIT"); } /** Rollback transaction - * @return bool + * @return Result|bool */ function rollback() { return queries("ROLLBACK"); diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index 78bed1de..9981b43b 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -435,7 +435,7 @@ function normalize_enum($match) { * @param list * @param string * @param string -* @return bool +* @return Result|bool */ function grant($grant, $privileges, $columns, $on) { if (!$privileges) { @@ -502,7 +502,7 @@ function create_trigger($on, $row) { /** Generate SQL query for creating routine * @param string "PROCEDURE" or "FUNCTION" -* @param string[] result of routine() +* @param Routine result of routine() * @return string */ function create_routine($routine, $row) { diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php index db3ca128..002e113f 100644 --- a/adminer/include/functions.inc.php +++ b/adminer/include/functions.inc.php @@ -722,7 +722,7 @@ function table_status1($table, $fast = false) { /** Find out foreign keys for each column * @param string -* @return list[] [$col => []] +* @return list[] [$col => []] */ function column_foreign_keys($table) { global $adminer; @@ -814,7 +814,7 @@ function get_temp_dir() { } else { $filename = @tempnam("", ""); // @ - temp directory can be disabled by open_basedir if (!$filename) { - return false; + return ''; } $return = dirname($filename); unlink($filename); @@ -825,7 +825,7 @@ function get_temp_dir() { /** Open and exclusively lock a file * @param string -* @return resource or null for error +* @return resource|void null for error */ function file_open_lock($filename) { if (is_link($filename)) { @@ -873,7 +873,7 @@ function first($array) { /** Read password from file adminer.key in temporary directory or create one * @param bool -* @return string or false if the file can not be created +* @return string|false false if the file can not be created */ function password_file($create) { $filename = get_temp_dir() . "/adminer.key"; diff --git a/adminer/include/html.inc.php b/adminer/include/html.inc.php index a265a18f..9ef717c0 100644 --- a/adminer/include/html.inc.php +++ b/adminer/include/html.inc.php @@ -344,12 +344,12 @@ function input($field, $value, $function, $autofocus = false) { /** Process edit input field * @param Field one field from fields() -* @return string or false to leave the original value +* @return mixed false to leave the original value */ function process_input($field) { global $adminer, $driver; if (stripos($field["default"], "GENERATED ALWAYS AS ") === 0) { - return null; + return; } $idf = bracket_escape($field["field"]); $function = idx($_POST["function"], $idf); diff --git a/adminer/include/xxtea.inc.php b/adminer/include/xxtea.inc.php index b786623c..4ae13733 100644 --- a/adminer/include/xxtea.inc.php +++ b/adminer/include/xxtea.inc.php @@ -75,7 +75,7 @@ function encrypt_string($str, $key) { /** Decipher * @param string binary cipher * @param string -* @return string plain-text password +* @return string|false plain-text password */ function decrypt_string($str, $key) { if ($str == "") { diff --git a/editor/include/editing.inc.php b/editor/include/editing.inc.php index 6dacd510..b670d735 100644 --- a/editor/include/editing.inc.php +++ b/editor/include/editing.inc.php @@ -15,7 +15,7 @@ function email_header($header) { * @param string * @param string * @param string -* @param array{error?:list, type?:list, name?:list} +* @param array{error?:list, type?:list, name?:list, tmp_name?:list} * @return bool */ function send_mail($email, $subject, $message, $from = "", $files = array()) { diff --git a/phpstan.neon b/phpstan.neon index ad5a02d7..896fb8ff 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,6 +1,13 @@ parameters: - level: 2 + level: 3 ignoreErrors: + # diagnose + - "~Adminer\\\\Db::~" + + # need to fix + - "~^Function Adminer\\\\fields_from_edit\\(\\) should return~" # Mongo and SimpleDB + + # not real problems - identifier: include.fileNotFound # relative includes - identifier: includeOnce.fileNotFound # ./adminer-plugins.php - "~^Function (set_magic_quotes_runtime|mysql_)~" # PHP < 7 functions @@ -8,7 +15,7 @@ parameters: - "~^Variable \\$(adminer|connection|driver|drivers|error|HTTPS|LANG|langs|permanent|has_token|token|translations|VERSION) might not be defined~" # declared in bootstrap.inc.php - "~^Comparison operation \"==\" between \\(array\\|float\\|int\\) and 1~" # false positive - "~OCI-?Lob~" # maybe include stub? - - "~Adminer\\\\Db::~" # diagnose! + paths: - . phpVersion: @@ -16,10 +23,10 @@ parameters: max: 80499 checkMissingCallableSignature: true typeAliases: - TableStatus: "array{Name:string, Engine:string, Comment:string, Oid:int, Rows:int, Collation:string, Auto_increment:int, Data_length:int, Index_length:int, Data_free:int}" - Field: "array{field:string, full_type:string, type:string, length:int, unsigned:string, default:string, null:bool, auto_increment:bool, on_update:string, collation:string, privileges:int[], comment:string, primary:bool, generated:string}" - Index: "array{type:string, columns:list, lengths:list, descs:list}" - ForeignKey: "array{db:string, ns:string, table:string, source:list, target:list, on_delete:string, on_update:string}" - Trigger: "array{Trigger:string, Timing:string, Event:string, Of:string, Type:string, Statement:string}" - Routine: "array{fields:list, comment:string, returns:array, definition:string, language:string}" + TableStatus: "array{Name:string, Engine:string, Comment:string, Oid?:numeric-string, Rows:numeric-string, Collation:string, Auto_increment:numeric-string, Data_length:numeric-string, Index_length:numeric-string, Data_free:numeric-string, Create_options?:string, nspname?:string}" + Field: "array{field:string, full_type:string, type:string, length:numeric-string, unsigned:string, default:?string, null:bool, auto_increment:bool, on_update:string, collation:string, privileges:int[], comment:string, primary:bool, generated:string, orig?:string, on_delete?:string, inout?:string}" + Index: "array{type:string, columns:list, lengths:list, descs:list}" + ForeignKey: "array{db:string, ns?:string, table:string, source:list, target:list, on_delete:string, on_update:string}" + Trigger: "array{Trigger?:string, Timing?:string, Event?:string, Of?:string, Type?:string, Statement?:string}" + Routine: "array{name?:string, fields:list, comment:string, returns?:array, definition:string, language?:string}" BackwardKey: "array{name:string, keys:string[][]}" diff --git a/plugins/drivers/elastic.php b/plugins/drivers/elastic.php index 55f3ff06..7a6f332e 100644 --- a/plugins/drivers/elastic.php +++ b/plugins/drivers/elastic.php @@ -294,7 +294,7 @@ if (isset($_GET["elastic"])) { } } - return $this->conn->affected_rows; + return !!$this->conn->affected_rows; } function convertOperator($operator) { @@ -528,7 +528,6 @@ if (isset($_GET["elastic"])) { } function found_rows($table_status, $where) { - return null; } /** Alter type