为什么PHP PDO会得到;SQLSTATE[42000][1044]拒绝用户访问;mysql命令行何时工作?

为什么PHP PDO会得到;SQLSTATE[42000][1044]拒绝用户访问;mysql命令行何时工作?,php,mysql,database,pdo,database-permissions,Php,Mysql,Database,Pdo,Database Permissions,在过去的几个小时里,我使劲把它撞在墙上,头都流血了( 正如标题所示,我创建了一个MySQL用户,可以通过数据库服务器上的MySQL命令提示符很好地访问数据库。但是,当我尝试实例化一个新的PDO对象以使用同一用户访问数据库时,我得到: SQLSTATE[42000] [1044] Access denied for user 'bob'@'localhost' to database 'my_database' 以下是我创建用户的方式: GRANT SELECT, DELETE, EXECUTE

在过去的几个小时里,我使劲把它撞在墙上,头都流血了(

正如标题所示,我创建了一个MySQL用户,可以通过数据库服务器上的MySQL命令提示符很好地访问数据库。但是,当我尝试实例化一个新的PDO对象以使用同一用户访问数据库时,我得到:

SQLSTATE[42000] [1044] Access denied for user 'bob'@'localhost' to database 'my_database'
以下是我创建用户的方式:

GRANT SELECT, DELETE, EXECUTE, INSERT, UPDATE ON my_database.* TO 'bob'@'localhost' IDENTIFIED BY 'some_password';
这里可能有什么问题?!请有人扔我一根骨头!(仅供参考,当我尝试创建一个新的PDO对象时,问题发生了……我捕获了一个PDO异常,这就是消息)

我在授权后刷新了权限,下面是SHOW GRANTS的输出:

mysql> SHOW GRANTS FOR 'bob'@'localhost';
+------------------------------------------------------------------------------------------------------------+
| Grants for bob@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'bob'@'localhost' IDENTIFIED BY PASSWORD '.........................................' |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `my_database`.* TO 'bob'@'localhost'                      |
+------------------------------------------------------------------------------------------------------------+
下面是mysql.db对于该用户的外观:

mysql> SELECT * FROM db WHERE User = 'bob'\G;
*************************** 1. row ***************************
                 Host: localhost
                   Db: my_database
                 User: bob
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: N
            Drop_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
         Execute_priv: Y
           Event_priv: N
         Trigger_priv: N
如果有必要,这是一个运行在Ubuntu12.04LTS上的四节点MySQL集群


编辑:我发现只有当我尝试使用Zend AMF访问服务器时,问题才会出现。你知道PDO为什么不能与Zend AMF一起工作吗?我可能错过了Zend AMF设置中的某些内容吗?

试试“bob”@“127.0.0.1”。如果php是通过127.0.0.1访问它,它将永远不会被称为“localhost”,因为本地DNS解析上没有发生,MySQL将拒绝访问它。

对于未来的谷歌用户,我刚才也遇到了同样的问题,我非常确定密码是正确的。是的,密码确实是正确的,但问题是如何生成密码以及如何在配置文件中保存密码

如果您使用像我这样的随机密码生成器,请确保您的密码中没有
$
美元符号

如果密码中有
$
,请确保在配置文件中使用如下单引号保留密码

$pass = 'randomchars$morerandom';
$pass = "randomchars$morerandom";
但不是用这样的双引号

$pass = 'randomchars$morerandom';
$pass = "randomchars$morerandom";

在运行了
GRANT
之后,您是否运行了
FLUSH PRIVILEGES
?请编辑您的问题以添加更多信息。注释中的代码不可读。大概,
GRANT
会直接更新服务器的特权缓存,因此不需要
FLUSH PRIVILEGES
。只有在修改
mysql.直接表。既然您正在运行集群,您需要在每个sql节点上创建该用户,并授予他在每个节点上的权限……您做到了吗?请务必记住,MySQL grant表使用MyISAM存储引擎。因此,这些表不会在MySQL群集中作为SQL节点的MySQL服务器之间复制或共享