Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLSTATE[HY000] [1045] Access denied for user 'username'@'localhost' using CakePHP

Tags:

I am new to PHP and CakePHP. I am finding problems while wiring my database using CakePHP.

Below is my application configuration.

I am on Bitnami WAMP stack 5.4.40-0. I am using CakePHP 3.0.4 to create a web MVC application

Entry for datasources in my app.php file.

/**  * 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'],     ], 

I have already created a database table called jobs according to CakePHP conventions. User test2 has global privileges the same as the root administrator.

But when I am running the bake all command, I am getting the following error:

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() 

PROBLEM SOLVED (UPDATE)

I followed Ankit and Spencer's directions.

I had a couple of problems.

  1. Host of my user was not localhost; it was a wildcard %. Changed that, then MySQL started refusing connections.

  2. I disabled my firewall and found that the port was different from 3306. So I changed the entry in app.php. Now my application is baked :)

like image 660
saurav Avatar asked Jul 01 '15 06:07

saurav


1 Answers

That error message usually means that either the password we are using doesn't match what MySQL thinks the password should be for the user we're connecting as, or a matching MySQL user doesn't exist (hasn't been created).

In MySQL, a user is identified by both a username ("test2") and a host ("localhost").

The error message identifies the user ("test2") and the host ("localhost") values...

  'test2'@'localhost' 

We can check to see if the user exists, using this query from a client we can connect from:

 SELECT user, host FROM mysql.user 

We're looking for a row that has "test2" for user, and "localhost" for host.

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

If that row doesn't exist, then the host may be set to wildcard value of %, to match any other host that isn't a match.

If the row exists, then the password may not match. We can change the password (if we're connected as a user with sufficient privileges, e.g. root

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

We can also verify that the user has privileges on objects in the database.

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

EDIT

If we make changes to mysql privilege tables with DML operations (INSERT,UPDATE,DELETE), those changes will not take effect until MySQL re-reads the tables. We can make changes effective by forcing a re-read with a FLUSH PRIVILEGES statement, executed by a privileged user.

like image 65
spencer7593 Avatar answered Oct 06 '22 19:10

spencer7593