2012-09-15 27 views
5

Đầu tôi đẫm máu vì tôi đã đập mạnh vào tường này trong vài giờ qua. Như tiêu đề gợi ý, tôi đã tạo một người dùng MySQL có thể truy cập cơ sở dữ liệu fine từ dấu nhắc lệnh mysql trên máy chủ cơ sở dữ liệu.Tuy nhiên, khi tôi cố gắng tạo một đối tượng PDO mới để truy cập vào cơ sở dữ liệu với cùng một người dùng, tôi nhận được:Tại sao PHP PDO nhận được "SQLSTATE [42000] [1044] Truy cập bị từ chối cho người dùng" khi dòng lệnh mysql hoạt động?

SQLSTATE[42000] [1044] Access denied for user 'bob'@'localhost' to database 'my_database' 

đây là cách tôi tạo ra cho người sử dụng:

GRANT SELECT, DELETE, EXECUTE, INSERT, UPDATE ON my_database.* TO 'bob'@'localhost' IDENTIFIED BY 'some_password'; 

gì có thể là vấn đề ở đây ?! Xin vui lòng ai ném cho tôi một xương (FYI, vấn đề xảy ra khi tôi cố gắng tạo một đối tượng PDO mới ... Tôi bắt được một PDOException và đó là thông điệp).

tôi đã làm FLUSH PRIVILEGES sau khi cấp, và đây là kết quả của SHOW tài trợ:

mysql> SHOW GRANTS FOR 'bob'@'localhost'; 
+------------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]                     | 
+------------------------------------------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'bob'@'localhost' IDENTIFIED BY PASSWORD '.........................................' | 
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `my_database`.* TO 'bob'@'localhost'      | 
+------------------------------------------------------------------------------------------------------------+ 

Và đây là những gì mysql.db trông giống như cho người dùng này:

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 

Trong trường hợp vấn đề , đây là một cụm MySQL bốn nút chạy trên Ubuntu 12.04 LTS.

EDIT: Tôi đã phát hiện thấy sự cố chỉ xảy ra khi tôi cố truy cập máy chủ bằng Zend AMF. Bất kỳ ý tưởng tại sao PDO sẽ không làm việc với Zend AMF? Có lẽ tôi có thể bỏ lỡ một cái gì đó trong thiết lập AMF Zend của tôi?

+4

Bạn có chạy 'FLUSH PRIVILEGES' sau khi chạy' GRANT'? –

+0

Vui lòng chỉnh sửa câu hỏi của bạn để thêm thông tin. Mã trong nhận xét không thể đọc được. –

+0

Có lẽ, 'GRANT' trực tiếp cập nhật bộ đệm đặc quyền của máy chủ, vì vậy không nên yêu cầu' FLUSH PRIVILEGES'. Bạn chỉ cần nó nếu bạn sửa đổi các bảng 'mysql. *' Trực tiếp. – lanzz

Trả lời

5

Hãy thử 'bob'@'127.0.0.1' để thay thế. Nếu php truy cập nó thông qua 127.0.0.1, nó sẽ không bao giờ được gọi là 'localhost' vì độ phân giải DNS cục bộ không xảy ra, và MySQL sẽ từ chối truy cập vào nó.

3

Đối với những người dùng Google trong tương lai, tôi đã gặp sự cố tương tự ngay bây giờ và tôi khá chắc chắn rằng mật khẩu đã chính xác. Có mật khẩu chính xác nhưng vấn đề là cách tôi tạo mật khẩu và cách tôi giữ mật khẩu trong tập tin cấu hình.

Nếu bạn sử dụng trình tạo mật khẩu ngẫu nhiên như tôi, hãy đảm bảo bạn không có $ ký hiệu đô la trong mật khẩu của mình.

Nếu bạn có $ trong bạn mật khẩu sau đó hãy chắc chắn rằng bạn giữ cho bạn mật khẩu trong tập tin cấu hình sử dụng đơn dấu ngoặc kép như thế này

$pass = 'randomchars$morerandom'; 

nhưng không phải với hai dấu ngoặc kép như thế này

$pass = "randomchars$morerandom"; 
Các vấn đề liên quan