我有一个正在转换的项目,到目前为止,有一个脚本有几个奇怪的结果。转换是从过程ODBC到PDO。当我执行旧的和新的查询结构时,我有以下不同的结果集。
$con = odbc_connect("database","user,"pass");
if(!$con){
exit("error");
}
$sql = "SELECT column,column2 FROM table WHERE column3=number AND ((column2 Like '%hold%') OR (column2 Like '%panic%'))";
$result = odbc_exec($con,$sql);
if(!$result)
exit("error");
$temp = array();
while($row = odbc_fetch_array($result)){
if(($preferedKey !="")&&isset($row[$preferedKey])){
$temp[$row[$preferedKey]] = $row;
}
else {
array_push($temp, $row);
}
}
odbc_close($con);
return $temp;
这将返回一个多维数组
Array(
[0] => Array
(
[column] => 026
[column2] => COLLECTION HOLD UP
)
[1] => Array
(
[column] => 027
[column2] => MORTGAGE HOLD UP
)
[2] => Array
(
[column] => 028
[column2] => HOLD UP
)
)
当我使用PDO获取所有其他变量/参数保持不变的信息时,我得到以下内容(包括代码):
try{
$data = PDO_Connect($database)->query($sql)->fetchAll(PDO::FETCH_ASSOC);
return ((count($data)==1&&$assoc==false) ? $data[0] : ($preferedKey!="" ? (isset($data[0][$preferedKey]) ? changeKey($data,$preferedKey) : $data) : $data));
} catch(PDOException $e){
die($e);
//error_redirect($e);
}
Array(
[0] => Array
(
[column] => 026
[column2] =>
)
[1] => Array
(
[column] => 027
[column2] =>
)
[2] => Array
(
[column] => 028
[column2] =>
)
)
如果我删除列并只选择column2,则第一个方法返回:
Array(
[0] => Array
(
[column2] => COLLECTION HOLD UP
)
[1] => Array
(
[column2] => MORTGAGE HOLD UP
)
[2] => Array
(
[column2] => HOLD UP
)
)
PDO方法错误:
PDOException:SQLSTATE [SL009]:<>:0 [unixODBC] [驱动程序管理器]在调用SQLFetch或SQLFetchScroll之前没有绑定任何列(SQLFetchScroll [0]在/build/php7.0-x25jsn/php7。 0-7.0.13 / EXT / PDO_ODBC / odbc_stmt.c:559)
我已经成功转换了网站的大部分内容,但找不到任何原因/原因。
搜索之后,我尝试将String作为LOB绑定,看看发生了什么:
$sql = "SELECT column,column2 FROM table WHERE column3=number AND ((column2 Like '%hold%') OR (column2 Like '%panic%'))";
$stmt = PDO_Connect($database)->prepare($sql);
$stmt->bindColumn("Description",$desc,PDO::PARAM_LOB)
$stmt->execute();
while($data = $stmt->fetch(PDO::FETCH_BOUND)){
fpassthru($desc);
darray(get_defined_vars());
}
我得到fpassthru()期望参数1是资源,给定
从$ sql中删除列给出了相同的无绑定列错误。
我也尝试过CAST(column2 as varchar),它的值为1 转换为INT会按预期引发错误,但在错误
中包含数据库中需要的数据错误-157:无法将'COLLECTION HOLD UP'转换为整数
几个小时的搜索时间,发现一些关于长varchars无效的php bug报告,只返回空值。其中一个已开放近10年。我不确定这个问题是否可以在严格的PDO环境中解决。
我将不得不尝试使用PDO获取信息,如果返回null结果,请尝试使用ODBC_Exec,然后仅当两者都为null时,它才是真正的空列或者不存在任何记录。
这看起来是对的吗?
答案 0 :(得分:0)
https://github.com/php/php-src/blob/php-7.3.9/ext/pdo_odbc/odbc_stmt.c#L622
if (colsize < 256 && !S->going_long) {
// ......
} else {
// ......
}
->
if (1) {
// ......
} else {
// ......
}
重新编译PDO_ODBC并神奇地工作