Procédure : Récupérer des données binaires sous la forme d’un flux à l’aide du pilote SQLSRV
La récupération de données sous forme de flux est disponible uniquement dans le pilote SQLSRV du Pilotes Microsoft SQL Server pour PHP, et non dans le pilote PDO_SQLSRV.
Pilotes Microsoft SQL Server pour PHP tire parti des flux PHP pour récupérer de grandes quantités de données binaires à partir du serveur. Cette rubrique montre comment récupérer des données binaires sous forme de flux.
L’utilisation de flux pour récupérer des données binaires, comme des images, permet d’éviter l’utilisation de grandes quantités de mémoire de script en récupérant des blocs de données au lieu de charger l’objet entier dans la mémoire de script.
Exemple
L’exemple suivant récupère des données binaires, à savoir une image dans ce cas, à partir de la table Production.ProductPhoto de la base de données AdventureWorks. L’image est récupérée sous forme de flux et affichée dans le navigateur.
La récupération de données d’image sous forme de flux s’effectue à l’aide de sqlsrv_fetch et sqlsrv_get_field avec le type de retour spécifié en tant que flux binaire. Le type de retour est spécifié à l’aide de la constante SQLSRV_PHPTYPE_STREAM. Pour plus d’informations sur les constantes sqlsrv, consultez Constantes (Microsoft Drivers for PHP for SQL Server).
L’exemple part du principe que SQL Server et la base de données AdventureWorks sont installés sur l’ordinateur local. Toute la sortie est écrite dans le navigateur quand l’exemple est exécuté à partir du navigateur.
<?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 spécification du type de retour dans l’exemple montre comment spécifier le type de retour PHP en tant que flux binaire. Techniquement, cela n’est pas obligatoire dans l’exemple, car le champ LargePhoto est de type SQL Server varbinary(max), et il est donc retourné en tant que flux binaire par défaut. Pour plus d’informations sur les types de données PHP par défaut, consultez Default PHP Data Types. Pour plus d’informations sur la spécification des types de retour PHP, consultez How to: Specify PHP Data Types.
Voir aussi
Récupération des données sous la forme d’un flux à l’aide du pilote SQLSRV