다음을 통해 공유


방법: 데이터를 스트림으로 전송

PHP 드라이버 다운로드

Microsoft Drivers for PHP for SQL Server는 LOB(Large Object)를 서버로 전송할 때 PHP 스트림을 활용합니다. 이 항목의 예시에서는 데이터를 스트림으로 보내는 방법을 보여줍니다. 첫 번째 예시에서는 SQLSRV 드라이버를 사용하여 쿼리 실행 시 모든 스트림 데이터를 보내는 기본 동작을 보여줍니다. 두 번째 예시는 SQLSRV 드라이버를 사용하여 서버에 한 번에 최대 8킬로바이트(8kB)의 스트림 데이터를 보내는 방법을 보여줍니다.

세 번째 예시는 PDO_SQLSRV 드라이버를 사용하여 서버에 스트림 데이터를 전송하는 방법을 보여줍니다.

예: 실행 시 스트림 데이터 보내기

다음 예시는 AdventureWorks 데이터베이스의 Production.ProductReview 테이블에 행을 삽입하는 예시입니다. 고객 메모($comments)는 PHP fopen 함수를 통해 스트림으로 열린 다음 쿼리를 실행할 때 서버에 스트림됩니다.

이 예시에서는 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 = "INSERT INTO Production.ProductReview (ProductID,   
                                               ReviewerName,  
                                               ReviewDate,  
                                               EmailAddress,  
                                               Rating,  
                                               Comments)  
         VALUES (?, ?, ?, ?, ?, ?)";  
  
/* Set the parameter values and put them in an array.  
Note that $comments is opened as a stream. */  
$productID = '709';  
$name = 'Customer Name';  
$date = date("Y-m-d");  
$email = 'customer@name.com';  
$rating = 3;  
$data = 'Insert any lengthy comment here.';
$comments = fopen('data:text/plain,'.urlencode($data), 'r');
$params = array($productID, $name, $date, $email, $rating, $comments);
  
/* Execute the query. All stream data is sent upon execution.*/  
$stmt = sqlsrv_query($conn, $tsql, $params);  
if ($stmt === false) {
     echo "Error in statement execution.\n";  
     die( print_r( sqlsrv_errors(), true));  
} else {
     echo "The query was successfully executed.";  
}  
  
/* Free statement and connection resources. */  
sqlsrv_free_stmt( $stmt);  
sqlsrv_close( $conn);  
?>  

예: sqlsrv_send_stream_data를 사용한 스트림 데이터 전송

다음 예시는 앞의 예시와 동일하지만, 실행 시 모든 스트림 데이터를 보내는 기본 동작이 비활성화됩니다. 이 예시에서는 sqlsrv_send_stream_data를 사용하여 스트림 데이터를 서버로 보냅니다. sqlsrv_send_stream_data에 대한 각 호출에서 최대 8킬로바이트(8kB)의 데이터를 전송합니다. 이 스크립트는 sqlsrv_send_stream_data가 호출한 횟수를 계산하여 콘솔에 그 수를 표시합니다.

이 예시에서는 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 = "INSERT INTO Production.ProductReview (ProductID,   
                                               ReviewerName,  
                                               ReviewDate,  
                                               EmailAddress,  
                                               Rating,  
                                               Comments)  
         VALUES (?, ?, ?, ?, ?, ?)";  
  
/* Set the parameter values and put them in an array.  
Note that $comments is opened as a stream. */  
$productID = '709';  
$name = 'Customer Name';  
$date = date("Y-m-d");  
$email = 'customer@name.com';  
$rating = 3;  
$data = 'Insert any lengthy comment here.';
$comments = fopen('data:text/plain,'.urlencode($data), 'r');
$params = array($productID, $name, $date, $email, $rating, $comments);  
  
/* Turn off the default behavior of sending all stream data at  
execution. */  
$options = array("SendStreamParamsAtExec" => 0);  
  
/* Execute the query. */  
$stmt = sqlsrv_query($conn, $tsql, $params, $options);  
if ($stmt === false) {
     echo "Error in statement execution.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Send up to 8K of parameter data to the server with each call to  
sqlsrv_send_stream_data. Count the calls. */  
$i = 1;  
while (sqlsrv_send_stream_data($stmt)) {
     echo "$i call(s) made.\n";  
     $i++;  
}  
  
/* Free statement and connection resources. */  
sqlsrv_free_stmt( $stmt);  
sqlsrv_close( $conn);  
?>  

이 항목의 예시에서는 문자 데이터를 서버로 보내지만 모든 형식의 데이터를 스트림으로 보낼 수 있습니다. 예를 들어, 이 항목에 설명된 기법을 사용하여 이진 형식의 이미지를 스트림으로 보낼 수도 있습니다.

예시: 이미지를 스트림으로 전송

<?php  
   $server = "(local)";   
   $database = "Test";  
   $conn = new PDO( "sqlsrv:server=$server;Database = $database", "", "");  
  
   $binary_source = fopen( "data://text/plain,", "r");  
  
   $stmt = $conn->prepare("insert into binaries (imagedata) values (?)");  
   $stmt->bindParam(1, $binary_source, PDO::PARAM_LOB);   
  
   $conn->beginTransaction();  
   $stmt->execute();  
   $conn->commit();  
?>  

참고 항목

데이터 업데이트(Microsoft Drivers for PHP for SQL Server)

SQLSRV 드라이버를 사용하여 스트림으로 데이터 검색

설명서의 코드 예시 정보