Aracılığıyla paylaş


Nasıl yapılır: Akış Olarak Veri Gönderme

PHP sürücüsünü indirme

SQL Server için PHP için Microsoft Sürücüleri, sunucuya büyük nesneler göndermek için PHP akışlarından yararlanır. Bu konudaki örneklerde verilerin akış olarak nasıl gönderılabileceği gösterilmektedir. İlk örnek, sorgu yürütme sırasında tüm akış verilerini göndermek için varsayılan davranışı göstermek için SQLSRV sürücüsünü kullanır. İkinci örnekte, sunucuya aynı anda en fazla sekiz kilobayt (8 kB) akış verisi göndermeyi göstermek için SQLSRV sürücüsü kullanılır.

Üçüncü örnekte, PDO_SQLSRV sürücüsünü kullanarak sunucuya akış verilerinin nasıl gönderılabileceği gösterilmektedir.

Örnek: Yürütme sırasında Akış Verileri Gönderme

Aşağıdaki örnek, AdventureWorks veritabanının Production.ProductReview tablosuna bir satır ekler. Müşteri yorumları ($comments) PHP fopen işleviyle bir akış olarak açılır ve sorgunun yürütülmesinden sonra sunucuya akış yapılır.

Örnekte SQL Server ve AdventureWorks veritabanının yerel bilgisayarda yüklü olduğu varsayılır. Tüm çıkış konsola yazılır.

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

Örnek: sqlsrv_send_stream_data Kullanarak Akış Verileri Gönderme

Sonraki örnek önceki örnekle aynıdır, ancak yürütme sırasında tüm akış verilerini göndermenin varsayılan davranışı kapalıdır. Örnek, akış verilerini sunucuya göndermek için sqlsrv_send_stream_data kullanır. Her sqlsrv_send_stream_data çağrısıyla en fazla sekiz kilobayt (8 kB) veri gönderilir. Betik, sqlsrv_send_stream_data tarafından yapılan çağrı sayısını sayar ve sayıyı konsolda görüntüler.

Örnekte SQL Server ve AdventureWorks veritabanının yerel bilgisayarda yüklü olduğu varsayılır. Tüm çıkış konsola yazılır.

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

Bu konudaki örnekler sunucuya karakter verileri gönderse de, herhangi bir biçimdeki veriler akış olarak gönderilebilir. Örneğin, görüntüleri ikili biçimde akış olarak göndermek için bu konuda gösterilen teknikleri de kullanabilirsiniz.

Örnek: Bir Görüntüyü Akış Olarak Gönderme

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

Ayrıca Bkz.

Verileri Güncelleştirme (SQL Server için PHP için Microsoft Sürücüleri)

SQLSRV Sürücüsünü Kullanarak Verileri Akış Olarak Alma

Belgelerde Kod Örnekleri Hakkında