【问题标题】:oci8 (Oracle) Issues after migrating to php7oci8 (Oracle) 迁移到 php7 后的问题
【发布时间】:2016-09-24 09:28:57
【问题描述】:

我想将我的网络服务器升级到最新的 Ubuntu 版本,因此也将 php5 升级到 php7。我完成了运行 lubuntu 16.04 的 VM 的安装和配置以进行测试,看看是否需要更改代码并测试它是否正常工作。

在第一个应用程序中,我遇到了一个关于 oracle (oci8) 的奇怪问题。该应用程序使用服务器端分页,还显示诸如“总记录”和“总记录(过滤)”之类的内容。当然,这些“指标”基于简单的计数查询,它们可以工作并显示正确的结果。然而,获取实际数据的选择语句返回 0 个命中。特别令人费解,因为它使用完全相同的查询:

$sQueryInner = "SELECT id, ROW_NUMBER() OVER ($sOrderByClause) R
             FROM my_table " . $sWhereClause;

$sQueryFinal = "SELECT id FROM
        (" . $sQueryInner . ")
    WHERE R BETWEEN :startIndex and :endIndex";

// Total data set length after applying where
$sQueryFilteredCount = "SELECT COUNT(*) as \"totalRowsCount\" FROM (" . $sQueryInner . ")";

唯一的区别是ROW_NUMBER() 子句,但我看不出这会如何影响不返回结果的事情。我也没有收到错误消息或 php 警告。 oci_fetch_array 立即返回 false 表示找不到更多行。

while ($row = oci_fetch_array($statementFinal, OCI_ASSOC + OCI_RETURN_NULLS)) {//...

我想找到一种方法来调试 oci8 本身。查看实际发送的 SQL。但oci_internal_debug 似乎自php5.6 以来已被禁用。

所以我很迷茫。有什么想法可能导致这种情况以及我如何进一步调试/搜索导致这种情况的原因?

编辑:

使用wireshark,我实际上可以看到发送到数据库的SQL,它是正确的。问题是没有返回行。唯一的结论是参数绑定不能正常工作,因此没有返回结果。但是我不明白,因为完全相同的东西在 ubuntu 14.04 上也有效。唯一的区别是php7。所有其他应用程序也可以工作,所以问题出在这个特定的查询上。它有一个 subselect 和 Row_number() 函数。

【问题讨论】:

    标签: migration php-7 oci8


    【解决方案1】:

    这是 php 的另一个 WTF。定义。考虑用其他语言重写...认真的 php 家伙,抓紧...

    他们changed something fundamental 影响oci_bind_by_name,但没有在任何地方提及。

    可以通过重新排序代码来解决此问题。这意味着如果您在函数调用中绑定语句,则必须按此顺序执行:

    1. 创建语句
    2. 绑定语句 1
    3. 执行语句 1
    4. 绑定语句 2
    5. 执行语句 2

    等等。如果您首先绑定所有语句然后执行它,即使参数具有完全不同的名称和类型,稍后对绑定的调用也会覆盖先前的值。怎么回事?

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 2019-03-09
      • 1970-01-01
      • 2013-09-14
      • 2017-09-22
      • 2013-11-10
      • 2020-04-11
      • 2019-11-04
      • 2016-06-12
      相关资源
      最近更新 更多