首页 > 解决方案 > 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() 在查询中添加双引号。但是解决方案对我不起作用。

标签: phporaclecodeignitercodeigniter-3oracle12c

解决方案


我找到了解决方案: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))
  {
 [...]

推荐阅读