【问题标题】:SQLSTATE[HY000] [1045] Access denied for user 'username'@'localhost' using CakePHPSQLSTATE[HY000] [1045] 使用 CakePHP 拒绝用户 'username'@'localhost' 的访问
【发布时间】:2015-09-18 04:27:20
【问题描述】:

我是 PHP 新手和CakePHP。我在使用 CakePHP 连接数据库时发现问题。

下面是我的应用配置。

我在 Bitnami WAMP 堆栈 5.4.40-0 上。 我正在使用 CakePHP 3.0.4 创建一个 Web MVC 应用程序

在我的app.php 文件中输入数据源。

/**
 * Connection information used by the ORM to connect
 * to your application's datastores.
 * Drivers include Mysql Postgres Sqlite Sqlserver
 * See vendor\cakephp\cakephp\src\Database\Driver for complete list
 */
'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        /**
         * CakePHP will use the default DB port based on the driver selected
         * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
         * the following line and set the port accordingly
         */
        //'port' => 'nonstandard_port_number',
        'username' => 'test2',
        'password' => 'computer',
        'database' => 'jobs',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,

        /**
         * Set identifier quoting to true if you are using reserved words or
         * special characters in your table or column names. Enabling this
         * setting will result in queries built using the Query Builder having
         * identifiers quoted when creating SQL. It should be noted that this
         * decreases performance because each query needs to be traversed and
         * manipulated before being executed.
         */
        'quoteIdentifiers' => false,

        /**
         * During development, if using MySQL < 5.6, uncommenting the
         * following line could boost the speed at which schema metadata is
         * fetched from the database. It can also be set directly with the
         * mysql configuration directive 'innodb_stats_on_metadata = 0'
         * which is the recommended value in production environments
         */
        //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
    ],

我已经根据 CakePHP 的约定创建了一个名为 jobs 的数据库表。用户 test2 具有与 root 管理员相同的全局权限。

但是当我运行 bake all 命令时,我收到以下错误:

2015-07-01 06:24:56 Error: [PDOException] SQLSTATE[HY000] [1045] Access denied for user 'test2'@'localhost' (using password: YES)
Stack Trace:
C:\Bitnami\wampstack-5.4.40-0\apache2\htdocs\myjobs\vendor\cakephp\cakephp\src\Database\Driver\PDODriverTrait.php(48): PDO->__construct('mysql:host=127....', 'test2', 'computer', Array)
C:\Bitnami\wampstack-5.4.40-0\apache2\htdocs\myjobs\vendor\cakephp\cakephp\src\Database\Driver\Mysql.php(89): Cake\Database\Driver\Mysql->_connect('mysql:host=127....', Array)
C:\Bitnami\wampstack-5.4.40-0\apache2\htdocs\myjobs\vendor\cakephp\cakephp\src\Database\Schema\BaseSchema.php(46): Cake\Database\Driver\Mysql->connect()

问题已解决(更新)

我听从了 Ankit 和 Spencer 的指示。

我遇到了几个问题。

  1. 我的用户的主机不是本地主机;这是一个通配符%。改变了这一点,然后 MySQL 开始拒绝连接。

  2. 我禁用了防火墙,发现端口与3306不同。所以我更改了app.php中的条目。现在我的应用程序已经出炉了 :)

【问题讨论】:

  • Access denied for user 'test2'@'localhost' (using password: YES) 这很明确。 是否用户 test2 有访问权限? IE。这行得通吗:mysql -utest2 -pcomputer jobs ?
  • 奇怪,将 % 更改为 localhost 真的对我有用...而且它可能会创建另一个用户 - 删除带有 % 主机的用户
  • 在这些更改之后重新启动 MySQL 是锦上添花。
  • 当您错过了 php 文件的扩展名时会发生同样的错误。在我的情况下,app.php 是没有扩展名的应用程序,添加扩展名后,问题就解决了。

标签: php mysql cakephp cakephp-3.0


【解决方案1】:

该错误消息通常意味着我们使用的密码与 MySQL 认为我们正在连接的用户的密码不匹配,或者匹配的 MySQL 用户不存在(尚未创建)。

