Mulai cepat: Menyambungkan dan membuat kueri dengan Microsoft Drivers for PHP for SQL Server

Gunakan quickstart ini untuk menginstal driver PHP, terhubung ke Azure SQL dengan identitas Microsoft Entra Anda, dan jalankan query Transact-SQL berparameter (T-SQL) terhadap AdventureWorksLT data contoh. Pilih API prosedural SQLSRV atau API PDO_SQLSRV. Kedua sampel membaca pengaturan koneksi dari variabel lingkungan dan menghasilkan hasil yang sama.

Kueri membaca data produk dan tidak membuat objek basis data.

Sebelum Anda mulai

1. Instal PHP dan driver

Pilih sistem operasi Anda. Salin seluruh blok perintah, tempelkan ke terminal yang ditentukan, lalu jalankan.

Buka PowerShell sebagai administrator. Salin dan jalankan blok ini:

winget install --exact --id PHP.PHP.8.5 --source winget --accept-package-agreements --accept-source-agreements
winget install --exact --id Microsoft.msodbcsql.18 --source winget --accept-package-agreements --accept-source-agreements

$env:Path = [Environment]::GetEnvironmentVariable("Path", "Machine") + ";" +
    [Environment]::GetEnvironmentVariable("Path", "User")
New-Item -ItemType Directory -Force C:\php-quickstart | Out-Null
Set-Location C:\php-quickstart

$phpDirectory = Split-Path (Get-Command php.exe -ErrorAction Stop).Source
$phpIni = Join-Path $phpDirectory "php.ini"
if (-not (Test-Path $phpIni)) {
    Copy-Item (Join-Path $phpDirectory "php.ini-development") $phpIni
}

$configuration = [System.IO.File]::ReadAllText($phpIni)
$configuration = $configuration -replace '(?m)^\s*;\s*extension_dir\s*=\s*"ext"\s*$', 'extension_dir = "ext"'
$configuration = $configuration -replace '(?m)^\s*;\s*extension\s*=\s*openssl\s*$', 'extension=openssl'
$configuration = $configuration -replace '(?m)^\s*;\s*extension\s*=\s*zip\s*$', 'extension=zip'
[System.IO.File]::WriteAllText($phpIni, $configuration)

Invoke-WebRequest https://github.com/php/pie/releases/latest/download/pie.phar -OutFile pie.phar
php .\pie.phar install microsoft/sqlsrv
php .\pie.phar install microsoft/pdo_sqlsrv

php --version
php --ri sqlsrv
php --ri pdo_sqlsrv

Tiga perintah terakhir menampilkan versi PHP dan ekstensi yang terpasang. Tutup jendela administrator setelah mereka berhasil.

Jika salah satu php --ri perintah melaporkan bahwa ekstensi tidak ada, buka Pemecahan Masalah Instalasi sebelum melanjutkan.

2. Atur informasi koneksi

Ganti <server> dan <database> di dalam blok untuk sistem operasi Anda. Salin dan jalankan seluruh blok di terminal yang sama yang akan Anda gunakan untuk menjalankan PHP.

Set-Location C:\php-quickstart
$env:SQL_SERVER = "tcp:<server>.database.windows.net,1433"
$env:SQL_DATABASE = "<database>"
$env:SQL_AUTHENTICATION = "ActiveDirectoryIntegrated"

Important

Kedua sampel mengaktifkan enkripsi dan memvalidasi sertifikat server. Jika server Anda menggunakan sertifikat dari otoritas sertifikat privat (CA), instal sertifikat CA root dan CA perantara penerbit di penyimpanan kepercayaan sistem operasi klien. Atur SQL_SERVER menjadi nama yang tercantum dalam Subject Alternative Name atau Common Name sertifikat. Jika tidak, koneksi gagal sebelum kueri dijalankan. Untuk informasi lebih lanjut, lihat Certificate chain not trusted dan Configure SQL Server encryption.

TrustServerCertificate=true melewati validasi identitas server. Gunakan hanya untuk mendiagnosis lingkungan uji lokal yang terisolasi, bukan sebagai konfigurasi kepercayaan untuk lingkungan produksi atau bersama.

3. Buat dan jalankan contoh

Pilih satu API PHP. Buat file bernama dengan menggunakan kode di tab yang dipilih, lalu jalankan perintah setelah kode tersebut.

Buat quickstart-sqlsrv.php dengan kode berikut:

<?php
declare(strict_types=1);

$server = getenv('SQL_SERVER') ?: null;
$database = getenv('SQL_DATABASE') ?: null;
$authentication = getenv('SQL_AUTHENTICATION') ?: null;

if ($server === null || $database === null || $authentication === null) {
    throw new RuntimeException('Set SQL_SERVER, SQL_DATABASE, and SQL_AUTHENTICATION.');
}
if (!in_array($authentication, ['SqlPassword', 'ActiveDirectoryIntegrated', 'ActiveDirectoryMsi'], true)) {
    throw new RuntimeException(
        'Set SQL_AUTHENTICATION to SqlPassword, ActiveDirectoryIntegrated, or ActiveDirectoryMsi.'
    );
}

$user = null;
$password = null;
if ($authentication === 'SqlPassword') {
    $user = getenv('SQL_USER') ?: null;
    $password = getenv('SQL_PASSWORD') ?: null;
    if ($user === null || $password === null) {
        throw new RuntimeException('Set SQL_USER and SQL_PASSWORD for SqlPassword authentication.');
    }
}

$options = [
    'Database' => $database,
    'Authentication' => $authentication,
    'Driver' => 'ODBC Driver 18 for SQL Server',
    'Encrypt' => true,
    'TrustServerCertificate' => false,
];
if ($authentication === 'SqlPassword') {
    $options['UID'] = $user;
    $options['PWD'] = $password;
}

