Procédure : gérer les erreurs et les avertissements
Par défaut, le Pilote SQL Server pour PHP traite les avertissements comme des erreurs ; un appel à une fonction sqlsrv qui génère une erreur ou un avertissement retourne false. Cette rubrique montre comment désactiver ce comportement par défaut et comment gérer les avertissements séparément des erreurs.
Remarque : |
---|
Il existe quelques exceptions au comportement par défaut qui consiste à traiter les avertissements comme des erreurs. Les avertissements qui correspondent aux valeurs SQLSTATE 01000, 01001, 01003 et 01S02 ne sont jamais traités comme des erreurs. |
Exemple
L'exemple de code suivant utilise deux fonctions définies par l'utilisateur, DisplayErrors et DisplayWarnings, pour gérer les erreurs et les avertissements. L'exemple montre comment gérer séparément les avertissements et les erreurs en procédant comme suit :
- Désactive le comportement par défaut qui consiste à traiter les avertissements comme des erreurs.
- Crée une procédure stockée qui met à jour les heures d'absence d'un employé et retourne les heures d'absence restantes sous forme de paramètre de sortie. Lorsqu'il ne reste plus d'heures d'absence possibles à un employé, la procédure stockée affiche un avertissement.
- Met à jour les heures d'absence de plusieurs employés en appelant la procédure stockée pour chaque employé, puis affiche les messages qui correspondent aux erreurs et avertissements générés.
- Affiche les heures d'absence restantes pour chaque employé.
Notez que lors du premier appel à une fonction sqlsrv (sqlsrv_configure), les avertissements sont traités comme des erreurs. Dans la mesure où les avertissements sont ajoutés à la collection d'erreurs, vous n'avez pas à rechercher les avertissements séparément des erreurs. Cependant, lors des appels ultérieurs aux fonctions sqlsrv, les avertissements ne sont pas traités comme des erreurs ; par conséquent, vous devez rechercher explicitement les avertissements et les erreurs.
Notez également que l'exemple de code recherche les erreurs après chaque appel à une fonction sqlsrv. Il s'agit de la pratique recommandée.
Cet 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 lorsque l'exemple est exécuté à partir de la ligne de commande. Lorsque l'exemple est exécuté sur une nouvelle installation de la base de données AdventureWorks, il génère trois avertissements et deux erreurs. Les deux premiers avertissements sont des avertissements standard générés lorsque vous vous connectez à une base de données. Le troisième avertissement se produit car les heures d'absence disponibles d'un employé sont mises à jour à une valeur inférieure à zéro. Les erreurs se produisent, car les heures d'absence disponibles d'un employé sont mises à jour à une valeur inférieure à -40, ce qui est une violation d'une contrainte de la table.
<?php
/* Turn off the default behavior of treating errors as warnings.
Note: Turning off the default behavior is done here for demonstration
purposes only. If setting the configuration fails, display errors and
exit the script. */
if( sqlsrv_configure("WarningsReturnAsErrors", 0) === false)
{
DisplayErrors();
die;
}
/* 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 the connection fails, display errors and exit the script. */
if( $conn === false )
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Drop the stored procedure if it already exists. */
$tsql1 = "IF OBJECT_ID('SubtractVacationHours', 'P') IS NOT NULL
DROP PROCEDURE SubtractVacationHours";
$stmt1 = sqlsrv_query($conn, $tsql1);
/* If the query fails, display errors and exit the script. */
if( $stmt1 === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Free the statement resources. */
sqlsrv_free_stmt( $stmt1 );
/* Create the stored procedure. */
$tsql2 = "CREATE PROCEDURE SubtractVacationHours
@EmployeeID int,
@VacationHours smallint OUTPUT
AS
UPDATE HumanResources.Employee
SET VacationHours = VacationHours - @VacationHours
WHERE EmployeeID = @EmployeeID;
SET @VacationHours = (SELECT VacationHours
FROM HumanResources.Employee
WHERE EmployeeID = @EmployeeID);
IF @VacationHours < 0
BEGIN
PRINT 'WARNING: Vacation hours are now less than zero.'
END;";
$stmt2 = sqlsrv_query( $conn, $tsql2 );
/* If the query fails, display errors and exit the script. */
if( $stmt2 === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Free the statement resources. */
sqlsrv_free_stmt( $stmt2 );
/* Set up the array that maps employee ID to used vacation hours. */
$emp_hrs = array (7=>4, 8=>5, 9=>8, 11=>50);
/* Initialize variables that will be used as parameters. */
$employeeId = 0;
$vacationHrs = 0;
/* Set up the parameter array. */
$params = array(
array(&$employeeId, SQLSRV_PARAM_IN),
array(&$vacationHrs, SQLSRV_PARAM_INOUT)
);
/* Define and prepare the query to substract used vacation hours. */
$tsql3 = "{call SubtractVacationHours(?, ?)}";
$stmt3 = sqlsrv_prepare($conn, $tsql3, $params);
/* If the statement preparation fails, display errors and exit the script. */
if( $stmt3 === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Loop through the employee=>vacation hours array. Update parameter
values before statement execution. */
foreach(array_keys($emp_hrs) as $employeeId)
{
$vacationHrs = $emp_hrs[$employeeId];
/* Execute the query. If it fails, display the errors. */
if( sqlsrv_execute($stmt3) === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/*Move to the next result returned by the stored procedure. */
if( sqlsrv_next_result($stmt3) === false)
{
DisplayErrors();
die;
}
/* Display any warnings. */
DisplayWarnings();
/* Display updated vacation hours. */
echo "EmployeeID $employeeId has $vacationHrs ";
echo "remaining vacation hours.\n";
}
/* Free the statement and connection resources. */
sqlsrv_free_stmt( $stmt3 );
sqlsrv_close( $conn );
/* ------------- Error Handling Functions --------------*/
function DisplayErrors()
{
$errors = sqlsrv_errors(SQLSRV_ERR_ERRORS);
foreach( $errors as $error )
{
echo "Error: ".$error['message']."\n";
}
}
function DisplayWarnings()
{
$warnings = sqlsrv_errors(SQLSRV_ERR_WARNINGS);
if(!is_null($warnings))
{
foreach( $warnings as $warning )
{
echo "Warning: ".$warning['message']."\n";
}
}
}
?>
Voir aussi
Tâches
Procédure : configurer la gestion des erreurs et des avertissements
Concepts
Autres ressources
Tâches de programmation
Considérations relatives à la conception
Référence de l'API (Pilote SQL Server pour PHP)