php odbc判断纪录null,我使用ODBC从PHP获取“字符串数据,右截断”错误并连接到Microsoft SQL Server 2008R2实例...

我在CentOS 6.2盒子上使用

PHP 5.3.3,连接到Microsoft SQL Server 2008R2的一个实例.连接有效,只要我的查询不包含参数,我就可以检索数据.当我添加参数时,我得到错误,“字符串数据,右截断”.

这是一些示例代码:

$dbh = new PDO("odbc:myDSN", 'myUsername', 'myPassword');

$testCase = 1;

switch ($testCase) {

case 1:

// This case fails with this error:

// Error 22001: [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation (SQLExecute[0] at /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)

$query = "select * from [myDatabase].[sys].[objects] WHERE (([name]=?))";

$stmt = $dbh->prepare($query);

$param1 = 'testtable1';

$stmt->bindParam(1, $param1, PDO::PARAM_STR); // Note: '1' is correct; it should not be '0'

break;

case 2:

// This case works properly

$query = "select * from [myDatabase].[sys].[objects] WHERE (([name]='testtable1'))";

$stmt = $dbh->prepare($query);

break;

}

$execResult = $stmt->execute();

if ($execResult) {

print "Success!\n";

} else {

$errorInfo = $stmt->errorInfo();

print "Error " . $stmt->errorCode() . ": " . $errorInfo[2] . "\n";

}

$rowCount = 0;

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

echo "Row " . $rowCount . ":\n";

foreach ($row as $key => $value) {

printf(" %-20s %s\n", $key, $value);

}

$rowCount++;

}

请注意,上面代码中的两个测试用例都应该做同样的事情.测试用例1使用参数(因为所有代码都应该),测试用例2显式地将相关值放在SQL查询中.测试案例2有效.测试用例1没有.我尝试用’bindValue()’替换’bindParam()’,但这没有效果.我也尝试使用命名参数(例如:name)而不是位置参数,但这也没有效果.我已经尝试向bindParam()添加一个显式长度参数(使用strlen($param1)作为值),但这会给出一个非常奇怪的错误消息(‘OUTPUT’附近的语法不正确),我只能假设我’我做错了.整数参数正常工作.只有字符串参数失败.

任何想法为什么这不起作用?

当然,ODBC驱动程序中可能存在错误,或者它与我的PHP版本或任何类似问题不兼容,但我希望我只是不正确地使用API​​.

编辑:

Per Anda Iancu的建议,我深入研究了SQL Server Profiler.在跟踪时,案例1给出了两个几乎相同的记录,一个是SQL类:BatchStarting,另一个是SQL类:BatchCompleted,它们都包含文本:

set fmtonly on select [name] from [myDatabase].[sys].[objects] where 1=2 set fmtonly off

案例2给出了两个记录,两个类都是“RPC:Completed”.第一个包含文字:

declare @p1 int

set @p1=1

exec sp_prepexec @p1 output,NULL,N'select * from [myDatabase].[sys].[objects] WHERE (([name]=''testtable1''))'

select @p1

第二个包含文字:

exec sp_unprepare 1

更新:

在一个绝望的举动中,希望将新版本的unixODBC放入现有版本的PHP中可能存在某种问题,我从源代码重新编译了PHP.在CentOS上,这比你想象的要难.不幸的是,这没有效果.周围的错误相同.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值