php - CodeIgniter e Oracle - 表名中的双引号 - ActiveRecords
问题描述
我遇到以下问题(表或视图不存在)。我正在使用 CodeIgniter 3 和 Oracle 12c。
我的模型:
public function getAll(){
$query = $this->db->get('usr');
return $query->result_array();
}
我已经尝试了很多,但没有解决方案可以解决我的问题。对于大家提到的codeIgniter 2或更早的版本。
如果我使用以下查询,则代码有效。但我想使用 ActiveRecords:
SELECT * FROM usr
这是相同的问题CodeIgniter 和 Oracle 数据库 - ActiveRecord insert() 在查询中添加双引号。但是解决方案对我不起作用。
解决方案
我找到了解决方案:https ://forum.codeigniter.com/archive/index.php?thread-47389.html
葡萄牙语解决方案:https ://wordivino.blogspot.com/2019/01/codeigniter-e-oracle-12c-message.html
最后一个帖子:
请看 CI 生成的 SQL 查询:
SELECT * FROM "project_users" WHERE "userid" = 'user1' AND "password" = 'iamuser1'
请注意,表名和表字段有双引号,问题的原因是:在 oracle SQL 查询中,您不要转义标识符的名称。
查看 CI 的源代码,基类 CI_DB 有一个标志,指示标识符必须被转义。这在 Oracle 中不是必需的,所以我只需在 system/database/drivers/oci8_diver.php 中添加此属性...
var $_protect_identifiers = FALSE;
(如果其他人想测试它,我将上面的行放在 OCI 8 驱动程序上的方法 db_connect() 之前)。
就我而言,我将变量放在class CI_DB_oci8_driver extends CI_DB {
class CI_DB_oci8_driver extends CI_DB {
var $_protect_identifiers = FALSE;
[...]
解决此问题的另一种方法是修改DB_driver.php
(system/database/DB_driver.php)。
找到public function protect_identifiers
添加$item = strtoupper($item);
结果:
public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE)
{
$item = strtoupper($item); //linha inserida
if ( ! is_bool($protect_identifiers))
{
[...]
推荐阅读
- c# - 如何创建词法分析器/解析器?
- django - django 网站的流程是什么......视图、模板、模型和表单实际上是做什么的
- java - 使用 webflux 的两个同步调用
- spring - 将配置文件附加到其他弹簧配置文件
- nativescript - 构建具有最小大小的 NativeScript 空白项目
- php - 如何修复:我的字体和 @font-face 使用的所有 wordpress 图标突然被禁用
- plsql - 什么是参数化光标,我们需要在哪种情况下使用它?
- android - 发布应用程序时的应用程序启动器图标大小
- java - 如果 s(a string) 不包含 chars(another string) 中找到的任何字符,您如何编写返回 true 的代码,否则返回 false
- rust - 如何解除阻塞未来的线程并返回结果