繁体   English   中英

ODBC_Exec正常工作时PDO错误

[英]PDO Error when ODBC_Exec works correctly

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

从$ sql中删除列给了我相同的没有绑定列的错误。

我也尝试过CAST(column2 as varchar)并且它获得值为1 Casting to INT会按预期抛出错误,但是我在错误中需要数据库中的数据

错误-157:无法将“COLLECTION HOLD UP”转换为整数



编辑@ 16:40中央

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

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

那似乎对吗?

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,它神奇地工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM