gpt4 book ai didi

php - ODBC_Exec 正常工作时出现 PDO 错误

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:01 24 4
gpt4 key购买 nike

我有一个正在转换的项目,到目前为止,一个脚本产生了几个奇怪的结果。转换是从过程 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][Driver Manager]No columns were bound prior to calling SQLFetch or SQLFetchScroll (SQLFetchScroll[0] at /build/php7.0-x25jsn/php7.0-7.0.13/ext/pdo_odbc/odbc_stmt.c:559)

我已经成功转换了网站的大部分其余部分,但找不到任何应该发生这种情况的原因/理由。


编辑 @ 13:42 中部

经过搜索,我尝试将 bindColumn 设置为 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());
}

I get fpassthru() expects parameter 1 to be resource, null given

从 $sql 中删除列给我相同的无绑定(bind)列的错误。

我还尝试了 CAST(column2 as varchar) 并且它的值为 1转换为 INT 会按预期抛出错误,但在错误中包含我需要的来自数据库的数据

Error -157: Cannot convert 'COLLECTION HOLD UP ' to a integer



编辑 @ 16:40 中部

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

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

这样对吗?

最佳答案

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

关于php - ODBC_Exec 正常工作时出现 PDO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com