我在Gentoo Linux上运行的PHP项目使用FreeTDS& UnixODBC连接到Windows服务器上的MSSQL数据库。我已经让这个项目使用了这个确切的代码多年了,但最近我不得不更新PHP,当Gentoo不再需要portage版本5.3 ebuild和其他系统更新时。
使用的各种软件的当前版本是:
PHP是版本5.6.17
FreeTDS版本0.91
UnixODBC是版本2.3.2-r1
但是现在一些完全相同的查询会完全返回此错误。
PHP警告:odbc_fetch_object():SQL错误:[unixODBC] [驱动程序 管理器]仅允许转发(非缓冲)SQLGetData 光标,SQL状态中的SQL状态SL008在/home/XXXXX/XXXX.php中的SQLGetData中 ÿ
并非所有查询都返回此错误,只有一些,但相同的查询始终返回相同的错误。
将返回此错误的简单PHP程序如下:
$con = odbc_connect(DBNAME,UNAME,PW,SQL_CUR_USE_ODBC)
$query = "SELECT * FROM SomeTable"
$Output = odbc_exec($con,$query);
$return_array = array();
while($row = odbc_fetch_object($Output)){
#
foreach($row as &$value){
$value = mb_convert_encoding($value, "UTF-8", "Windows-1252");
}
unset($value);
$return_array[] = $row;
}
echo json_encode($return_array,JSON_UNESCAPED_UNICODE);
odbc_close($con);
?>
现在这与使用 SQL_CUR_USE_ODBC 时提供给 odbc_connect 的第4个参数无关,错误如上所述。如果将其更改为 SQL_CUR_USE_IF_NEEDED ,则会返回错误:
警告:odbc_fetch_object():在第[Y]行的/home/XXXXX/XXXX.php中此结果索引没有可用的元组[]
SQL_CUR_USE_DRIVER 的结果相同,或者保留为空白。
同样,两天前,这是所有查询中的所有功能代码。所以有些东西从PHP 5.3改为任何版本的php> 5.3。每个版本的PHP都尝试过5.4到7.0(portage中有一个PHP 7 ebuild),并且都会产生相同的错误。
非常感谢任何帮助或指导。
答案 0 :(得分:2)
我发现的第一个主要提示是,只有在我们使用文本列和其他列进行SELECT时才会发生这种情况。在文本列上单独使用SELECT不会抛出错误。并且选择除text列之外的所有其他列都不会抛出错误。我们刚刚从SQL Server 2000迁移到2008年,所以我非常愿意尝试使用VARCHAR(MAX)来支持我们在2000年使用的文本列。
ALTER TABLE tbl_name ALTER COLUMN col_name VARCHAR(MAX) [NOT] NULL
为我们修复了所有这些错误消息。即使返回了几KB的文本,它也可以很好地传输VARCHAR(MAX)。旧的Text
实现使列大小保持在2GB,所以我假设FreeTSD 0.91有一些大小限制。
答案 1 :(得分:0)
经过大量测试后,这个问题的解决方案是注意到这些只是警告,而不是错误。它们应该被抛出,但之后也会执行SQL。
但是,其中一个ODBC或TDS库中的一些故障导致警告阻止SQL的执行。它不是一个很好的解决方案,但在查询开始时包括 SET ANSI_WARNINGS OFF 会关闭警告,现在代码就像以前一样执行。
$query = 'SET ANSI_WARNINGS OFF
SELECT * FROM SomeTable';
我的查询字符串现在是什么样的。不理想,但它有效。
答案 2 :(得分:0)
我遇到了这个问题。在我的查询之前添加'SET ANSI_WARNINGS OFF'解决了问题。感谢。
Freetds版本:0.91.112 PHP版本5.3.29