使用PHP的RedHat Linux上用于SQLServer®的Microsoft®ODBC驱动程序11 – 在为存储过程绑定PDO参数时出现错误

没有任何参数,它会正常工作,但是当参数在那里,给出以下错误 –

SQLSTATE [42000]:语法错误或访问冲突:8018 [Microsoft] [用于SQL Server的ODBC驱动程序11] [SQL Server]无效的参数4(''):数据types0x23是不赞成使用的大对象或LOB,作为输出参数。 不推荐使用已弃用的types作为输出参数。 使用当前的大对象t(SQLExecute [8018]在/builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)

它运行在CentOS 6上,用于SQLServer®的ODBC驱动程序11 – RedHat Linux,unixODBC-2.3.0,MSSQL Server 2008 R2

连接string:

$con = new PDO("odbc:dsnName", 'sa','saa'); $con->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $con->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC); 

使用的示例存储过程:

  $stmt = $con->prepare( "SET NOCOUNT ON DECLARE @return_value int EXEC @return_value = [sp_insert_into_t_contact_test] @paravalue = ? SELECT 'returnV' = @return_value"); $stmt->bindParam(1, $v1 = 5, PDO::PARAM_STR, 100); $stmt->execute(); $return =$stmt->fetch(); echo $return['returnV']; 

简单的存储过程返回“123”

  [dbo].[sp_insert_into_t_contact_test] @paravalue varchar(100) AS return 123 

附加信息 –

odbc.ini文件 –

  [dsnName] Driver=SQL Server Native Client 11.0 Description=My Sample ODBC Database Connection Trace=Yes Server=192.168.2.60 Port=1433 Database=NSCDB_3 

ODBCINST.INI

  [SQL Server Native Client 11.0] Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1 

最后我找到了解决方案,Microsoft驱动程序已经为C或C ++应用程序开发,PDO参数绑定不能按预期工作。 如果您传递参数而不使用PDO,则所有事情都按预期工作。 @paravalue = N'".$v1."'

前面的例子 – 正常参数绑定 – SQLBindParameter PDO参数绑定 – $stmt->bindParam(1, $v1 = 5, PDO::PARAM_STR, 100);

更正的鳕鱼片段:

  $stmt = $con->prepare( "SET NOCOUNT ON DECLARE @return_value int EXEC @return_value = [sp_insert_into_t_contact_test] @paravalue = N'".$v1."' SELECT 'returnV' = @return_value"); $stmt->execute(); $return =$stmt->fetch(); echo $return['returnV'];