Stöd för LocalDB

Ladda ned PHP-drivrutin

SQL Server Express LocalDB är ett lättviktigt användarinstansläge av SQL Server Express, tillgängligt endast på Windows. Båda drivrutinerna ansluter till en LocalDB-instans på samma sätt som de ansluter till vilken namngiven instans som helst, genom att använda servernamnsformuläret (localdb)\<instance-name> .

Anmärkningar

LocalDB körs under ett Windows-användarkonto. Programmen använder Windows-integrerad autentisering, inte Microsoft Entra-autentisering. Använd det för lokal Windows-utveckling när en databasinstans per användare passar ditt arbetsflöde. Det är inte en containerimage eller en Azure-tjänst.

Note

LocalDB finns inte tillgängligt på Linux eller macOS. Koppla istället till en SQL Server-instans på en stödd värd. För containrar, kontrollera vilken SQL Server on Linux som stöds; anta inte att varje macOS- eller Linux-arkitektur kan köra SQL Server-containeravbilden.

Koppla till en LocalDB-instans

Installera en stödd SQL Server Express LocalDB-version samt både ODBC-kravet och PHP-tillägget du väljer. LocalDB-installationen laddar inte en PHP-tillägg.

  1. Kör sqllocaldb.exe i i din Windows-terminal för att lista dina instanser.
  2. Om det MSSQLLocalDB inte finns, kör sqllocaldb.exe create MSSQLLocalDB.
  3. Kör sqllocaldb.exe start MSSQLLocalDB, sedan sqllocaldb.exe info MSSQLLocalDB för att inspektera instansen. Utför dessa steg som Windows-kontot som kör PHP-programmet.
  4. Spara och kör ett av programmen med kommandorads-PHP. Var och en ansluter till master som standard och verifierar att målet faktiskt är LocalDB. Ingen exempeldatabas eller SQL-lösenord krävs.

Instansnamnet är lokalt för Windows-maskinen och det konto som äger den. Det är inte ett DNS-värdnamn, TCP-port eller anslutning till en annan dator.

SQLSRV

Spara detta program som connect-localdb-sqlsrv.php, och kör php connect-localdb-sqlsrv.php.

<?php
$instance = getenv('LOCALDB_INSTANCE') ?: 'MSSQLLocalDB';
$database = getenv('LOCALDB_DATABASE');
if ($database === false || $database === '') {
    $database = 'master';
}
$file = getenv('LOCALDB_MDF');
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';
$options = ['Database' => $databaseValue, 'LoginTimeout' => 30, 'CharacterSet' => 'UTF-8'];
if ($file !== false && $file !== '') {
    if ($database === 'master' || !is_file($file)) {
        throw new RuntimeException('Set a non-master database name and an accessible MDF path.');
    }
    $options['AttachDBFileName'] = '{' . str_replace('}', '}}', $file) . '}';
}
$conn = sqlsrv_connect('(localdb)\\' . $instance, $options);
if ($conn === false) {
    throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$stmt = null;
try {
    $stmt = sqlsrv_query(
        $conn,
        "SELECT DB_NAME() AS DatabaseName, CAST(SERVERPROPERTY('IsLocalDB') AS int) AS IsLocalDB"
    );
    if ($stmt === false) {
        throw new RuntimeException(print_r(sqlsrv_errors(), true));
    }
    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
    if ($row === false) {
        throw new RuntimeException(print_r(sqlsrv_errors(), true));
    }
    if ($row !== ['DatabaseName' => $database, 'IsLocalDB' => 1]) {
        throw new RuntimeException('Expected the selected LocalDB database.');
    }
    echo 'LocalDB database: ', $row['DatabaseName'], PHP_EOL;
} finally {
    if (is_resource($stmt)) {
        sqlsrv_free_stmt($stmt);
    }
    sqlsrv_close($conn);
}

PDO_SQLSRV

Spara detta separata program som connect-localdb-pdo.php, och kör php connect-localdb-pdo.php.

<?php
$instance = getenv('LOCALDB_INSTANCE') ?: 'MSSQLLocalDB';
$database = getenv('LOCALDB_DATABASE');
if ($database === false || $database === '') {
    $database = 'master';
}
$file = getenv('LOCALDB_MDF');
$databaseValue = '{' . str_replace('}', '}}', $database) . '}';
$dsn = "sqlsrv:Server=(localdb)\\$instance;Database=$databaseValue;LoginTimeout=30";
if ($file !== false && $file !== '') {
    if ($database === 'master' || !is_file($file)) {
        throw new RuntimeException('Set a non-master database name and an accessible MDF path.');
    }
    $dsn .= ';AttachDBFileName={' . str_replace('}', '}}', $file) . '}';
}
$pdo = new PDO($dsn, null, null, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true,
    PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
]);
$stmt = null;
try {
    $stmt = $pdo->query(
        "SELECT DB_NAME() AS DatabaseName, CAST(SERVERPROPERTY('IsLocalDB') AS int) AS IsLocalDB"
    );
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row !== ['DatabaseName' => $database, 'IsLocalDB' => 1]) {
        throw new RuntimeException('Expected the selected LocalDB database.');
    }
    echo 'LocalDB database: ', $row['DatabaseName'], PHP_EOL;
} finally {
    $stmt = null;
    $pdo = null;
}

