CodeIgniter e Oracle - Двойные кавычки в имени таблицы - ActiveRecords - PullRequest
0 голосов
/ 30 января 2019

У меня следующая проблема (таблица или представление не существует) .Я использую 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 и база данных Oracle - ActiveRecord insert () добавляет двойные кавычки в запросе .Но решение не работает для меня.

1 Ответ

0 голосов
/ 31 января 2019

Я нахожу решение: https://forum.codeigniter.com/archive/index.php?thread-47389.html

Решения на португальском: https://wordivino.blogspot.com/2019/01/codeigniter-e-oracle-12c-message.html

Последнее сообщение :


Пожалуйста, посмотрите на SQL-запрос, сгенерированный CI:

SELECT * FROM "project_users" WHERE "userid" = 'user1' AND "password" = 'iamuser1'

Обратите внимание, что имена таблиц и поля таблиц имеют двойные кавычки, и что причина проблемы: в SQL-запросе оракула, вы НЕ экранируете имя идентификаторов.

Если посмотреть на источник CI, у базового класса CI_DB есть флаг, указывающий, что идентификаторы ДОЛЖНЫ быть экранированы.Это не обязательно в Oracle, поэтому я просто добавляю этот атрибут в system / database / drivers / oci8_diver.php ...

var $_protect_identifiers = FALSE;

(Если кто-то еще хочет проверить это, я поставил строку вышеметод db_connect () в драйвере OCI 8).


В моем случае я ставлю переменную после 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 add $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))
  {
 [...]
...