2015-05-28 73 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很高興幫助,歡呼聲。 –