2015-05-28 32 views
1

为什么是它MySQL的CREATE/DROP USER返回0

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

返回0,即使在创建用户?这与MariaDB 10.

+0

_“PDO :: exec()返回你发出的SQL语句修改或删除的行数,如果没有行受到影响,PDO :: exec()返回0。 “CREATE USER”语句是一个不影响任何行的语句,尽管可能会隐式修改mysql数据库。 http://php.net/manual/en/pdo.exec.php –

+0

我想这应该是一个答案。请继续,我会在下面发布。 –

回答

2

根据the PDO docs,PDO::exec()返回修改或删除的行数,如果没有,则返回零。

PDO :: exec()返回您发布的SQL语句修改或删除的行数。如果没有行受到影响,PDO :: EXEC()返回0

一个CREATE USER/DROP USER声明,但它隐含修改mysql.user表不注册为具有影响的任何行作为INSERTDELETE语句会,等exec()返回零。

例如从命令行:

MariaDB [(none)]> CREATE USER [email protected]; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [(none)]> DROP USER [email protected]; 
Query OK, 0 rows affected (0.00 sec) 

所以0返回值不应被理解为一个故障或falsy值处理。换句话说,要小心不要使用像一个表达式:

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

而是使用进行严格比较===来测试FALSE回报:

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

如果在创建任何错误用户(例如用户已经存在或者您缺少创建权限),MariaDB会将其报告为错误,导致PDO::exec()返回FALSE而不是整数0,或者如果您已配置则抛出异常for PDO::ERRMODE_EXCEPTION

+0

@MichelBerkowski - 感谢您的全面回答。 – DroidOS

+0

@DroidOS很高兴帮助,欢呼声。 –