ODBC_Exec正常工作时PDO错误

时间:2017-02-17 15:31:11

标签: php pdo odbc

我有一个正在转换的项目,到目前为止,有一个脚本有几个奇怪的结果。转换是从过程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)

我已经成功转换了网站的大部分内容,但找不到任何原因/原因。

编辑@ 13:42中央

搜索之后,我尝试将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'转换为整数

编辑@ 16:40中央

几个小时的搜索时间,发现一些关于长varchars无效的php bug报告,只返回空值。其中一个已开放近10年。我不确定这个问题是否可以在严格的PDO环境中解决。

我将不得不尝试使用PDO获取信息,如果返回null结果,请尝试使用ODBC_Exec,然后仅当两者都为null时,它才是真正的空列或者不存在任何记录。

这看起来是对的吗?

1 个答案:

答案 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并神奇地工作