2012-05-02 28 views
11

Tôi biết có một loạt các câu hỏi tương tự, trên thực tế tôi đã đọc tất cả (9) trong số chúng.PHP 5.4 PDO không thể kết nối với MySQL 4.1+ bằng cách sử dụng xác thực không an toàn cũ

Tuy nhiên, không ai trong số họ giải quyết được sự cố của tôi.

Tôi có gói lưu trữ được chia sẻ (tối thiểu). Những gì được bao gồm trong gói của tôi là tên miền, và một địa chỉ IP riêng biệt, nơi máy chủ MySQL được lưu trữ. Để phát triển, tôi đang sử dụng http://localhost/ với máy chủ phát triển PHP 5.4 và tôi đang sử dụng máy chủ MySQL tôi nhận được trong gói lưu trữ của mình.

Sự cố chỉ phát sinh trên PC của tôi, vì tôi đã cài đặt PHP 5.4, nhưng máy chủ web của tôi đã cài đặt PHP 5.2.17 và sẽ không nâng cấp. Máy chủ MySQL nằm trên MySQL 5.1.50.

May mắn thay, phpMyAdmin có tính năng "Thay đổi mật khẩu" được tích hợp sẵn.

Có hai lựa chọn băm trong phpMyAdmin để thay đổi mật khẩu:

  • MySQL 4.1+
  • MySQL 4.0 tương thích

Tôi đã thay đổi mật khẩu với các tùy chọn MySQL 4.1 trở lên, và nó xác nhận bản cập nhật đã thành công.

Tiểu sử đã được cập nhật. SET PASSWORD = PASSWORD('***')

Tuy nhiên, khi tôi thực hiện truy vấn này:

SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc')); 

Nó nói với tôi độ dài mật khẩu vẫn là 16. Output:

1  1  16 

Và vì vậy vấn đề vẫn tồn tại.

Không thể kết nối với cơ sở dữ liệu. SQLSTATE [HY000] [2000] mysqlnd không thể kết nối với MySQL 4.1+ bằng cách sử dụng xác thực không an toàn cũ. Vui lòng sử dụng công cụ quản trị để đặt lại mật khẩu của bạn bằng lệnh SET PASSWORD = PASSWORD ('your_existing_password'). Điều này sẽ lưu trữ một giá trị băm mới và an toàn hơn trong mysql.user. Nếu người dùng này được sử dụng trong các tập lệnh khác được thực thi bởi PHP 5.2 trở lên, bạn có thể cần phải xóa cờ cũ-mật khẩu khỏi tệp my.cnf của mình

Tôi cũng đã cố gắng thực hiện các truy vấn này, khi đăng nhập bằng người dùng dBO trong phpMyAdmin:

SET SESSION old_passwords=0; 
[phpMyAdmin reloads to the home screen, but the value remains = 1] 

SET GLOBAL old_passwords = 0; 
#1227 - Access denied; you need the SUPER privilege for this operation 

FLUSH PRIVILEGES; 
#1227 - Access denied; you need the RELOAD privilege for this operation 

Đây là mâu thuẫn với những gì được nêu trong menu của webhost cho việc thiết lập người dùng dBO:

Database Owner
Khi bạn tạo một cơ sở dữ liệu mới, y Bạn cần phải chỉ định Người dùng cơ sở dữ liệu (DBO), sẽ có
toàn quyền truy cập quản trị viên vào cơ sở dữ liệu.

Đây có phải là điều tôi phải thực hiện với các máy chủ web của mình không? Hoặc nó có thể được giải quyết bởi người dùng DBO của tôi? Nếu không thì điều này có thể được bỏ qua trong PHP? (vì nó hoạt động với PHP 5.2.17 nhưng không phải PHP 5.4)

+1

Chúng bị kẹt trên PHP 5.2.17 (2011-01-06) và MySQL 5.1.50 (2010-08-03) và sẽ không nâng cấp? Tôi muốn nói di chuyển đến một máy chủ mới. Nhưng bất chấp điều đó, bạn nên luôn luôn phát triển và thử nghiệm cục bộ với các phiên bản tương tự mà bạn triển khai, để tránh loại vấn đề này. –

Trả lời

32

GIẢI PHÁP!

Mặc dù SET SESSION old_passwords=0; không hoạt động trong phpMyAdmin.

Tôi đã tải về MySQL GUI Tools và sử dụng MySQL Query Browser để thực hiện lệnh tương tự trên phi DBO sử dụng:

SET SESSION old_passwords = 0;

SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));

bây giờ trở về:

1  0  41 

Vì vậy, Tôi chỉ cần thay đổi mật khẩu:

SET PASSWORD = PASSWORD('my_old_password')

Và bây giờ PHP 5.4 PDO kết nối với cơ sở dữ liệu với người dùng đó!

+2

Điều này làm việc cho tôi, anh chàng tuyệt vời! – hiennt

+2

Có, công việc tốt :) Cũng làm việc tốt thông qua giao diện điều khiển mysql –

+1

Làm việc cho tôi! –

3

Trong phpMyAdmin, đặt biến phiên sẽ hoạt động, nhưng lệnh gọi hàm mật khẩu phải xảy ra trong cùng một phiên/thực thi.

Ví dụ, nếu tôi thực hiện:

SET SESSION old_passwords = 0; 
SET PASSWORD = PASSWORD('notagoodpassword'); 

Nó một cách chính xác sẽ thiết lập nó.

+0

điều tốt để biết rằng nó hoạt động từ PMA cũng như – qdev

+0

Cảm ơn bạn rất nhiều :) thực hiện cả hai truy vấn cùng một lúc đã làm các trick cho tôi hơn bất kỳ giải pháp khác –

+0

Điều này làm việc cho tôi. Cảm ơn! :-) – Jacob

-1

giải pháp này đã hoạt động: ĐẶT PHẦN old_passwords = 0;

NHƯNG: Tôi đã phải bỏ bảng "userfrosting" cũ và sau đó tạo bảng mới - sau đó nó hoạt động như một nét duyên dáng.

Các vấn đề liên quan