Förväntad utgång med standardkonfiguration:

LocalDB database: master

SQLSRV returnerar en anslutningsresurs och rapporterar anslutningsfel som false. PDO returnerar ett objekt och kastar PDOException om konstruktionen misslyckas. PDO-programmet möjliggör explicit numerisk hämtning så att int-värdet är PHP int, vilket matchar SQLSRV-resultatet. Båda använder UTF-8 för teckendata och frigör sats- och anslutningshandtag även när en fråga misslyckas.

Välj en befintlig databas eller bifoga en fil

Programmen accepterar dessa valfria processvariabler:

Variabel Meaning
LOCALDB_INSTANCE Instansnamn utan prefix.(localdb)\ Standardinställningen är MSSQLLocalDB.
LOCALDB_DATABASE Ett befintligt databasnamn, eller namnet som ska ges åt en bifogad databas. Standardinställningen är master.
LOCALDB_MDF Absolut sökväg till en befintlig, tillgänglig .mdf fil att bifoga. Utelämna det när du ansluter till en redan registrerad databas.

För att använda en databas som redan är registrerad hos instansen, sätt LOCALDB_DATABASE och lämna LOCALDB_MDF osatt. För att ansluta en befintlig databasfil, ställ in båda. Till exempel i PowerShell:

$env:LOCALDB_DATABASE = 'myData'
$env:LOCALDB_MDF = 'C:\Data\myData.mdf'

Använd en databasfil som är förberedd för detta ändamål, inte en fil som fortfarande är kopplad till en annan körande instans. Ge Windows-kontot tillgång till databasfilerna och deras katalog. AttachDBFileName skapar inte en saknad MDF-fil, migrerar inte en databas eller löser en inkompatibel databasfilversion. En anslutning registrerar databasen hos databasinstansen; att stänga PHP kopplar inte bort eller tar bort den. Testa varje API:s anslutningsväg från ett frikopplat tillstånd om du behöver verifiera båda oberoende av varandra.

Serversträngens backslash escapas i PHP-strängar med enkla citationstecken som \\. PHP-dubbelciterade strängar tolkar också backslashes och variabler, så PDO-programmet konstruerar instanssträngen medvetet. Båda programmen escaperar databasnamnet för anslutningen men behåller det ursprungliga namnet för validering och resultatkontroller. De kontrollerar också den faktiska filsystemets sökväg innan de escaper bilagevärdet. För varje anslutningsvärde dubblerar de avslutande klammerparenteser och omsluter värdet med klammerparenteser. SQLSRV kräver att escapning krävs även för strängalternativ som tillhandahålls i dess anslutningsarray. Ställ in LOCALDB_DATABASE och LOCALDB_MDF till det faktiska namnet och sökvägen, utan att lägga till eller dubbla klammerparenteser själv.

Dessa anslutningar använder en lokal instans, inte en fjärrserver. För fjärr-SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL Database in Fabric eller Warehouse in Fabric, använd den faktiska service-endpointen. Ställ in autentisering, kryptering och certifikatvalidering uttryckligen. För mer information, se Ansluta till servern.

Diagnostisera konto- och instansproblem

Du kan också hantera databaser för en LocalDB-instans från kommandoraden med sqlcmd, till exempel sqlcmd -S "(localdb)\MSSQLLocalDB". En LocalDB-instans som ditt interaktiva Windows-konto äger ger inte automatiskt tillgång till en Internet Information Services (IIS) applikationspoolidentitet. Kontrollera instansägarskap och filbehörigheter när du byter konto som kör PHP. För mer information, se SQL Server Express LocalDB.

Symtom Kontrollera
sqllocaldb.exe hittas inte Bekräfta att LocalDB är installerat och att dess verktyg är tillgängligt för terminalen. Att installera PHP-drivrutinerna räcker inte.
Instansen hittas inte Visa instanser med samma Windows-konto som kör PHP, och kontrollera LOCALDB_INSTANCE.
Den initiala anslutningen tar för lång tid Starta instansen uttryckligen och försök igen med den dokumenterade tidsgränsen för inloggning. Undersök ett fel vid instansstart istället för att försöka om och om igen.
master Fungerar, men myData gör det inte Bekräfta att databasen finns i den instansen, eller konfigurera en tillgänglig anslutningsfil och ett databasnamn.
Det gick inte att bifoga filen Kontrollera exakt sökväg, filägarskap, katalogbehörigheter, om filen redan används och LocalDB-versionskompatibilitet.
Terminal PHP fungerar men IIS gör det inte Jämför kontot, instansägarskap, filåtkomst, runtime-konfiguration och tilläggsladdning. Anta inte att ett interaktivt test bevisar åtkomst till webbhotellet.

Uppstart av LocalDB och ägarskap per användare tillhör SQL Server LocalDB och Windows. PHP-tilläggen erbjuder anslutningsalternativ via ODBC. Lägg inte till SQL-uppgifter eller Microsoft Entra-alternativ för att kompensera för ett problem med instansägande.