Freigeben über


Vorgehensweise: Behandeln von Fehlern und Warnungen

In der Standardeinstellung behandelt der SQL Server-Treiber für PHP Warnungen als Fehler. Beim Aufruf einer sqlsrv-Funktion, die einen Fehler oder eine Warnung generiert, wird false zurückgegeben. In diesem Thema wird veranschaulicht, wie dieses Standardverhalten deaktiviert wird und Warnungen getrennt von Fehlern behandelt werden.

Hinweis

Es gibt einige Ausnahmen zum standardmäßigen Behandeln von Warnungen als Fehler. Warnungen, die den SQLSTATE-Werten 01000, 01001, 01003 und 01S02 entsprechen, werden nie als Fehler behandelt.

Beispiel

Im folgenden Codebeispiel werden zwei benutzerdefinierte Funktionen, DisplayErrors und DisplayWarnings, dazu verwendet, Fehler und Warnungen zu behandeln. Das Beispiel veranschaulicht, wie Warnungen und Fehler separat behandelt werden, indem Folgendes getan wird:

  1. Deaktivieren des Standardverhaltens, Warnungen als Fehler zu behandeln
  2. Erstellen einer gespeicherten Prozedur, die die Urlaubsstunden eines Mitarbeiters aktualisiert und die verbleibenden Urlaubsstunden als Ausgabeparameter zurückgibt. Wenn die verfügbaren Urlaubsstunden eines Mitarbeiters weniger als 0 betragen, gibt die gespeicherte Prozedur eine Warnung aus.
  3. Aktualisieren der Urlaubsstunden für mehrere Mitarbeiter durch Aufrufen der gespeicherten Prozedur für jeden Mitarbeiter und Anzeigen der Meldungen, die zu ggf. auftretenden Warnungen und Fehlern gehören.
  4. Anzeigen der verbleibenden Urlaubsstunden für jeden Mitarbeiter.

Beachten Sie, dass beim ersten Aufruf einer sqlsrv-Funktion (sqlsrv_configure) Warnungen als Fehler behandelt werden. Da Warnungen der Fehlerauflistung hinzugefügt werden, müssen Sie nach Warnungen nicht getrennt von Fehlern suchen. In späteren Aufrufen der sqlsrv-Funktionen werden die Warnungen jedoch nicht als Fehler behandelt, Sie müssen also explizit nach Warnungen und nach Fehlern suchen.

Beachten Sie außerdem, dass der Beispielcode nach jedem Aufruf der sqlsrv-Funktion nach Fehlern sucht. Dies ist die empfohlene Vorgehensweise.

In diesem Beispiel wird davon ausgegangen, dass SQL Server und die AdventureWorks-Datenbank auf dem lokalen Computer installiert sind. Alle Ausgaben werden in die Konsole geschrieben, wenn das Beispiel über die Befehlszeile ausgeführt wird. Wenn das Beispiel auf eine neue Installation der AdventureWorks-Datenbank ausgeführt wird, werden drei Warnungen und zwei Fehler ausgegeben. Die ersten beiden Warnungen sind Standardwarnungen, die ausgegeben werden, wenn Sie eine Verbindung mit einer Datenbank herstellen. Die dritte Warnung wird ausgegeben, weil die verfügbaren Urlaubsstunden eines Mitarbeiters auf einen Wert kleiner Null (0) aktualisiert werden. Die Fehler treten auf, weil die verfügbaren Urlaubsstunden eines Mitarbeiters auf einen Wert kleiner -40Stunden aktualisiert werden, was eine Verletzung der Tabelleneinschränkungen darstellt.

<?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";
          }
     }
}
?>

Siehe auch

Aufgaben

Vorgehensweise: Konfigurieren der Behandlung von Fehlern und Warnungen

Konzepte

Anwendungsszenarien

Weitere Ressourcen

Programmieraufgaben
Entwurfsaspekte
API-Referenz (SQL Server-Treiber für PHP)