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 () добавляет двойные кавычки в запрос. Но решение не работает для меня.

0

Решение

Я нахожу решение: 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 (Система / база данных / 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))
{
[...]
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]