嗨,我正在尝试将名称存储到Oracle数据库中,并使用PHP和oci8将其获取回来.
但是,如果我é
直接插入Oracle数据库并使用oci8来获取它我只是收到一个e
在插入数据库之前,我是否必须将所有特殊字符(包括é
)编码为html实体(即:):é
或者我错过了什么?
谢谢
更新:3月1日18:40
发现这个功能:http: //www.php.net/manual/en/function.utf8-decode.php#85034
function charset_decode_utf_8($string) {
if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
return $string;
}
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}
Run Code Online (Sandbox Code Playgroud)
似乎工作,虽然不确定它是否是最佳解决方案
更新:3月8日15:45
Oracle的字符集是ISO-8859-1.
在PHP中我添加了:
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
Run Code Online (Sandbox Code Playgroud)
强制oci8连接使用该字符集.é
从PHP中检索使用oci8现在工作了!(因为varchars
,但不是CLOBs
必须utf8_encode
提取它)
所以然后我尝试将数据从PHP保存到Oracle ...它不起作用..从PHP到Oracle的过程中的é
某个地方变成了?
更新时间:3月9日14:47
所以越来越近了.添加NLS_LANG变量后,执行带有é
工作的直接oci8插入.
问题实际上是在PHP方面.通过使用ExtJs框架,在提交表单时,使用它对其进行编码encodeURIComponent
.
因此é
被发送%C3%A9
,然后重新编码成é
.
但它的长度现在是2 (strlen($my_sent_value) = 2)
而不是1.如果在PHP中我尝试:$ my_sent_value == …
所以在MUCH $ head-> desk()之后,我已经解决了.
记住孩子,要警惕你使用的即时客户端版本,这取决于虚拟化设置!
我一直在安装通用的即时客户端(不知道我们的ESX服务器位于AMD处理器上,而不是英特尔),而且内部工作正常(CentOS安装是32位,因为我们的内部ESXi服务器不是64位).好吧,即使您在位于AMD64上的虚拟化服务器上运行32位安装,您安装的即时客户端仍然很重要.
这是我想要检查的最后一件事但是看起来现在一切都运行正常.
我要感谢所有帮助我完成所有可能测试的人,但最终,我没有意识到虚拟化的差异.
更新(2010年5月21日) 当我在内部安装新VM时,我认为这个错误已经逃脱了,但我现在发现了一个缩小的链接.
当我发布这个时,我试图在我们的生产服务器上安装它.经过一周没有进展并且需要重新开发之后,我在我们的内部服务器上配备了一个全新安装的Crap ... CentOS,以及全新安装的即时客户端和oci8.
工作得很完美.
但是,我们只是将VM的精确副本上传到我们的生产服务器,它神奇地不再有效.尝试重新安装一切,无济于事.
所以我唯一可以解决的问题是防火墙问题(虽然我在尝试127.0.0.1时遇到同样的问题)或可能是ESX(我们的生产服务器)服务器问题,但内部服务器正在运行ESXi.
有什么想法吗?
更新(2010年3月8日)我安装了Xdebug并让它跟踪我的代码.这是我得到的输出:
TRACE START [2010-03-08 17:53:05]
0.2090 327864 -> {main}() /data/aims3/http/octest.php:0
0.2091 327988 -> ini_set(string(14), string(1)) /data/aims3/http/octest.php:3
0.2093 327920 -> error_reporting(long) /data/aims3/http/octest.php:4
0.2094 328048 -> oci_connect(string(8), string(8), string(25)) /data/aims3/http/octest.php:6
Run Code Online (Sandbox Code Playgroud)
跟踪在此时停止.
我已经在本地服务器上以相同的方式安装了一切,它工作正常.说我完全失败就会轻描淡写.
*注意:我运行了make test并且在每次测试时都返回了FAIL.我从来没有在我的工作机器上运行它,看它是否报告相同的错误.知道为什么make test会报告FAIL但是make不会报告任何错误吗?
我已经安装了没有报告错误的Oracle Instantclient以及OCI8 PECL软件包而且不知所措.每当我尝试使用oci_connect打开连接时,它都会暂停我的整个PHP脚本.
例:
<?php
ini_set ("display_errors", "1");
error_reporting(E_ALL);
echo "before";
$conn = oci_connect("username", "password", "host");
echo "after";
?>
Run Code Online (Sandbox Code Playgroud)
返回一个完整的空白页面.加载模块(在phpinfo中看到),所有安装都没有错误.
我完全失去了.
CentOS:5.4
Apache:2.2.3
PHP:5.3.1
InstantClient:11.2
oci8:1.4.1
有什么想法吗? …
根据这个(从PECL安装OCI8,自动化),我所要做的就是输入pecl oci8 install
.
但这只会让我反复出现以下错误.
No releases available for package pecl.php.net/oci8
.
另一个网站建议我试试pear install pecl/oci8
.发生同样的错误.
我该怎么做才能解决这个问题?
通过XAMPP启动Apache服务器时遇到一些问题。我已经安装了XAMPP版本5.6.3。
当我从xampp控制面板启动Apache服务器时,将显示一条错误消息,如下所示:
单击“确定”按钮后,将显示另一个对话框,如下所示:
事情是我想使用OCI代替mysql。因此,我已注释掉mysql扩展名,并在php.ini文件中未注释OCI扩展名。
该php_oci8_12c.dll文件在XAMPP的PHP扩展(EXT)文件夹中唯一可用的文件。因此,如上图所示,该行包含在php.ini中。
从那时起,我得到这个错误。
我也安装了即时客户端12.1,但没有运气。我还尝试从Instantclient_12_1复制OCI.dll并将其粘贴到c:/ xampp / php和c:/ xampp / apache / bin中。该错误仍然存在。
需要帮忙..
更新:我删除了环境变量PATH中的其他Oracle路径,仅保留了InstantClient路径。现在我收到此错误。
已提出类似的问题,但常规解决方案对我不起作用。也许我错过了一些东西。我快要失去理智了:(((
\n\n从标题中你可以明白,我有一个oracle数据库,其中包含非ascii内容。我想使用oci8用php查询/显示它。
\n\n首先数据库是ISO8859P9,即查询
\n\nselect parameter, value from v$nls_parameters where parameter in (\'NLS_CHARACTERSET\', \'NLS_LANGUAGE\', \'NLS_TERRITORY\')\n
Run Code Online (Sandbox Code Playgroud)\n\n回报
\n\nNLS_LANGUAGE AMERICAN\nNLS_TERRITORY AMERICA\nNLS_CHARACTERSER WE8ISO8859P9\n
Run Code Online (Sandbox Code Playgroud)\n\n所以我相应地设置了 NLS_LANG 变量,即 getenv("NLS_LANG") 返回“AMERICAN_AMERICA.WE8ISO8859P9”。
\n\n我插入AddDefaultCharset ISO-8859-9
到 /etc/apache2/conf.d/charset 文件,并且我总是包含<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
在 php 文件的 html 内容的 head 部分中。因此,当我通过 firebug 检查时,我看到响应的“Content-Type”标头是“text/html; charset=ISO-8859-9”。
最后,我在 /etc/php5/apache2/php.ini 文件中有一行default_charset = "ISO-8859-9"
,在输出 phpinfo() 的核心部分中,我看到 default_charset 是 ISO-8859-9。
在完成所有这些内容之后,当我检索其中包含字符的字符串\xc4\xb0
并回显它时,它显示为 \'?\'。那就是问题所在!!!当我查询时select dump(nameofthatstring, 16)...
,我看到它的字节值为DD,即根据8859-9正确。
我不确定它是否相关,但是,我会给出最后的细节:当我 …
我正在尝试编译PHP OCI8扩展并在Alpinelinux下运行它。但似乎扩展对musl libc中定义glibc
但缺少的符号有一些依赖性。
我可以使用任何已编译的PHP OCI8扩展名吗?或者,是否有任何变通办法可以使oci8扩展和oracle Instant Client与alpinelinux一起使用。
提前致谢!
我们在PHP中连接oracle服务器面临一个大问题我做了什么
第1集:
安装Windows 7 32位
第2步 :
安装XAMPP 32(包括:Apache 2.4.29,PHP 7.1.11,phpMyAdmin 4.7.4,OpenSSL 1.0.2,XAMPP控制面板3.2.2)
步 :
Instant Client Package - 基本:运行OCI,OCCI和JDBC-OCI应用程序所需的所有文件下载instantclient-basic-nt-12.2.0.1.0.zip并使用instantclient_12_2名称将其解压缩到c驱动器
第5步:
在路径"c:\ instantclient_12_2"中设置环境
第6步:
编辑php.ini文件并从前面启用extension = php_oci8_12c.dll(通过删除分号)
第7步:
重启我的apache服务器,之后我检查phpinfo()它没有显示任何oci8模块
然后我检查我的错误日志,我看到了这一点
[30-Nov-2017 13:42:43 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'C:\xampp\php\ext\php_oci8_12c.dll' - The specified procedure could not be found.
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题,
在此先感谢,对不起我的英语.
我安装了XAMPP for Windows 1.7.3.
我正在使用Zend Framework,需要使用pdo_oci8扩展.我已启用扩展 - 但现在得到错误,它无法找到oci.dll文件.
我从oracle下载了instantclient_11_2 zip文件.拉开拉链.它包含一堆dll文件.
如何在Windows上安装它?我是否需要运行cmd提示符或将其移至xampp下的特定文件夹?
我试图将我的fedora 25网络服务器-php连接到Oracle数据库。
为此,我需要pecl安装oci8。
但是我得到这个错误:
/bin/sh /var/tmp/pear-build-roottqYEC6/oci8-2.1.4/libtool --mode=compile cc -I. -I/var/tmp/oci8 -DPHP_ATOM_INC -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/include -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/main -I/var/tmp/oci8 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/usr/include/oracle/12.1/client64 -DHAVE_CONFIG_H -g -O2 -c /var/tmp/oci8/oci8.c -o oci8.lo
libtool: compile: cc -I. -I/var/tmp/oci8 -DPHP_ATOM_INC -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/include -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/main -I/var/tmp/oci8 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/usr/include/oracle/12.1/client64 -DHAVE_CONFIG_H -g -O2 -c /var/tmp/oci8/oci8.c -fPIC -DPIC -o .libs/oci8.o
In file included from /var/tmp/oci8/oci8.c:49:0:
/var/tmp/oci8/php_oci8_int.h:46:29: fatal error: oci8_dtrace_gen.h: No such file or directory
#include "oci8_dtrace_gen.h"
^
compilation terminated.
Makefile:196: recipe for target 'oci8.lo' failed
make: *** …
Run Code Online (Sandbox Code Playgroud) 自从PHP 7.1更新到PHP 7.2后,我无法安装oci8.我有这个错误:
root @ 3ab6027c8d95:/ var/www #php -v
PHP警告:PHP启动:无法加载动态库'oci8.so'(试过:/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so(libmql1.so:无法打开)共享对象文件:没有这样的文件或目录),/ usr/local/lib/php/extensions/no-debug-non-zts-1701/170/////-debug-non-zts-20170718/oci8.so.so:无法打开共享对象文件:没有这样的文件或目录))在第0行的Unknown中
PHP 7.2.0(cli)(内置:2017年12月12日05:52:58)(NTS)版权所有(c)1997-2017 PHP Group Zend Engine v3.2.0,版权所有(c)1998-2017 Zend Technologies with Zend OPcache Zend Technologies的v7.2.0,版权所有(c)1999-2017
我正在使用Docker环境,我为此创建了一个github repo,如果我使用PHP的7.1版本(shenron/docker-php-fpm:7.2),它就可以工作.
我不明白为什么脚本试图启动这个文件:/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so
.
就我而言,有两种可能性; 或者驱动程序不兼容,或者pecl今天不能安装oci8.
有没有人有同样的问题?
谢谢您的帮助.
成功安装ruby-0ci8 gem和oracle_enhanced适配器gem后,当我尝试启动rails项目服务器时出现以下错误:
=> Booting WEBrick
=> Rails 3.0.3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/Library/Ruby/Gems/1.8/gems/activerecord-oracle_enhanced-adapter-1.3.2/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb:7:
ERROR: ActiveRecord oracle_enhanced adapter could not load ruby-oci8 library.
Please install ruby-oci8 gem. (LoadError)
Run Code Online (Sandbox Code Playgroud)
enhanded adapter和ruby-oci8 gem都出现在我的gem列表中.两者都存在于我的Gemfile中.为什么适配器找不到oci8库?
关于我正在运行的设置的一些规范:
我看过这篇文章:Rails 3.0.3 - Oracle_enhanced不起作用.但它没有帮助.其他人遇到这个?
==============================
我明白了.最后,我在/ usr/local/oracle/instantclient_10_2 /中有一个不正确的文件结构,我已经为我的oracle即时客户端存储了文件.这就是造成所有问题的原因.基本上我在第一个目录中嵌套了第二个instantclient_10_2目录,并且我的.bash_profile查找了第一个目录,而不是它下面的目录.
有人可以帮助我如何通过PHP调用oracle中的存储过程?我有存储过程的示例
CREATE OR REPLACE PROCEDURE view_institution(
c_dbuser OUT SYS_REFCURSOR)
IS
BEGIN
OPEN c_dbuser FOR
SELECT * FROM institution;
END;
Run Code Online (Sandbox Code Playgroud)
上面名为view_instituion的存储过程用于显示表机构上的所有记录.有人可以教我在php中调用上面的存储过程.我是新玩的存储过程
谢谢
我正在尝试在oracle 11和php5.3下的Centos 5.11中安装oci8-1.4.9,但是当我使用时遇到错误
pecl install oci8-1.4.9
Run Code Online (Sandbox Code Playgroud)
错误
config.status: creating config.h
running: make
/bin/sh /var/tmp/pear-build-root/oci8-1.4.9/libtool --mode=compile gcc -I. -I/tmp/tmp9GRxQr/oci8-1.4.9 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/oci8-1.4.9/include -I/var/tmp/pear-build-root/oci8-1.4.9/main -I/tmp/tmp9GRxQr/oci8-1.4.9 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmp9GRxQr/oci8-1.4.9/oci8.c -o oci8.lo
mkdir .libs
gcc -I. -I/tmp/tmp9GRxQr/oci8-1.4.9 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/oci8-1.4.9/include -I/var/tmp/pear-build-root/oci8-1.4.9/main -I/tmp/tmp9GRxQr/oci8-1.4.9 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O2 -c /tmp/tmp9GRxQr/oci8-1.4.9/oci8.c -fPIC -DPIC -o .libs/oci8.o
In file included from /tmp/tmp9GRxQr/oci8-1.4.9/oci8.c:58:
/tmp/tmp9GRxQr/oci8-1.4.9/php_oci8_int.h:56:17: error: oci.h: No such file or directory
In file included from /tmp/tmp9GRxQr/oci8-1.4.9/oci8.c:58:
/tmp/tmp9GRxQr/oci8-1.4.9/php_oci8_int.h:113: error: expected specifier-qualifier-list before …
Run Code Online (Sandbox Code Playgroud)