2011-08-18 36 views
10

Tôi đang cố gắng sử dụng trình điều khiển PDO_DBLIB của PHP để kết nối với cơ sở dữ liệu từ xa và đang gặp một số vấn đề.Lỗi PHP khi kết nối với cơ sở dữ liệu MS SQL bằng PDO_DBLIB

Cơ sở dữ liệu có thể kết nối thông qua cùng môi trường sử dụng telnet và máy khách SQL. Tuy nhiên, kết nối bằng cách sử dụng đoạn mã sau trong PHP không hoạt động:

<?php 
$conn = new PDO('dblib:dbname=TestDB;host=RemoteServer;charset=utf8', 'my_user', 'my_pass'); 

Chạy mã này, cho dù đó là từ dòng lệnh hoặc Apache, mang lại các lỗi sau:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] Unable to connect: Adaptive Server is unavailable or does not exist (severity 9)'

tôi có thể kết nối với cơ sở dữ liệu bằng cách sử dụng cùng một mã trên một máy chủ web khác, điều này khiến tôi tin rằng đó là vấn đề về cấu hình. Các tập tin php.ini trên hai máy chủ trông tương đối giống nhau. Họ từng có cùng một thư viện PDO được kích hoạt với cùng các tùy chọn được cấu hình.

Có ai có bất kỳ ý tưởng nào về việc điều này có thể xảy ra không?

+0

Xin đừng sửa câu hỏi của bạn để nói rằng bạn giải quyết của bạn vấn đề. Chọn câu trả lời của bạn làm câu trả lời được chấp nhận bên dưới. –

Trả lời

16

Hóa ra đó là một vấn đề đơn giản hơn nhiều so với tôi nghĩ. Vì lý do gì đó, máy chủ phát triển không sử dụng Cổng 1433 làm cổng mặc định trong kết nối và thay vào đó sử dụng Cổng 4000.

Tôi phát hiện điều này bằng cách bật nhật ký trong tệp freetds.conf và giám sát chúng như tôi đã tạo yêu cầu.

Ngoài ra, cần lưu ý: Phần mở rộng DBLIB sử dụng dấu hai chấm (:) làm dấu phân tách giữa máy chủ và cổng thay vì dấu phẩy. Thật không may, lỗi mà bạn nhận được khi bạn sử dụng dấu phẩy không phải là rất mô tả, vì vậy hy vọng ai đó hưởng lợi từ khám phá này.

3

Viết cổng vào freetds.conf trực tiếp cho máy chủ này:

[RemoteServer] 
    host = RemoteServer 
    port = 1433 

Và rời php mã chúng tôi là:

$conn = new PDO('dblib:dbname=TestDB;host=RemoteServer;charset=utf8', 'my_user', 'my_pass'); 
Các vấn đề liên quan