У меня следующая проблема (таблица или представление не существует). Я использую 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
Последний пост:
Пожалуйста, посмотрите на 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))
{
[...]
Других решений пока нет …