【问题标题】:PHP How to handle errors if multiple sqlsrv-querys are sent simultaneously如果同时发送多个 sqlsrv 查询,PHP 如何处理错误
【发布时间】:2016-05-12 10:22:07
【问题描述】:

我有下表:

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. 如何确保查询是全部执行还是根本不执行?

【问题讨论】:

  • 使用INSERT INTO table VALUES (?,?), (?,?), (?,?)...语法
  • 谢谢,我不知道你能做到这一点。但这只会解决这个确切的问题。如果我想做一个插入然后更新怎么办?还是更新和删除?或者...
  • 那你一个一个地做。如果您担心性能,那么您可以使用事务。但只有在执行大量查询时才有意义(或者您需要回滚选项)。

标签: php sqlsrv


【解决方案1】:

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

在事务开始时使用 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";
    ...
    

【讨论】:

  • 谢谢。这确实解决了我的回滚问题。如果回滚,它仍然不会返回错误。有没有办法检查一个?
  • 在这种情况下,SQL Server 会返回两个结果:1-) 第一个查询的 1 行受影响消息(假设为成功) 2-) 第二个查询的错误消息(假设为失败)。您可以使用sqlsrv_next_result($stmt) 检查每个结果或在查询开头添加SET NOCOUNT ON;,您只会得到结果的真或假。两者都有优点,但在我看来,考虑使用存储过程并在 SQL Server 端使用@@ROWCOUNT 检查每个插入更新删除。
  • 我需要在我的查询底部添加一个“COMMIT TRANSACTION”。否则它不会工作。我认为它现在可以按我希望的方式工作。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2013-08-26
相关资源
最近更新 更多