如果同时发送多个 sqlsrv 查询,PHP 如何处理错误

标签 php sqlsrv

我有下表:

CREATE TABLE [dbo].[TestDB] (
    [col1] INT NOT NULL, 
    [col2] VARCHAR(50) NOT NULL

);

现在我要添加条目:

    $params=array(123,'someString');
    $sql = "insert into testDB values(?,?)";

    $stmt = sqlsrv_query( $conntask, $sql ,$params);
    if( $stmt === false) {
        echo $sql;
        print_r($params);
        die( print_r( sqlsrv_errors(), true) );
    }

如果出现错误,$stmt 将为 false,将打印消息并终止脚本。

我的问题

如果我想添加多个条目,我将同时发送所有查询。

    $params=array(123,'someString','notANumber','someOtherString');
    $sql = "insert into testDB values(?,?) insert into testDB values(?,?)";

    $stmt = sqlsrv_query( $conntask, $sql ,$params);
    if( $stmt === false) {
        echo $sql;
        print_r($params);
        die( print_r( sqlsrv_errors(), true) );
    }

在这个例子中,第一次插入会成功,第二次会失败,因为我尝试将一个字符串放入一个 int 列。
现在 $stmt 不为假,查询会一直执行到错误发生为止。

我的问题:

  1. 如何随时检查查询是否失败?
  2. 我如何确保查询是完整执行还是根本不执行?

最佳答案

您的交易必须在出现任何错误时回滚。

在事务开始时使用 SET XACT_ABORT ON 命令,然后添加 BEGIN TRANSACTION 命令应该可以解决您的问题。

  • SMSS端的使用

    SET XACT_ABORT ON;
    
    BEGIN TRANSACTION
      -- your queries here
    COMMIT TRANSACTION
    
  • PHP端的使用

    ...
    $sql = "SET XACT_ABORT ON; " .
           "BEGIN TRANSACTION " .
           "insert into testDB values(?,?) insert into testDB values(?,?)" .
           "COMMIT TRANSACTION";
    ...
    

关于如果同时发送多个 sqlsrv 查询,PHP 如何处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184077/

相关文章:

php - 要为一行插入的多维数组

javascript - 如何使用 jQuery 将多个变量传递给 PHP

php - 无法加载 Mac M1 SQL Server SQLSrv OpenSSL 库,请确保已安装 OpenSSL 1.0 或 1.1

PHP 使用 sqlsrv 一次检索多行流内容

php - 具有名称和类型的 Sqlsrv_field_metadata

php preg_match_all 不工作

php - 如何在Travis CI中语法检查php文件?

PHP mssql 对于不同的语句表现得很奇怪

php - 带有SQLSRV驱动程序错误的Docker PHP-FPM Alpine

php - 如何使用 AJAX/JSON 提交表单?