Procedura: Recuperare dati binari come flusso usando il driver SQLSRV
Il recupero di dati come flusso è disponibile solo nel driver SQLSRV dei driver di Microsoft per PHP per SQL Server e non è disponibile nel driver PDO_SQLSRV.
I driver Microsoft per PHP per SQL Server sfruttano i flussi PHP per il recupero di grandi quantità di dati binari dal server. In questo argomento viene illustrato come recuperare i dati binari come flusso.
L'uso dei flussi per il recupero dei dati binari, ad esempio di immagini, consente di evitare l'uso di grandi quantità di memoria di script recuperando blocchi di dati anziché caricando l'intero oggetto nella memoria di script.
Esempio
Nell'esempio seguente vengono recuperati dati binari, in questo caso un'immagine, dalla tabella Production.ProductPhoto del database AdventureWorks. L'immagine viene recuperata come flusso e visualizzata nel browser.
Il recupero dei dati dell'immagine come flusso viene eseguito usando sqlsrv_fetch e sqlsrv_get_field specificando flusso binario come tipo restituito. Il tipo restituito viene specificato usando la costante SQLSRV_PHPTYPE_STREAM. Per informazioni sulle costanti di sqlsrv, vedere Costanti (driver Microsoft per PHP per SQL Server).
Nell'esempio si presuppone che SQL Server e il database AdventureWorks siano installati nel computer locale. Quando l'esempio viene eseguito dal browser, tutto l'output viene scritto nel browser.
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Set up the Transact-SQL query. */
$tsql = "SELECT LargePhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID = ?";
/* Set the parameter values and put them in an array. */
$productPhotoID = 70;
$params = array( $productPhotoID);
/* Execute the query. */
$stmt = sqlsrv_query($conn, $tsql, $params);
if( $stmt === false )
{
echo "Error in statement execution.</br>";
die( print_r( sqlsrv_errors(), true));
}
/* Retrieve and display the data.
The return data is retrieved as a binary stream. */
if ( sqlsrv_fetch( $stmt ) )
{
$image = sqlsrv_get_field( $stmt, 0,
SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
header("Content-Type: image/jpg");
fpassthru($image);
}
else
{
echo "Error in retrieving data.</br>";
die(print_r( sqlsrv_errors(), true));
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>
La specifica del tipo restituito nell'esempio mostra come specificare il tipo restituito PHP come flusso binario. Tecnicamente non è necessario nell'esempio perché il campo LargePhoto è del tipo SQL Server varbinary(max), che viene restituito come flusso binario per impostazione predefinita. Per informazioni sui tipi di dati PHP predefiniti, vedere Default PHP Data Types. Per informazioni su come specificare i tipi restituiti PHP, vedere How to: Specify PHP Data Types.