oci8(Oracle)迁移到php7后的问题

时间:2016-05-26 11:37:45

标签: migration php-7 oci8

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

在第一个应用程序中,我遇到了一个与oracle(oci8)的奇怪问题。该应用程序使用服务器端分页,并显示诸如" Total Records"和"总记录(已过滤)"。当然这些"指标"基于简单的计数查询,它们工作并显示正确的结果。但是,获取实际数据的select语句返回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似乎已禁用#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> #include <queue> #include <limits.h> using namespace std; int main() { //test numbers int t; //the cost int cost = 6; cin >> t; //for each test for (int nt = 0; nt < t; ++nt) { int n, e; int snode; queue <int> *que = new queue<int>(); //read the node/edges cin >> n >> e; //distance/visited/parents arrays/adjlist vector int dist[n + 1] = {-1}; bool visited[n + 1] = {false}; int parents[n + 1] = {-1}; vector< vector<int> > adjList(n + 1); //read into the adjlist, unoriented graph, each edge has 6 weight for (int ne = 0; ne < e; ++ne) { int x, y; cin >> x >> y; adjList[x].push_back(y); adjList[y].push_back(x); } //read the starting node cin >> snode; dist[snode] = 0; //do actual bfs que->push(snode); visited[snode] = true; while(!que->empty()) { int c_node = que->front(); que->pop(); for (int i = 0; i < adjList[c_node].size(); ++i) { if (visited[adjList[c_node].at(i)] == false) { que->push(adjList[c_node].at(i)); parents[adjList[c_node].at(i)] = c_node; dist[adjList[c_node].at(i)] = dist[parents[adjList[c_node].at(i)]] + cost; visited[adjList[c_node].at(i)] == true; } } } //print at output the distance from the starting node to each other node //if unreachable, print -1 for (int i = 1; i < n + 1; ++i) { if (i == snode) { } else if (dist[i] == 0 && i != snode) { cout << "-1 "; } else { cout << dist[i] << " "; } } cout << "\n"; } return 0; }

所以我很丢失。任何想法可能导致这种情况以及如何进一步调试/搜索它的原因?

编辑:

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

1 个答案:

答案 0 :(得分:0)

这是php的另一个WTF。业。考虑用其他语言重写......严肃的PHP家伙,抓紧...

他们changed something fundamental会影响oci_bind_by_name,但不会在任何地方提及它。

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

  1. 创建语句
  2. Bind Statement 1
  3. 执行陈述1
  4. Bind Statement 2
  5. 执行声明2
  6. 等等。如果首先绑定所有语句然后执行它,稍后调用bind将覆盖以前的值,即使参数具有完全不同的名称和类型。 WTF?