MySQL CREATE/DROP 用户 returns 0

MySQL CREATE/DROP USER returns 0

为什么

$dbh->exec(CREATE USER 'usr'@'localhost' IDENTIFIED BY 'Pass100');

returns 0 即使创建了用户?这是 MariaDB 10.

根据 the PDO docsPDO::exec() returns 修改或删除的行数,如果 none 为零。

PDO::exec() returns the number of rows that were modified or deleted by the SQL statement you issued. If no rows were affected, PDO::exec() returns 0

A CREATE USER/DROP USER 语句,虽然它隐式修改了 mysql.user table 没有注册为影响任何行作为 INSERTDELETE 语句会,所以 exec() return 为零。

例如从命令行:

MariaDB [(none)]> CREATE USER u@localhost;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> DROP USER u@localhost;
Query OK, 0 rows affected (0.00 sec)

因此 0 return 值不应被视为失败或虚假值。换句话说,注意不要使用这样的表达式:

// Do not do this:
if (!$dbh->exec("CREATE USER 'usr'@'localhost' IDENTIFIED BY 'Pass100'")) {
  // Handle error
}

而是使用严格比较 === 来测试 FALSE return:

if ($dbh->exec("CREATE USER 'usr'@'localhost' IDENTIFIED BY 'Pass100'") === FALSE) {
  // Handle error
}

如果在创建用户时出现任何错误,例如用户已经存在或者您没有创建它的权限,MariaDB 将报错,导致 PDO::exec() 到 return FALSE 而不是整数 0,或者如果您为 PDO::ERRMODE_EXCEPTION 配置了 $dbh,则抛出异常。