CakePHP 4接入Oracle数据库遇ORA-00911错误,求解决方案
CakePHP 4 迁移至 Oracle 数据库时 find()/get() 方法抛出 ORA-00911 错误
我正在将CakePHP 4项目的数据库从MySQL切换到Oracle,使用CakeDC的Oracle驱动,已按要求安装instantclient 19.6、适配PHP7.4.33的oci8-2.2.0和pdo_oci扩展。
目前只有手动构建的查询能正常运行:
$sql = $this->oracleConnection ->newQuery() ->select('USERS.LOCKED, USERS.LOCK_TYPE') ->from('USERS') ->where('USERS.USERNAME = \'' . $username . '\' AND ROWNUM = 1') ->order([]);
但调用CakePHP自带的find()、get()等方法时,会抛出ORA-00911: invalid character错误。报错的find代码如下:
$blockedUser = $this->blockedUser->find('all', [ 'conditions' => [ 'BlockedUsers.blocked_until >' => FrozenTime::now(), 'BlockedUsers.username' => $username, ], ])->first();
生成的报错SQL语句:
SELECT * FROM ( SELECT cake_paging.*, (ROWNUM) AS _cake_page_rownum_ FROM ( SELECT BlockedUsers.ID AS BlockedUsers__ID, BlockedUsers.USERNAME AS BlockedUsers__USERNAME, BlockedUsers.OS AS BlockedUsers__OS, BlockedUsers.USER_AGENT AS BlockedUsers__USER_AGENT, BlockedUsers.CREATED AS BlockedUsers__CREATED, BlockedUsers.BLOCKED_UNTIL AS BlockedUsers__BLOCKED_UNTIL FROM blocked_users BlockedUsers WHERE (BlockedUsers.blocked_until > :c0 AND BlockedUsers.username = :c1) ) cake_paging ) cake_paging_out WHERE cake_paging_out."_cake_page_rownum_" <= 1
BLOCKED_USERS表结构字段包括ID、USERNAME、OS、USER_AGENT、CREATED、BLOCKED_UNTIL(均为大写命名)。
我的app.php数据库配置:
'default' => [ 'className' => 'CakeDC\OracleDriver\Database\OracleConnection', 'driver' => 'CakeDC\OracleDriver\Database\Driver\OracleOCI', 'persistent' => false, 'host' => 'myhost', 'port' => 'myport', 'username' => 'myusername', 'password' => 'mypassword', 'database' => 'myDB', 'sid' => 'mySID', 'encoding' => 'WE8ISO8859P1', 'timezone' => '+1:00', 'flags' => [], 'cacheMetadata' => true, 'log' => false, 'quoteIdentifiers' => false, 'server_version' => 10, 'url' => env('DATABASE_URL', null), ],
已经尝试过调整app.php中的多种连接配置,卸载重装PHP及相关扩展,现在不确定是操作有误还是该场景无法实现?
内容的提问来源于stack exchange,提问作者Henrique João
相关产品推荐
相关产品推荐

