Php PDO::bindParam/bindValue创建了错误的参数类型

Php PDO::bindParam/bindValue创建了错误的参数类型,php,sql-server,pdo,Php,Sql Server,Pdo,我有一个存储过程,它接受一些整数参数: CREATE PROCEDURE [dbo].[redacted_name] @CustomerID int , @ContactPersonID int, @ChangeContactPersonId int = null, @Name varchar(50) = NULL -- snip AS BEGIN -- snip END 我使用以下代码调用此存储过程: $db = $this->db();

我有一个存储过程,它接受一些整数参数:

CREATE PROCEDURE [dbo].[redacted_name]
    @CustomerID int , 
    @ContactPersonID int,
    @ChangeContactPersonId int = null,
    @Name varchar(50)  = NULL
    -- snip
AS
BEGIN
  -- snip
END
我使用以下代码调用此存储过程:

$db = $this->db();
$statement = $db->prepare("exec dbo.redacted_name @CustomerId=?,@ContactPersonId=?");

$statement->bindValue(1, 73, PDO::PARAM_INT);
$statement->bindValue(2, 42, PDO::PARAM_INT);
$statement->execute();
//snip
它从探查器中获取以下SQL:

declare @p1 int
exec sp_prepexec @p1 output,N'@P1 TEXT,@P2 TEXT',N'exec dbo.redacted_name  @customerId=@P1,@contactPersonId=@P2','73','42'
select @p1
exec sp_unprepare @p1
go
在Microsoft SQL Server 11.0.5343上执行此SQL会导致以下错误:

Msg 206,16级,状态2,程序修订名称,第0行
操作数类型冲突:文本与int不兼容


这是有道理的,因为
TEXT!=INT
考虑到我特别告诉PDO我正在传递一个
INT
,为什么PDO会生成两个
文本
变量?我能做些什么来解决这个问题呢?

我建议您研究BindParam()的“驱动程序选项”参数,也许会有所帮助


在某些情况下,这可能是问题所在

今天我遇到了同样的问题。我得到了类似于: 强制转换规范的无效字符值:206[Microsoft][ODBC驱动程序13 for SQL Server][SQL Server]操作数类型冲突:文本与int不兼容

我在Linux CentOS 7上使用PHP7.0和PDO以及Microsoft ODBC,连接字符串如下:

$pdo = new PDO('odbc:driver=SQL Server Native Client 11.0;server=MyServer;database=MyDB;MARS_Connection=yes', 'user', 'pass'); $pdo=new pdo('odbc:driver=SQL Server本机客户端11.0;Server=MyServer;database=MyDB;MARS_Connection=yes','user','pass'); 要解决此问题,需要准确存储proc param case

存储的proc param@CustomerID int是用“ID”定义的,那么您必须使用@CustomerID=?而不是@CustomerId=

$statement = $db->prepare("exec dbo.redacted_name @CustomerID=?, @ContactPersonID=?"); $statement=$db->prepare(“exec dbo.redact_name@CustomerID=?,@ContactPersonID=?”;
看起来驱动程序试图通过使用区分大小写的匹配来查看proc参数来确定目标类型。

是否使用bindParam()进行了尝试?@Robert Yes。同样的问题。我用
bindValue
发布了这个问题,因为这会使代码稍微短一点(不需要变量)。BindParam()有“driver options”参数,也许会help@Robert我错过了那些。经过调查,这是一罐蠕虫,我们现在无法打开。我们在Linux(RHEL 7)上托管该应用程序,花了大约两个人周的时间才能够与数据库通信。本例中的driver options参数需要MS特定的驱动程序,RHEL5和RHEL6都有这些驱动程序。不过,我确实觉得这就是解决方案。我很高兴它对您有所帮助,所以也许我会将我的评论作为答案发布,这样问题就可以结束了?我还没有找到在Linux上将MSSQL特定选项编译成PHP的方法=[我问这个问题已经有一段时间了,谢谢你添加了一个答案!不幸的是,我已经换了雇主,因此无法验证这是否能解决这个特定项目中的问题。不过,我已将你的答案转达给一位前同事。请投赞成票!