Ondersteuning voor LocalDB

PHP-stuurprogramma downloaden

SQL Server Express LocalDB is een lichtgewicht gebruikersmodus van SQL Server Express, beschikbaar alleen op Windows. Beide drivers verbinden met een LocalDB-instantie op dezelfde manier als met een benoemde instantie, door gebruik te maken van het (localdb)\<instance-name> servernaamformulier.

Opmerkingen

LocalDB draait onder een Windows-gebruikersaccount. De programma's gebruiken Windows-geïntegreerde authenticatie, niet Microsoft Entra-authenticatie. Gebruik het voor lokale Windows-ontwikkeling wanneer een database-instantie per gebruiker in je workflow past. Het is geen containerimage of Azure-dienst.

Note

LocalDB is niet beschikbaar op Linux of macOS. Maak in plaats daarvan verbinding met een SQL Server-instantie op een ondersteunde host. Voor containers, controleer de ondersteunde platforms voor SQL Server on Linux; ga er niet van uit dat elke macOS- of Linux-architectuur de SQL Server-containerimage kan draaien.

Verbind met een LocalDB-instantie

Installeer een ondersteunde SQL Server Express LocalDB-release en zowel de ODBC-vereiste als de PHP-extensie die je kiest. LocalDB-installatie laadt geen PHP-extensie.

  1. Voer sqllocaldb.exe i het uit in je Windows-terminal om je instanties te vermelden.
  2. Als MSSQLLocalDB niet bestaat, voer sqllocaldb.exe create MSSQLLocalDB uit.
  3. Voer sqllocaldb.exe start MSSQLLocalDB uit en vervolgens sqllocaldb.exe info MSSQLLocalDB om de instance te inspecteren. Voer deze stappen uit als het Windows-account waaronder het PHP-programma wordt uitgevoerd.
  4. Sla een van de programma's op en voer het uit met de commandoregel-PHP. Elk maakt standaard verbinding met master en verifieert dat het doelwit daadwerkelijk LocalDB is. Er is geen voorbeelddatabase of SQL-wachtwoord nodig.

De instantienaam is lokaal op de Windows-machine en het eigendom van het account. Het is geen DNS-hostnaam, TCP-poort of verbinding met een andere computer.

SQLSRV

Sla dit programma op als connect-localdb-sqlsrv.php, en voer php connect-localdb-sqlsrv.php uit.

<?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

Sla dit aparte programma op als connect-localdb-pdo.php, en voer php connect-localdb-pdo.php. uit

<?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;
}

Verwachte output met de standaardconfiguratie:

LocalDB database: master

SQLSRV geeft een verbindingsresource terug en rapporteert verbindingsstoringen als false. PDO retourneert een object en gooit PDOException als de constructie faalt. Het PDO-programma schakelt numeriek ophalen expliciet in, zodat de int-waarde PHP int is, overeenkomstig het SQLSRV-resultaat. Beide gebruiken UTF-8 voor tekengegevens en geven instructie- en verbindingshandles vrij, zelfs wanneer een query faalt.

Selecteer een bestaande database of koppel een bestand

De programma's accepteren deze optionele procesvariabelen:

Variabele Meaning
LOCALDB_INSTANCE Instantienaam zonder het (localdb)\ voorlicht. Wordt standaard ingesteld op MSSQLLocalDB.
LOCALDB_DATABASE Een bestaande databasenaam, of de naam om een gekoppelde database te geven. Wordt standaard ingesteld op master.
LOCALDB_MDF Absoluut pad naar een bestaand, toegankelijk .mdf bestand om aan te voegen. Laat het weg bij het verbinden met een reeds geregistreerde database.

Om een database te gebruiken die al bij de instantie is geregistreerd, zet LOCALDB_DATABASE en laat LOCALDB_MDF leeg. Om een bestaand databasebestand te koppelen, stel je beide in. Bijvoorbeeld in PowerShell:

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

