Como recuperar dados binários como um fluxo usando o driver SQLSRV
A recuperação de dados como um fluxo só está disponível no driver SQLSRV dos Drivers da Microsoft para PHP para SQL Server, e não está disponível no driver PDO_SQLSRV.
Os Drivers da Microsoft para PHP para SQL Server aproveitam os fluxos do PHP para recuperar grandes quantidades de dados binários do servidor. Este tópico demonstra como recuperar dados binários como um fluxo.
O uso de fluxos para recuperar dados binários, como imagens, evita o uso de grandes quantidades de memória de script, recuperando partes de dados em vez de carregar o objeto inteiro na memória de script.
Exemplo
O exemplo a seguir recupera dados binários (neste caso, uma imagem) da tabela Production.ProductPhoto do banco de dados AdventureWorks. A imagem é recuperada como um fluxo e exibida no navegador.
A recuperação de dados de imagem como um fluxo é efetuada usando sqlsrv_fetch e sqlsrv_get_field com o tipo de retorno especificado como um fluxo binário. O tipo de retorno é especificado usando a constante SQLSRV_PHPTYPE_STREAM. Para obter informações sobre constantes sqlsrv, confira Constantes (Drivers da Microsoft para PHP para SQL Server).
O exemplo supõe que o SQL Server e o banco de dados AdventureWorks estejam instalados no computador local. Toda a saída é gravada no navegador quando o exemplo é executado do navegador.
<?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);
?>
A especificação do tipo de retorno no exemplo demonstra como especificar o tipo de retorno do PHP como um fluxo binário. Tecnicamente, isso não é necessário no exemplo porque o campo LargePhoto é tem o tipo varbinary(max) do SQL Server e, portanto, é retornado como um fluxo binário por padrão. Para obter informações sobre os tipos de dados padrão do PHP, consulte Default PHP Data Types. Para obter informações sobre como especificar tipos de retorno do PHP, consulte How to: Specify PHP Data Types.