Sök…


Anmärkningar

SQLSRV-drivrutinen är en Microsoft-stödd PHP-förlängning som gör att du kan komma åt Microsoft SQL Server- och SQL Azure-databaser. Det är ett alternativ för MSSQL-drivrutinerna som avskrivs från och med PHP 5.3 och har tagits bort från PHP 7.


SQLSRV-förlängningen kan användas på följande operativsystem:

  • Windows Vista Service Pack 2 eller senare
  • Windows Server 2008 Service Pack 2 eller senare
  • Windows Server 2008 R2
  • Windows 7

SQLSRV-förlängningen kräver att Microsoft SQL Server 2012 Native Client installeras på samma dator som kör PHP. Om Microsoft SQL Server 2012 Native Client inte redan är installerad klickar du på lämplig länk på dokumentationssidan "Krav" .


Gå till följande för att ladda ner de senaste SQLSRV-drivrutinerna: Ladda ner

En fullständig lista över systemkrav för SQLSRV-drivrutiner kan hittas här: Systemkrav

De som använder SQLSRV 3.1+ måste ladda ner Microsoft ODBC Driver 11 för SQL Server

PHP7-användare kan ladda ner de senaste drivrutinerna från GitHub

Microsoft® ODBC Driver 13 för SQL Server stöder Microsoft SQL Server 2008, SQL Server 2008 R2, SQL Server 2012, SQL Server 2014, SQL Server 2016 (Preview), Analytics Platform System, Azure SQL Database och Azure SQL Data Warehouse.

Skapa en anslutning

$dbServer = "localhost,1234"; //Name of the server/instance, including optional port number (default is 1433)
$dbName = "db001"; //Name of the database
$dbUser = "user"; //Name of the user
$dbPassword = "password"; //DB Password of that user

$connectionInfo = array(
    "Database" => $dbName, 
    "UID" => $dbUser,
    "PWD" => $dbPassword
);

$conn = sqlsrv_connect($dbServer, $connectionInfo);

SQLSRV har också en PDO-drivrutin. För att ansluta med PDO:

$conn = new PDO("sqlsrv:Server=localhost,1234;Database=db001", $dbUser, $dbPassword);

Gör en enkel fråga

//Create Connection
$conn = sqlsrv_connect($dbServer, $connectionInfo);

$query = "SELECT * FROM [table]"; 
$stmt = sqlsrv_query($conn, $query);

Obs! Användningen av fyrkantiga parenteser [] är att undkomma table eftersom det är ett reserverat ord . Dessa fungerar på samma sätt som backticks ` gör i MySQL .

Åkalla en lagrad procedur

Så här ringer du en lagrad procedur på servern:

$query = "{call [dbo].[myStoredProcedure](?,?,?)}"; //Parameters '?' includes OUT parameters

$params = array(
    array($name, SQLSRV_PARAM_IN),
    array($age, SQLSRV_PARAM_IN),
    array($count, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_INT) //$count must already be initialised
);

$result = sqlsrv_query($conn, $query, $params);

Göra en parametriserad fråga

$conn = sqlsrv_connect($dbServer, $connectionInfo);

$query = "SELECT * FROM [users] WHERE [name] = ? AND [password] = ?";
$params = array("joebloggs", "pa55w0rd");

$stmt = sqlsrv_query($conn, $query, $params);

Om du planerar att använda samma frågeställning mer än en gång med olika parametrar kan samma uppnås med sqlsrv_prepare() och sqlsrv_execute() , som visas nedan:

$cart = array(
    "apple" => 3,
    "banana" => 1,
    "chocolate" => 2
);

$query = "INSERT INTO [order_items]([item], [quantity]) VALUES(?,?)";
$params = array(&$item, &$qty); //Variables as parameters must be passed by reference

$stmt = sqlsrv_prepare($conn, $query, $params);

foreach($cart as $item => $qty){
    if(sqlsrv_execute($stmt) === FALSE) {
        die(print_r(sqlsrv_errors(), true));
    }
}

Hämtar frågeställningar

Det finns tre huvudsakliga sätt att hämta resultat från en fråga:

sqlsrv_fetch_array ()

sqlsrv_fetch_array() hämtar nästa rad som en matris.

$stmt = sqlsrv_query($conn, $query);

while($row = sqlsrv_fetch_array($stmt)) {
    echo $row[0];
    $var = $row["name"];
    //...
}

sqlsrv_fetch_array() har en valfri andra parameter för att hämta olika typer av array: SQLSRV_FETCH_ASSOC , SQLSRV_FETCH_NUMERIC och SQLSRV_FETCH_BOTH (standard) kan användas; vardera returnerar de associativa, numeriska respektive assosiativa matriserna respektive.


sqlsrv_fetch_object ()

sqlsrv_fetch_object() hämtar nästa rad som ett objekt.

$stmt = sqlsrv_query($conn, $query);

while($obj = sqlsrv_fetch_object($stmt)) {
    echo $obj->field; // Object property names are the names of the fields from the query
    //...
}

sqlsrv_fetch ()

sqlsrv_fetch() gör nästa rad tillgänglig för läsning.

$stmt = sqlsrv_query($conn, $query);

while(sqlsrv_fetch($stmt) === true) {
    $foo = sqlsrv_get_field($stmt, 0); //gets the first field -
}

Hämtar felmeddelanden

När en fråga går fel är det viktigt att hämta felmeddelanden som returneras av föraren för att identifiera orsaken till problemet. Syntaxen är:

sqlsrv_errors([int $errorsOrWarnings]);

Detta returnerar en matris med:

Nyckel Beskrivning
SQLSTATE Tillståndet som SQL Server / OBDC-drivrutinen är i
koda SQL Server-felkoden
meddelande Beskrivningen av felet

Det är vanligt att använda ovanstående funktion så:

$brokenQuery = "SELECT BadColumnName FROM Table_1";
$stmt = sqlsrv_query($conn, $brokenQuery);

if ($stmt === false) {
    if (($errors = sqlsrv_errors()) != null) {
        foreach ($errors as $error) {
            echo "SQLSTATE: ".$error['SQLSTATE']."<br />";
            echo "code: ".$error['code']."<br />";
            echo "message: ".$error['message']."<br />";
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow