PHP-SQLSRV存储过程,输入变量类型为“bit”

时间:2011-10-24 17:30:24

标签: php sql-server tsql stored-procedures

我必须移植一个基于LAMP的项目,该项目使用PHP-MSSQL连接到SQL Server数据库。它必须移植到使用PHP-SQLSRV连接到SQL Server数据库的基于WAMP的计算机。

我可以通过执行存储过程来获取/设置数据。看起来大多数类型的输入变量都非常简单。但我无法获得bit类型的输入参数。

我已经尝试在PHP中使用'truthy'或'falsey'的各种值,但是没有它让我超越错误:

  • 'truthy'不起作用的东西:

    • 1
    • "1"
    • true
    • "True"
  • 'falsey'不起作用的事情:

    • 0
    • "0"
    • false
    • "False"

我尝试使用各种方法将项添加到$params数组,包括省略可选参数以及定义PHP和SQL数据类型。什么都行不通。

我从SQL Server发送的错误消息(转换为JSON对象)是:

[{
  "0":"42000",
  "SQLSTATE":"42000",
  "1":8114,
  "code":8114,
  "2":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit.",
  "message":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit."
}]

要生成此错误消息,我传递的值为01,其中既不是varchar,也不是字符串。

为了保持最大兼容性,我不想改变存储过程以在SQL Server上转换/转换数据。我希望这可以从PHP保持存储过程不变。


PHP代码:

<?php
  $link = sqlsrv_connect($host,Array("Database"=>$database,"UID"=>$username,"PWD"=>$password));
  $sql = " { call StoredProcedureName ( @input_param_of_bit_type=? ) } ";
  $param1 = 1;
  $params = Array(
    Array(&$param1, SQLSRV_PARAM_IN)
  );
  $stmt = sqlsrv_prepare($link,$sql,$params);
  if ($stmt===false) {
    // handle error
    print_r(sqlsrv_errors,true);
  } else {
    if (sqlsrv_execute($stmt)===false) {
      // handle error.  This is where the error happens
      print_r(sqlsrv_errors,true);
    } else {
      // success! It never gets here, though.
    }
  }
?>

2 个答案:

答案 0 :(得分:1)

重新排序命名参数的顺序使这项工作成功。我不得不使用SQL Server Management Studio软件和Profile Tracing来查看从php-sqlsrv执行存储过程与直接从SQL Server Management Studio执行存储过程的不同之处。

按照SQL Server Management Studio使用的确切顺序输入参数后,一切正常。

答案 1 :(得分:0)

似乎是上面的T-SQL使用的是默认字符串类型,它以不会转换的方式发送到服务器。最好的解决方法是在参数中指定PHPTYPE和SQLTYPE:

$params = Array( Array(&$param1, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_INT, SQLSRV_SQLTYPE_BIT) );

请尝试更改并查看您的查询是否正确执行。

谢谢!