CodeIgniter e Oracle-表名中的双引号-ActiveRecords

时间:2019-01-30 18:22:34

标签: php oracle codeigniter codeigniter-3 oracle12c

我遇到以下问题(表或视图不存在)。我正在使用CodeIgniter 3和Oracle 12c。

enter image description here

我的模特:

public function getAll(){
      $query = $this->db->get('usr');
      return $query->result_array();
}

我已经尝试了很多,但没有解决方案能够解决我的问题。对于每个人都参考了codeIgniter 2或更早的版本。

如果我使用以下查询,则代码有效。但是我想使用ActiveRecords:

SELECT * FROM usr

这是相同的问题CodeIgniter and Oracle database - ActiveRecord insert() is adding double quotes in query。但是该解决方案对我不起作用。

1 个答案:

答案 0 :(得分:0)

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