Lời nói đầu
Bài này là một kinh nghiệm nho nhỏ của tôi trong quá trình thực hiện một số dự án với cơ sở dữ liệu. Nhiều bạn sẽ cho rằng tôi “điên” khi sử dụng SQL Server để làm việc với PHP mà không sử dụng MySQL trong bộ XAMPP.
Câu chuyện của tôi bắt đầu cách đây không lâu khi tôi nhận nhiệm vụ chuyển đổi và thiết kế lại cơ sở dữ liệu từ MS SQL Server sang MySQL. May mắn là trước đây ở trường, tôi thường làm việc với cơ sở dữ liệu MS SQL Server nên việc tương tác với SQL Server không khó. Cái khó là thời gian 5 năm qua tôi chưa code một dòng .NET nào nên giờ quên sạch. Vậy là đành phải tìm cách sử dụng ngôn ngữ mình biết nhiều nhất (PHP) để làm việc với SQL Server.
Để thao tác với MS SQL Server trên nền PHP, bạn cần phải bổ sung cho PHP của bạn thêm sức mạnh để đọc hiểu cơ sở dữ liệu. May mắn thay, anh Gate đẹp trai không đến mức ghét PHP nên đã chuẩn bị một bộ PHP driver để làm việc với RDBMS SQL Server của anh ấy. Trọng tâm của bộ driver này là PDO_SQLSRV giúp đóng vai trò như một API để thao tác với MS SQL Server.
Thực tế, MySQL là cơ sở dữ liệu sử dụng cho PHP và SQL Server là cơ sở dữ liệu sử dụng cho ASP. Sau đây tôi sẽ hướng dẫn bạn làm ngược lại điều đó.
Cài đặt ODBC Driver for SQL Server
ODBC (Open DataBase Connectivity) cung cấp một phương pháp API phần mềm chuẩn cho việc sử dụng các hệ quản trị cơ sở dữ liệu (DBMS). Mục đích của ODBC là làm độc lập với các ngôn ngữ lập trình, các hệ cơ sở dữ liệu, và hệ điều hành.
Nó ám chỉ khả năng kết nối được “mọi cơ sở dữ liệu” bất kỳ nào mà không quan tâm đến việc dữ liệu hiện tại đang được quản lí bởi hệ quản trị cơ sở dữ liệu nào.
Download: https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server
Các bạn tải về và chạy để cài đặt ODBC.
Cài đặt Microsoft Drivers for PHP for SQL Server
Trình điều khiển Microsoft cho PHP cho SQL Server cho phép tích hợp với SQL Server cho các ứng dụng PHP. Nó bao gồm các phần mở rộng PHP cho phép đọc và ghi dữ liệu SQL Server từ bên trong các tập lệnh PHP.
Download: https://learn.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server
Sau khi tải về các bạn giải nén file và chép tất cả các file DLL vào folder php execute C:\xampp\php\ext
Sau đó, thiết lập PHP nạp driver (xem các driver tải về) bằng cách thêm vào php.ini cấu hình tương ứng với bản PHP (Ví dụ PHP 7.4):
extension=php_pdo_sqlsrv_74_ts_x64.dll
extension=php_sqlsrv_74_ts_x64.dll
Kết nối PHP đến SQL Server
Nếu sử dụng VSC để viết code, để nó gợi ý các hàm của extension này thì thiết lập như sau: Vào Settings, gõ tìm kiếm cụm từ: @ext:bmewburn.vscode-intelephense-client, dưới mục Stubs bấm vào Add item và chọn thêm: sqlsrv và pdo_sqlsrv
Giả sử SQL Server có các thông tin sau:
- Địa chỉ server: localhost hoặc 127.0.0.1
- Cổng kết nối: 1433
- Tài khoản: sa
- Password: password
- CSDL làm việc: testdb
<?php
/* Địa chỉ SQL Server */
$serverName = "127.0.0.1,1433";
/* Tài khoản kết nối */
$uid = 'sa';
$pwd = 'password';
/* Cấu hình kết nối */
$connectionInfo = [ "UID"=>$uid, "PWD"=>$pwd, "Database"=>"testdb" ];
/* Thực hiện kết nối */
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Không kết nối được";
die( print_r( sqlsrv_errors(), true));
}
/* Thực hiện truy vấn dữ liệu, lấy 5 dòng đầu tiên của bảng Sanpham */
$tsql = "SELECT TOP(5) TenSanpham, Gia FROM Sanpham";
/* Chạy câu truy vấn */
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false )
{
echo "Lỗi truy vấn.</br>";
die( print_r( sqlsrv_errors(), true));
}
/* Đọc các dòng thông tin. */
$rows = [];
while( $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) )
{
$rows[] = $row;
}
print_r($rows);
sqlsrv_free_stmt( $stmt); // Giải phóng tài nguyên câu truy vấn
sqlsrv_close( $conn); // Giải phóng, ngắt kết nối SQL Server
?>
Sử dụng kết nối hướng đối tượng – PDO_SQLSRV
PDO_SQLSRV nó triển khai giao diện PHP Data Objects (PDO) của PHP, cung cấp chức năng truy vấn CSDL theo chuẩn PDO thống nhất (bạn thực hiện kết nối, truy vấn … giống nhau dù là MySQL, SQLite …). Bạn làm việc với CSDL thông qua giao lớp PDO.
Mặc dù bạn có thể chạy ngay câu truy vấn bằng phương thức PDO::query để trả về PDOStatement, nhưng trong các truy vấn cần truyền tham số – để an toàn bạn nên sử dụng phương thức PDO::prepare PDO::prepare, sau đó truyền tham số với PDOStatement::bindValue
<?php
/* Địa chỉ SQL Server */
$serverName = "127.0.0.1,1433";
/* Tài khoản kết nối */
$uid = 'sa';
$pwd = 'password';
$database = 'testdb';
// Tạo kết nối
try {
// Chú ý thông tin kết nối bắt đầu bởi sqlsrv: cho biết PDO dùng driver PDO_SQLSRV
$conn = new PDO( "sqlsrv:server=$serverName;Database = $database", $uid, $pwd);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch( PDOException $e ) {
die( "Lỗi kết nối MS SQL Server: " . $e->getMessage());
}
/* Thực hiện truy vấn dữ liệu, lấy 5 dòng đầu tiên của bảng Sanpham */
$number_row = 5;
/* Viết câu truy vấn, có tham số :number_row */
$tsql = "SELECT TOP(:number_row) TenSanpham, Gia FROM Sanpham";
$stmt = $conn->prepare($tsql);
/* Truyền tham số */
$stmt->bindParam(':number_row', $number_row, PDO::PARAM_INT);
/* Chạy câu truy vấn, trả về PDOStatement */
$stmt->execute();
/* Đọc các dòng thông tin. */
$rows = [];
while( $row = $stmt->fetch(SQLSRV_FETCH_ASSOC))
{
$rows[] = $row;
}
print_r($rows);
$stmt = null; // Giải phóng tài nguyên câu truy vấn
$conn = null; // Giải phóng, ngắt kết nối SQL Server
?>