我必须移植一个基于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."
}]
要生成此错误消息,我传递的值为0
或1
,其中既不是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.
}
}
?>
答案 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)
);
请尝试更改并查看您的查询是否正确执行。
谢谢!