共用方式為


如何:將二進位資料當做資料流擷取

SQL Server Driver for PHP 會利用 PHP 資料流來從伺服器擷取大量二進位資料。本主題示範如何將二進位資料當做資料流擷取。

使用資料流來擷取二進位資料 (如影像) 可避免使用大量指令碼記憶體,其方式是擷取資料區塊,而不是將整個物件載入指令碼記憶體。

範例

下列範例會從 AdventureWorks 資料庫的 Production.ProductPhoto 資料表擷取二進位資料 (此案例中為影像)。此影像會當做資料流擷取,並顯示在瀏覽器中。

如果要完成將影像資料當做資料流擷取的工作,請搭配指定為二進位資料流的傳回類型使用 sqlsrv_fetchsqlsrv_get_field。此傳回類型是使用 SQLSRV_PHPTYPE_STREAM 常數所指定。如需有關 sqlsrv 常數的資訊,請參閱<SQLSRV 常數>。

此範例假設 SQL Server 和 AdventureWorks 資料庫已經安裝在本機電腦上。當從瀏覽器執行此範例時,所有輸出都會寫入瀏覽器。

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

在此範例中指定傳回類型會示範如何將 PHP 傳回類型指定為二進位資料流。就技術上來說,此範例中並不需要它,因為 LargePhoto 欄位具有 SQL Server 類型 varbinary(max),因此預設會當做二進位資料流傳回。如需有關預設 PHP 資料類型的資訊,請參閱<預設 PHP 資料類型>。如需有關如何指定 PHP 傳回類型的資訊,請參閱<如何:指定 PHP 資料類型>。

另請參閱

概念

有關文件集中的程式碼範例

其他資源

擷取資料
將資料當做資料流擷取