【发布时间】: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() 函数。
【问题讨论】: