我正在尝试使用PHP连接到远程系统上的Pervasive 11数据库。 DSN在/etc/odbc.ini中设置。 psql(由Pervasive客户端安装程序创建)和www-data用户可以使用
连接到远程系统isql -v remote
此外,www-data用户被添加到pvsw组,并且所需的环境变量PVSW_ROOT和LD_LIBRARY_PATH在/etc/apache2/envvars
以及使用SetEnv
的vhost中设置。
我的PHP脚本如下:
<?php
$connect = odbc_connect("remote", "", "") or die("Could not connect");
$query = "SELECT * FROM \"ITEMS\"";
$prepared = odbc_prepare($connect, $query);
$result = odbc_execute($prepared);
odbc_result_all($prepared);
脚本从命令行运行正常:
sudo -u www-data /usr/bin/php /var/www/odbc.php
并按预期输出。
但是,访问http://example.org/odbc.php会导致空白页面,并且没有从Apache发送数据(使用wget和Chrome检查)。使用tcpdump
显示服务器和Pervasive远程数据库之间的连接,通过从Apache调用CLI中的脚本。该系统是Debian 64 bit 7.7。 'logLevel debug'在vhost配置中设置,但不记录任何错误。
为什么Apache没有返回任何数据?
编辑:
使用gdb
并逐步执行处理请求的apache webserver进程,我收到此错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007ff48c68ea2f in ErrStmtWithState () from /usr/local/psql/lib64/libodbcci.so
看起来像个bug,不是吗?
答案 0 :(得分:1)
可能是一个错误:http://cs.pervasive.com/forums/p/14802/53328.aspx。
我遇到了同样的问题,但是用mod_wsgi和python以及google“ErrStmtWithState”来到这里。我的(远非最佳)解决方案受到https://serverfault.com/questions/451220/psql-64bit-driver-error的启发。我创建了以下shell脚本:
#!/bin/bash
PVSW_ROOT=/usr/local/psql
PATH=$PATH:$PVSW_ROOT/bin:/bin:/usr/bin
LD_LIBRARY_PATH=$PVSW_ROOT/lib64:$PVSW_ROOT/bin:/usr/lib
MANPATH=$MANPATH:$PVSW_ROOT/man
export PVSW_ROOT
export LD_LIBRARY_PATH
python wrapper.py "$@"
其中“wrapper.py”针对作为参数传递的dsn运行查询并输出序列化结果集:
import pyodbc
import cPickle
import sys, getopt
def main(argv):
dsn = ''
query = ''
hm = 'usage: wrapper.py -d <dsn> -q <query>'
try:
opts, args = getopt.getopt(argv,"hd:q:",["dsn=","query="])
except getopt.GetoptError:
print hm
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print hm
sys.exit()
elif opt in ("-d", "--dsn"):
dsn = arg
elif opt in ("-q", "--query"):
query = arg
cnxn = pyodbc.connect('DSN='+dsn)
cursor = cnxn.cursor()
cursor.execute(query)
rows = cursor.fetchall()
print(cPickle.dumps(rows))
if __name__ == "__main__":
main(sys.argv[1:])
从普及文档复制的环境变量: http://docs.pervasive.com/products/database/psqlv10/wwhelp/wwhimpl/js/html/wwhelp.htm#href=getstart/unixappconf.15.3.html
答案 1 :(得分:0)
当我运行您的代码时,我收到一条消息,指出odbc_result_all
期望参数1成为资源
当我将其更改为以下内容时,它起作用了:
<?php
$connect = odbc_connect("remote", "", "") or die("Could not connect.");
$query = "SELECT * FROM \"ITEMS\"";
$prepared = odbc_prepare($connect, $query);
if (!odbc_execute($prepared)) {
die(odbc_errormsg());
}
if (odbc_result_all($prepared) < 1) {
die(odbc_errormsg());
}
?>
这是有道理的,因为odbc_excute
被声明为:
bool odbc_execute ( resource $result_id [, array $parameters_array ] )
和odbc_result_all
声明为:
int odbc_result_all ( resource $result_id [, string $format ] )
PHP docs中的。