2013-08-28 32 views
9

Tôi đang cố gắng thiết lập trang web mới trên lưu trữ của mình (Lưu trữ tuyến đường nếu nó quan trọng) nhưng tôi vẫn gặp phải lỗi này khi tôi thử sử dụng PDO (trang web PDO đầu tiên đang cố gắng) :PHP PDO: Không thể kết nối, tên danh mục không hợp lệ

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in /home/kennyi81/public_html/gamersite/login.php:36 Stack trace: #0 /home/kennyi81/public_html/gamersite/login.php(36): PDOStatement->execute() #1 {main} thrown in /home/kennyi81/public_html/gamersite/login.php on line 36 

Khi tôi sử dụng các thiết lập này:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

.... 

$stmt = $dbh->prepare('SELECT * FROM USERS WHERE ID = :id LIMIT 1'); 

Làm thế nào cơ sở dữ liệu được đặt ra:

enter image description here

Tôi có thể sử dụng mysqli kết nối tốt trên các miền phụ khác của tôi/trang web chính, nhưng tôi chỉ không thể có được PDO để làm việc.

Tôi đã cố gắng này, mà tôi đã thấy xung quanh:

$stmt = $dbh->prepare('SELECT * FROM gamersite.USERS WHERE ID = :id LIMIT 1'); 

nhưng nó retuns lỗi cú pháp.

Bất kỳ ai có bất kỳ ý tưởng nào có thể gây ra điều này?


Đây là tất cả hoạt động trên máy chủ cục bộ của tôi, không có gì thay đổi khi tải lên ngoài đường kết nối.

+0

Dòng nào là 36? – Mike

+0

PDO mới ("mysql: host = 91.146.107.11 – Mihai

+0

@Mike Đó là $ stmt-> execute(); cho truy vấn được hiển thị ở trên. –

Trả lời

11

Thay vì:

$dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

Hãy thử:

$dbh = new PDO("mysql:host=91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 

(thêm host =)

Và nó rất có thể hoạt động trên máy chủ địa phương của bạn, bởi vì bạn có mysql:localhost... hoặc mysql:127.0.0.1... ở đó và nó bị bỏ qua (vì nó thiếu máy chủ = là tốt) và theo mặc định là localhost.

+0

EDIT: Điều này đã khắc phục được sự cố, Cảm ơn bạn. –

1

Từ PDO manual page, bạn có thể thấy rằng bạn cần bọc kết nối trong khối try/catch. Bằng cách này, nếu có sự cố với kết nối, nó sẽ cho bạn biết. Một cái gì đó như thế này:

try { 
    $dbh = new PDO("mysql:91.146.107.11;dbname=kennyi81_gamersite", "kennyi81_gamer", "***************"); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 

    // Then actually do something about the error 
    logError($e->getMessage(), __FILE__, __LINE__); 
    emailErrorToAdmin($e->getMessage(), __FILE__, __LINE__); 
    // etc. 
    die(); // Comment this out if you want the script to continue execution 
} 

Lý do bạn nhận được lỗi này là do có lỗi với kết nối của bạn, nhưng vì bạn không yêu cầu tập lệnh dừng lại, nên không. Nhìn vào thông báo lỗi được tạo ra và cách khắc phục nó phải được làm rõ ràng. Có vẻ như câu trả lời của Michael Prajsnar là chính xác ở chỗ bạn không đặt "máy chủ".

Edit:

Khi nó quay ra, PDO không phàn nàn nếu bạn bỏ qua host hoặc dbname của bạn trong kết nối DSN phần PDO (ít nhất là trên Unix). Tôi đã thử nghiệm nó và để trống nó sẽ mặc định nó thành "localhost" và do đó tôi có thể kết nối hoàn toàn tốt để thoát khỏi hoàn toàn các kết nối localhost, điều này giải thích tại sao nó hoạt động trên máy chủ cục bộ của bạn chứ không phải trên máy chủ sản xuất của bạn. Trong thực tế, nó là hoàn toàn có thể kết nối cung cấp hoàn toàn không có gì trong DSN trừ các cơ sở dữ liệu như thế này:

$dbh = new PDO("mysql:", "kennyi81_gamer", "***************"); 

Vấn đề duy nhất là nó sẽ không được sử dụng một cơ sở dữ liệu, vì vậy sử dụng một cơ sở dữ liệu, chỉ cần làm:

if ($dbh->query("USE kennyi81_gamersite") === false)) { 
    // Handle the error 
} 

Tuy nhiên với những gì đã nói, tôi đã nghi ngờ của tôi mà bạn thực sự cố gắng kết nối sử dụng một khối try/catch (như bạn đề cập đến trong ý kiến ​​của bạn) trừ khi bạn nào đó cung cấp thông tin cơ sở dữ liệu hợp lệ. Cách duy nhất mà làm theo cách này đã không sản xuất bất kỳ loại lỗi là nếu bạn thực sự kết nối đúng và chọn cơ sở dữ liệu kennyi81_gamersite.Nếu không, bạn sẽ thấy một thông báo như sau:

Không thể kết nối với cơ sở dữ liệu. "Mysql" cho biết: SQLSTATE [28000] [1045] Truy cập bị từ chối cho người dùng kennyi81_gamer '@ 'localhost'(sử dụng mật khẩu: YES)

Nói tóm lại, lúc nào cũng quấn kết nối của bạn trong một khối try/catch nếu bạn muốn để tìm lỗi trong khi kết nối. Chỉ cần đảm bảo không được ném lại (và không bắt được) số getMessage() của PDOException hoặc bạn có thể hiển thị thông tin xác thực đăng nhập của mình.

+0

Tôi đã cố gắng nhưng không có thông báo nào xuất hiện ngoài thông tin tôi đã có. –

+0

@ TristanCunningham Xem bản chỉnh sửa của tôi – Mike

+1

Việc bỏ một ngoại lệ không bị bắt buộc cũng sẽ * cho bạn biết * cũng như kích hoạt một lỗi nghiêm trọng, do đó dừng việc thực hiện tiếp theo. Xu hướng này khuyên các nhà phát triển nắm bắt ngoại lệ và chỉ in ra thông điệp có vẻ là vòng tiếp theo của PHP khủng khiếp lời khuyên – Phil

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