Hızlı Başlangıç: SQL Server için PHP için Microsoft Sürücüleri ile bağlanın ve sorgulayın

Bu hızlı başlangıç'ı kullanarak PHP sürücülerini yükleyin, Microsoft Entra kimliğinizle Azure SQL'ye bağlanın ve örnek veriye göre parametreli Transact-SQL (T-SQL) sorgusu AdventureWorksLT çalıştırın. Ya SQLSRV prosedürel API'sini ya da PDO_SQLSRV API'sini seçin. Her iki örnek de ortam değişkenlerinden bağlantı ayarlarını okur ve aynı sonucu verir.

Sorgu ürün verilerini okur ve veritabanı nesneleri oluşturmaz.

Başlamadan önce

1. PHP ve sürücüleri kur

İşletim sisteminizi seçin. Tüm komut bloğunu kopyalayın, belirtilen terminale yapıştırın ve çalıştırın.

PowerShell'i yönetici olarak açın. Bu bloğu kopyalayın ve çalıştırın:

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

Son üç komut ise kurulu PHP ve uzantı sürümlerini gösterir. Başarılı olduktan sonra yönetici penceresini kapatın.

Herhangi bir php --ri komut uzantının olmadığını bildirirse, devam etmeden önce Kurulum sorun giderme bölümüne gidin.

2. Bağlantı bilgilerini ayarlayın

İşletim sisteminize uygun blokta <server> ve <database> öğelerini değiştirin. Tüm bloğu PHP çalıştırmak için kullanacağınız terminalde kopyalayıp çalıştırın.

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

Important

Her iki örnek de şifrelemeyi etkinleştirir ve sunucu sertifikasını doğrular. Sunucunuz özel bir sertifika otoritesinden (CA) gelen sertifika kullanıyorsa, veren kök ve ara CA sertifikalarını istemci işletim sistemi güven deposuna yükleyin. Sertifikanın Konu Alternatif İsim veya Ortak İsim içinde bir isim olarak ayarlanır SQL_SERVER . Aksi takdirde, bağlantı sorgu çalışmadan önce başarısız olur. Daha fazla bilgi için Sertifika zinciri güvenilmiyor ve SQL Server şifrelemesini Yapılandır bölümlerine bakabilirsiniz.

TrustServerCertificate=true sunucu kimliği doğrulamasını atlar. Sadece izole bir yerel test ortamını teşhis etmek için kullanın, üretim veya paylaşılan ortamlar için bir güven yapılandırması olarak değil.

3. Bir örnek oluşturun ve çalıştırın

Bir PHP API seçin. Seçilmiş sekmedeki kodu kullanarak adlandırılmış dosyayı oluşturun ve ardından koddan sonra komutu çalıştırın.

Aşağıdaki kodla oluşturun quickstart-sqlsrv.php :

<?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']);
}

Örneği çalıştırın:

php quickstart-sqlsrv.php

4. Sonucu doğrulayın

Ürün sıraları AdventureWorksLT sürümüne göre değişebilir. Her iki örnek de bu örneğe benzer bir çıktı vermektedir:

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

Her örnek, satırları yazdırmadan önce sorgunun adları boş olmayan ve ürün kimlikleri artan sırada olan beş ürün döndürdüğünü kontrol eder. Sonra ifadeyi serbest bırakır ve bağlantıyı kapatır. Sorgu, kaldırılacak herhangi bir veritabanı nesnesi veya veri bırakmıyor.

Başka bir kimlik doğrulama yöntemi kullanın

Örnekler ayrıca PHP dosyalarını değiştirmeden yönetilen kimlik ve SQL Server doğrulamasını da kabul eder.

İdare edilen kimlik

Azure'da barındırılan bir uygulama için, yönetilen bir kimlik etkinleştirin ve veritabanı kullanıcısını oluşturun. Uygulamanın yapılandırmasında sunucu, veritabanı ve kimlik doğrulama modunu ayarlayın:

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

SQL_USER veya SQL_PASSWORD ayarlamayın.

Microsoft Fabric'teki SQL veritabanı için, kimliğe Okuma öğe iznini Fabric erişim denetimleri aracılığıyla verin. SQL bağlantı noktasını veritabanı öğesinden kullanın, SQL analitik uç noktasından değil. Fabric'teki SQL veritabanı SQL kimlik doğrulamasını desteklemiyor.

SQL Server kimlik doğrulaması

SQL Server doğrulamasını yalnızca kontrol ettiğiniz SQL Server örnekleri için, örneğin izole yerel geliştirme konteyneri için kullanın. Kimlik bilgilerini uygulama yapılandırmasında veya gizli bir depoda tutun. Onları kaynak kontrolüne taahhüt etme.

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

Diğer Microsoft Entra kimlik doğrulama yöntemleri için bkz. Connect using Microsoft Entra authentication.

Kurulum sorun giderme

Kurulum bloğu durursa veya doğrulama komutu başarısız olursa bu kontrolleri kullanın.

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

Bulamıyorsanız Get-Commandphp.exe, tüm terminalleri kapatın, yeni bir PowerShell penceresi açın ve kontrolleri tekrar çalıştırın. php --ri komutu Uzantı mevcut değil bildirirse, PIE kurulum komutlarını C:\php-quickstart konumundan yeniden çalıştırın.

Eğer bir bağlantı FA001 bildiriyorsa ve Authentication seçeneğinin Entegre Güvenlik ile kullanılamayacağını söylüyorsa, SQL_AUTHENTICATION değerinin tam olarak ActiveDirectoryIntegrated olduğunu doğrulayın. PHP sürücü sürümünü çalıştırın php --ri sqlsrv veya php --ri pdo_sqlsrv kontrol edin, sürücü ise 5.10.1'den eskiyse güncelleyin .

Temizleme

Örnekler açıklamalarını yapar ve bağlantılarını kapatır. Veritabanı nesneleri oluşturmazlar veya verileri kalıcı tutmazlar.

Bağlantı ayarları mevcut terminal oturumuna uygulanır. İşin bittiğinde terminali kapat.

Üretim yeniden denemesi, zaman aşımı, loglama ve failover ayarları için, bu ilk deneme örneğini uzatmak yerine üretim temelini kullanın.