Procédure : envoyer des données sous forme de flux

Le Pilote SQL Server pour PHP tire parti des flux de données PHP pour envoyer des objets volumineux au serveur. Les exemples de cette rubrique montrent comment envoyer des données sous forme de flux. Le premier exemple illustre le comportement par défaut, qui consiste à envoyer toutes les données de flux au moment de l'exécution de la requête. Le deuxième exemple indique comment envoyer simultanément jusqu'à huit kilo-octets (8 Ko) de données de flux au serveur.

Exemple

Dans l'exemple suivant, une ligne est insérée dans la table Production.ProductReview de la base de données AdventureWorks. Les commentaires du client ($comments) sont ouverts sous forme de flux avec la fonction PHP fopen, puis ils sont envoyés au serveur lors de l'exécution de la requête.

L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console.

<?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;
$comments = fopen( "data://text/plain,[ Insert lengthy comment here.]",
                  "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);
?>

L'exemple suivant reprend l'exemple précédent, mais le comportement par défaut consistant à envoyer toutes les données de flux au moment de l'exécution de la requête est désactivé. L'exemple utilise sqlsrv_send_stream_data pour envoyer des données de flux au serveur. Jusqu'à huit kilo-octets (8 Ko) de données sont envoyés lors de chaque appel à sqlsrv_send_stream_data. Le script comptabilise le nombre d'appels effectués par sqlsrv_send_stream_data et affiche le résultat dans la console.

L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console.

<?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;
$comments = fopen( "data://text/plain,[ Insert lengthy comment here.]",
                  "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);
?>

Dans les exemples de cette rubrique, les données envoyées au serveur sont de type caractères, mais tout autre type de données peut être envoyé sous forme de flux. Par exemple, vous pouvez suivre les méthodes présentées dans cette rubrique pour envoyer des images au format binaire sous forme de flux de données.

Voir aussi

Concepts

À propos des exemples de code dans la documentation

Autres ressources

Mise à jour des données (pilote SQL Server pour PHP)
Récupération des données sous forme de flux