在 MySQL 中,用户由用户名(“test2”)主机(“localhost”)标识。

错误消息标识了 user ("test2") 和 host ("localhost") 值...

  'test2'@'localhost'

我们可以检查用户是否存在,使用我们可以连接的客户端的这个查询:

 SELECT user, host FROM mysql.user

我们正在寻找一行,其中 user 为“test2”,host 为“localhost”。

 user     host       
 -------  -----------
 test2     127.0.0.1  cleanup
 test2     ::1        
 test2     localhost  

如果该行不存在,则可以将主机设置为通配符值%,以匹配任何其他不匹配的主机。

如果该行存在,则密码可能不匹配。我们可以更改密码(如果我们以具有足够权限的用户身份连接,例如root

 SET PASSWORD FOR 'test2'@'localhost' = PASSWORD('mysecretcleartextpassword')

我们还可以验证用户是否拥有数据库中对象的权限。

 GRANT SELECT ON jobs.* TO 'test2'@'localhost' 

编辑

如果我们使用 DML 操作(INSERT、UPDATE、DELETE)对 mysql 权限表进行更改,这些更改将在 MySQL 重新读取表之前生效。我们可以通过由特权用户执行的FLUSH PRIVILEGES 语句强制重新读取来使更改生效。

【讨论】:

  • 非常感谢 Spencer...确实我用户的主机是一个通配符值,改变了它...而且端口也不同于 3306..现在我的数据库烘焙成功了 :)跨度>
  • 不要忘记刷新权限;
  • @EricKorolev 是的,在对 mysql 表进行 DML(插入、更新、删除)更改后需要 FLUSH PRIVILEGES 语句,以使这些更改生效。在 SET PASSWORD 或 GRANT 语句之后不需要它(如我的回答所示),因为这些更改会在没有 FLUSH PRIVILEGES 的情况下自动生效。
【解决方案2】:

检查以下事项

  • 确保您的 MySQL 服务器正在运行
  • 使用默认凭据检查连接,即用户名:“root”和密码:“”[空白密码]
  • 尝试使用相同的凭据登录 phpmyadmin
  • 尝试使用 127.0.0.1 代替 localhost,否则您的局域网 IP 也可以。
  • 确保您在 3306 上运行 MySql,如果您已配置,请确保在建立连接时声明它

【讨论】:

  • 我将 'localhost' 更改为 '127.0.0.1' 并修复问题。
【解决方案3】:

我看到它已经解决了,但我仍然想分享一个对我有用的解决方案。

.env 文件:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=[your database name]
DB_USERNAME=[your MySQL username]
DB_PASSWORD=[your MySQL password]

MySQL 管理员:

 SELECT user, host FROM mysql.user

Thank you, spencer7593

控制台:

php artisan cache:clear
php artisan config:cache

现在它对我有用。

Laracasts answers

【讨论】:

    【解决方案4】:

    如果您使用 MAMP,您可能需要设置套接字: unix_socket: /Applications/MAMP/tmp/mysql/mysql.sock

    【讨论】:

      【解决方案5】:

      我想在上面发布的答案中补充一点,这里提出的解决方案都不适合我。我的 WAMP 正在使用端口 3308 而不是默认安装的 3306。 我发现在本地环境中工作时,如果您在计算机中使用 mysqladmin(用于测试环境),并且使用 3306 以外的端口,则必须使用值 localhost:NumberOfThePort 定义变量 DB_SERVER,所以它将如下所示: 定义(“DB_SERVER”,“本地主机:3308”)。您可以通过右键单击任务栏中的 WAMP 图标(在隐藏图标部分)并选择工具来获取此值。您将看到以下部分:“MySQL 使用的端口:NumberOfThePort”

      这将修复您与数据库的连接。

      这是我得到的错误: 错误:SQLSTATE[HY1045] 第 X 行的用户 'username'@'localhost' 的访问被拒绝。

      希望对你有所帮助。

      :)

      【讨论】:

        猜你喜欢
        • 2017-07-18
        • 2018-07-22
        • 1970-01-01
        • 2021-02-27
        • 2020-09-11
        • 2019-12-01
        • 1970-01-01
        相关资源
        最近更新 更多