2011-08-23 38 views
5

Đây là mã chuẩn khi sử dụng cửa sổ xác thực:Tại sao tôi có thể kết nối với SQL Server Express cục bộ nhưng không kết nối với SQL Server từ xa từ PHP?

<?php 
    try { 
     $conn = new PDO("sqlsrv:Server=geoffrey-pc\SQLEXPRESS;Database=books", 
         NULL, NULL); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (PDOException $e) { 
     echo $e; 
     die("Error connecting to SQL Server"); 
    } 

    echo "Connected to SQL Server\n"; 
?> 

Các công trình trên để kết nối đến máy chủ địa phương (SQL Server 2008 Express Edition), nhưng không phải để kết nối với một máy chủ trên mạng (SQL Server Standard Phiên bản). Các thông báo lỗi là:

ngoại lệ 'PDOException' với thông điệp 'SQLSTATE [28000]: [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Đăng nhập thất bại cho dùng' mydomain \ GEOFFREY-PC $ '.' trong C: \ wamp \ www \ PhpProject1 \ index.php: 10 Dấu vết ngăn xếp: # 0 C: \ wamp \ www \ PhpProject1 \ index.php (10): PDO -> __ xây dựng ('sqlsrv: Máy chủ = n. .. ', NULL, NULL) # 1 {main}

Chuỗi kết nối cho máy chủ mạng giống với máy chủ cục bộ, ngoại trừ tên máy chủ tương tự abc0120 và không kết thúc bằng \ SQLEXPRESS hoặc bất cứ điều gì khác, và tên cơ sở dữ liệu là khác nhau. Tên cơ sở dữ liệu tôi sử dụng với máy chủ mạng không tồn tại.

Tôi đang sử dụng Apache 2.2.11. Trang SQLServer 2005 MSDN cho How to: Connect Using Windows Authentication lần đọc:

Thông tin xác thực mà quá trình máy chủ Web (hoặc luồng) đang chạy phải ánh xạ tới đăng nhập SQL Server hợp lệ để thiết lập kết nối.

Có thể đó là vấn đề.

Tôi có thể kết nối với máy chủ mạng bằng SQL Server Management Studio cũng sử dụng xác thực cửa sổ.

+0

Đặt chuỗi kết nối bạn sử dụng cho máy chủ từ xa tại đây. – Jacob

+0

@cularis, Nó giống với tên máy chủ cục bộ, ngoại trừ tên máy chủ là abc0120 (và không kết thúc bằng \ SQLEXPRESS) và tên cơ sở dữ liệu khác (và cơ sở dữ liệu tồn tại). – systemovich

+1

Quá trình PHP có chạy dưới một tài khoản biết đến cá thể SQL Server trên máy chủ từ xa không? Thông thường, Management Studio chạy dưới tài khoản của riêng bạn, nhưng máy chủ web thì không. – tdammers

Trả lời

2

Từ hướng dẫn PHP, bạn có ví dụ này:

<?php 
/* Connect to an ODBC database using driver invocation */ 
$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

Trong ví dụ của bạn, bạn bỏ qua $user$password đối số. Tôi sẽ thử và chỉ định tên người dùng và mật khẩu thay vì chuyển số null; người dùng chạy tập lệnh PHP của bạn có thể không giống với người dùng đã đăng nhập ... bỏ qua để cung cấp tên người dùng và mật khẩu, PHP cố gắng cung cấp thông tin xác thực của người dùng đang chạy tập lệnh (có lẽ thậm chí không có mật khẩu).

+0

bạn nói đúng. Khi chương trình đang trong quá trình sản xuất, tập lệnh nên sử dụng xác thực SQL Server thay vì xác thực Windows, để tất cả người dùng tập lệnh không cần phải có quyền trên Máy chủ SQL. – systemovich

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