我想将我的网络服务器升级到最新的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()函数。
答案 0 :(得分:0)
这是php的另一个WTF。业。考虑用其他语言重写......严肃的PHP家伙,抓紧...
他们changed something fundamental会影响oci_bind_by_name
,但不会在任何地方提及它。
可以通过重新排序代码来解决此问题。这意味着如果在函数调用中绑定语句,则必须按此顺序执行此操作:
等等。如果首先绑定所有语句然后执行它,稍后调用bind将覆盖以前的值,即使参数具有完全不同的名称和类型。 WTF?