Gebruik een databasebestand dat hiervoor is voorbereid, niet een bestand dat nog aan een andere draaiende instantie is gekoppeld. Verleen het Windows-account toegang tot de databasebestanden en hun map. AttachDBFileName maakt geen ontbrekend MDF-bestand aan, migreert geen database, en lost geen incompatibele databasebestandversie op. Een bijlage registreert de database bij de instantie; het sluiten van PHP maakt het niet los of verwijdert het. Test het attachmentpad van elke API vanuit een losgekoppelde toestand als je beide onafhankelijk moet verifiëren.

De backslash van de serverstring wordt in PHP-strings tussen enkele aanhalingstekens geëscaped als \\. PHP-dubbel-aanhalingstekens interpreteren ook backslashes en variabelen, dus het PDO-programma construeert de instantiestring bewust. Beide programma's ontwijken de databasenaam voor de verbinding, terwijl ze de oorspronkelijke naam behouden voor validatie en resultaatcontroles. Ze controleren ook het daadwerkelijke bestandssysteempad voordat ze de bijlagewaarde vermijden. Voor elke verbindingswaarde verdubbelen ze de sluitende accolades en omsluiten ze de waarde met accolades. SQLSRV vereist dat escaping wordt toegepast, zelfs voor stringopties die in zijn verbindingsarray worden geleverd. Stel LOCALDB_DATABASE en LOCALDB_MDF in op de daadwerkelijke naam en het pad, zonder zelf beugels toe te voegen of te verdubbelen.

Deze verbindingen gebruiken een lokale instantie, geen externe server. Voor remote SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, SQL database in Fabric of Warehouse in Fabric, gebruik je het daadwerkelijke service-eindpunt. Stel authenticatie, encryptie en certificaatvalidatie expliciet in. Voor meer informatie, zie Verbinden met de server.

Account- en instanceproblemen diagnosticeren

Je kunt ook de databases van een LocalDB-instantie beheren vanuit de opdrachtregel met sqlcmd, bijvoorbeeld sqlcmd -S "(localdb)\MSSQLLocalDB". Een LocalDB-instantie die eigendom is van je interactieve Windows-account, verleent niet automatisch toegang tot de identiteit van een Internet Information Services (IIS)-applicatiepool. Controleer het eigendom van de instantie en de bestandsrechten bij het wijzigen van het account waarmee PHP wordt uitgevoerd. Voor meer informatie, zie SQL Server Express LocalDB.

Symptom Cheque
sqllocaldb.exe is niet gevonden Bevestig dat LocalDB is geïnstalleerd en dat de utility beschikbaar is voor de terminal. Het installeren van de PHP-drivers is niet voldoende.
De instantie wordt niet gevonden Geef instanties weer met hetzelfde Windows-account dat PHP draait, en controleer LOCALDB_INSTANCE.
De eerste verbinding duurt te lang Start de instance expliciet en probeer het opnieuw met de gedocumenteerde logintimeout. Onderzoek een fout in het opstarten van een instance in plaats van het eindeloos opnieuw te proberen.
master werkt, maar myData werkt niet Bevestig dat de database in die instantie bestaat, of configureer een toegankelijk koppelingsbestand en een databasenaam.
Bestandsbijlage mislukt Controleer het exacte pad, het eigendom van het bestand, de maprechten, of het bestand al in gebruik is, en de compatibiliteit van de LocalDB-versie.
Terminal PHP werkt, maar IIS niet Vergelijk het account, het eigendom van de instantie, bestandstoegang, runtime-configuratie en extensie-laden. Ga er niet van uit dat een interactieve test toegang tot webhosting bewijst.

Het opstarten van LocalDB en het eigendom per gebruiker behoren tot SQL Server LocalDB en Windows. De PHP-extensies bieden verbindingsopties via ODBC. Voeg geen SQL-inloggegevens of Microsoft Entra-opties toe om een probleem met instantie-eigendom te compenseren.