Метод table_exists () может работать неправильно - PullRequest
3 голосов
/ 28 февраля 2012

Я начинаю писать простой класс Model, используя codeigniter 2.1.0. Все, что я хочу сейчас сделать - это создать и удалить таблицу MySQL, которую он представляет. Вот код:

<?php

    class Users_model extends CI_Model {

        public function createTable(){

            if( $this->db->table_exists('users') == FALSE ){

                $query = "CREATE TABLE users(
                        id SERIAL PRIMARY KEY,
                        email  VARCHAR(52) NOT NULL check(email <> ''),
                        UNIQUE (email)
                        )ENGINE = InnoDB;";

                $this->db->query($query);

            }

        }

        public function deleteTable(){

            if( $this->db->table_exists('users') ){

                $query = "DROP TABLE users;";

                $this->db->query($query);

            } else {

                echo "users not found <br />";

                $tables = $this->db->list_tables();
                foreach ($tables as $table)
                {
                    echo $table."<br />";
                }
            }

        }


    }

?>

И вот код, который я выполняю в основном классе:

$this->load->model('users_model');
$this->users_model->deleteTable();
$this->users_model->createTable(); 

Первый запуск в порядке и денди. Таблицы созданы просто отлично. Но затем, когда я запускаю его снова, я получаю вывод:

users not found
users

При дальнейшей проверке я понимаю, table_exists() никогда не возвращается TRUE. var_dump($this->db->table_exists('users')); возвращает bool(false).

Итак, я что-то не так делаю? Это так просто, скопируйте из документации . Google не возвращает ничего связанного, и, будучи программистом на C, я всегда придерживаюсь мнения: «Если есть ошибка, она ваша. возможность.

TL; DR

Почему table_exists('users') в приведенном выше коде никогда не возвращает TRUE, даже если list_tables() возвращает 'users';

Ответы [ 6 ]

2 голосов
/ 28 февраля 2012

В качестве решения вашей проблемы в codeigniter вы можете попробовать эту функцию

function validateTable($tableName)
    {
        $result = $this->db->list_tables();

        foreach( $result as $row ) {
            if( $row == $tableName )    return true;
        }
        return false;
    }
2 голосов
/ 28 февраля 2012

Попробуйте использовать var_dump() вместо echo. Булевы значения плохо работают с echo.

var_dump( $this->db->table_exists('users') );

Исходный код из table_exists выглядит следующим образом:

function table_exists($table_name)
{
    return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE;
}

Обновление из комментариев

Если вы посмотрите на _protect_identifiers , это добавит имя базы данных к имени таблицы. Но там должно быть. между db.table. Может быть, ваш конфиг БД испорчен?

0 голосов
/ 27 февраля 2017

у меня это сработало

$YOUR_TABLE_NAME="XYZ";
if ($this->db->table_exists($YOUR_TABLE_NAME) )
{
  echo "table exists";
}
else
{
  echo "table does not exist";
}
0 голосов
/ 20 декабря 2016

Наличие той же проблемы с CodeIgniter 3 при попытке использовать table_exists () в контексте миграции. (Похоже, что работает, как и ожидалось, в других пунктах моего кода.)

Для MySQL вот дешевая и веселая замена:

if(is_null($this->db->query("SHOW TABLES LIKE '{$tableName}'")->row()))
{
    //echo "Table {$tableName} does not exist";
}

Хотя, к сожалению, эта замена, похоже, не устраивает включенное кэширование базы данных CI.

: - /

ОК, так что я только что рылся в коде, и, хотя это не похоже на ошибку, это определенно полезно знать:

DB_driver.php

  • :: table_exists (), который зависит от:

  • :: list_tables (), которая может извлекать список имен таблиц из собственного "на экземпляр" кеша или по запросу, предоставленному:

  • :: _ list_tables () [в рассматриваемом mysqliOrWhwhat_driver.php], который для MySQL является запросом «SHOW TABLES FROM theSchemaName»

DB_forge.php

Следующие методы могут потенциально повлиять на "на экземпляр" кеш DB_driver.php:

  • :: create_table () [ОБНОВЛЕНИЕ нет! он не обновляет кэшированный список таблиц. Это причуда для меня!]
  • :: drop_table ()
  • :: rename_table ()

(имеет смысл, верно?)

0 голосов
/ 29 июля 2013

У меня похожая проблема с этой функцией.

Я использую скрипт для создания таблиц, которые требуются моему сайту, если функция table_exists () определяет, что какая-либо из требуемых таблиц отсутствует. Я продолжаю видеть странную проблему, когда при загрузке первой страницы несколько вставок в базу данных, кажется, не происходит. Я думал, что была проблема с моими операторами вставки, но я не мог найти единственную ошибку. Кроме того, после первой загрузки страницы все работало нормально. Оказывается, что скрипт создания таблицы вызывался несколько раз, каждый раз создавая пустую таблицу.

Я предполагаю, что результаты, возвращаемые несколькими вызовами table_exists (), не меняются в зависимости от таблиц, которые создаются после его вызова (в первый раз).

Я также пытался использовать решение, данное Шаяном Хусаини. list_tables (); также, кажется, отвечает так же. Он не вернет новые таблицы, созданные после его вызова.

Я в итоге исправил эту проблему, отслеживая каждую таблицу, созданную во время загрузки страницы. Тем не менее, я чувствую, что эти функции должны быть в состоянии найти новые таблицы, которые были добавлены в базу данных после того, как эти функции были вызваны один (или более) раз.

0 голосов
/ 28 февраля 2012

В качестве решения этой проблемы вы можете использовать метод для вывода списка всех таблиц (в виде ссылки) и сохранения их в массиве

while ($row = mysql_fetch_row($result)) {
echo "Table: {$row[0]}\n";
//search array here
}

Вы можете следовать примеру 1 по следующей ссылке:

http://uk.php.net/manual/en/function.mysql-list-tables.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...