$connection = sqlsrv_connect($server, $options);
if ($connection === false) {
    throw new RuntimeException(print_r(sqlsrv_errors(), true));
}

$sql = <<<'SQL'
SELECT TOP (5) ProductID, Name
FROM SalesLT.Product
WHERE ProductID > ?
ORDER BY ProductID;
SQL;
$parameters = [0];
$statement = sqlsrv_query($connection, $sql, $parameters);
if ($statement === false) {
    $errors = sqlsrv_errors();
    sqlsrv_close($connection);
    throw new RuntimeException(print_r($errors, true));
}

$rows = [];
while (($row = sqlsrv_fetch_array($statement, SQLSRV_FETCH_ASSOC)) !== null) {
    if ($row === false) {
        $errors = sqlsrv_errors();
        sqlsrv_free_stmt($statement);
        sqlsrv_close($connection);
        throw new RuntimeException(print_r($errors, true));
    }
    $rows[] = $row;
}
sqlsrv_free_stmt($statement);
sqlsrv_close($connection);

if (count($rows) !== 5) {
    throw new RuntimeException('Unexpected query result.');
}
$previousProductId = 0;
foreach ($rows as $row) {
    if ($row['ProductID'] <= $previousProductId || $row['Name'] === '') {
        throw new RuntimeException('Unexpected query result.');
    }
    $previousProductId = $row['ProductID'];
}
printf("%-12s%s\n", 'Product ID', 'Name');
printf("%-12s%s\n", '----------', '----');
foreach ($rows as $row) {
    printf("%-12d%s\n", $row['ProductID'], $row['Name']);
}

Jalankan sampel:

php quickstart-sqlsrv.php

4. Verifikasi hasilnya

Baris produk dapat bervariasi menurut versi AdventureWorksLT. Kedua sampel mengembalikan output yang mirip dengan contoh ini:

Product ID  Name
----------  ----
680         HL Road Frame - Black, 58
706         HL Road Frame - Red, 58
707         Sport-100 Helmet, Red
708         Sport-100 Helmet, Black
709         Mountain Bike Socks, M

Setiap contoh memeriksa bahwa kueri mengembalikan lima produk dengan nama yang tidak kosong dan ID produk yang naik sebelum mencetak baris-baris tersebut. Kemudian ia melepaskan pernyataan dan menutup koneksi. Query tidak meninggalkan objek atau data database apa pun untuk dihapus.

Gunakan metode autentikasi lain

Contoh juga menerima identitas terkelola dan autentikasi SQL Server tanpa mengubah file PHP.

Identitas yang dikelola

Untuk aplikasi yang dihosting di Azure, aktifkan identitas terkelola dan buat pengguna database-nya. Atur mode server, database, dan autentikasi dalam konfigurasi aplikasi:

SQL_SERVER=tcp:<server>.database.windows.net,1433
SQL_DATABASE=<database>
SQL_AUTHENTICATION=ActiveDirectoryMsi

Jangan atur SQL_USER atau SQL_PASSWORD.

Untuk database SQL di Microsoft Fabric, berikan izin item Baca identitas melalui kontrol akses Fabric. Gunakan endpoint koneksi SQL dari item basis data, bukan endpoint analitik SQL. Database SQL di Fabric tidak mendukung autentikasi SQL.

autentikasi SQL Server

Gunakan autentikasi SQL Server hanya untuk instance SQL Server yang Anda kendalikan, seperti kontainer pengembangan lokal yang terisolasi. Simpan kredensial dalam konfigurasi aplikasi atau penyimpanan rahasia. Jangan komitmenkan mereka ke kontrol sumber.

$env:SQL_SERVER = "tcp:<server>,1433"
$env:SQL_DATABASE = "<database>"
$env:SQL_AUTHENTICATION = "SqlPassword"
$env:SQL_USER = "<user_id>"
$env:SQL_PASSWORD = "<password>"

Untuk metode autentikasi Microsoft Entra lainnya, lihat Hubungkan menggunakan autentikasi Microsoft Entra.

Pemecahan masalah instalasi

Gunakan pemeriksaan ini jika blok instalasi berhenti atau perintah verifikasi gagal.

Get-Command php.exe
php --ini
php --ri sqlsrv
php --ri pdo_sqlsrv
Get-OdbcDriver -Name "ODBC Driver 18 for SQL Server"

Jika Get-Command tidak menemukan php.exe, tutup semua terminal, buka jendela PowerShell baru, dan jalankan pemeriksaan lagi. Jika sebuah php --ri perintah melaporkan Ekstensi tidak ada, jalankan ulang perintah instalasi PIE dari C:\php-quickstart.

Jika sebuah koneksi melaporkan FA001 dan menyatakan bahwa opsi autentikasi tidak dapat digunakan dengan Integrated Security, pastikan bahwa SQL_AUTHENTICATION bernilai tepat ActiveDirectoryIntegrated. Jalankan php --ri sqlsrv atau php --ri pdo_sqlsrv periksa versi driver PHP, dan perbarui driver jika sudah lebih tua dari 5.10.1.

Pembersihan

Sampel tersebut merilis pernyataan mereka dan menutup koneksi mereka. Mereka tidak membuat objek basis data atau menyimpan data.

Pengaturan koneksi berlaku untuk sesi terminal saat ini. Tutup terminal setelah selesai.

Untuk pengaturan percobaan ulang produksi, timeout, logging, dan failover, gunakan baseline produksi daripada memperpanjang sampel run pertama ini.