Я хочу проверить, существует ли таблица с определенным именем в базе данных, с которой я связан с использованием PHP и PDO.
Он должен работать на всех бэкэндах базы данных, таких как MySQL, SQLite и т. Д.
Делать:
select 1 from your_table
а затем поймать ошибку. Если вы не получите никакой ошибки, но результаты с одним столбцом, содержащим «1», тогда таблица существует.
Вот полная функция проверки наличия таблицы.
/** * Check if a table exists in the current database. * * @param PDO $pdo PDO instance connected to a database. * @param string $table Table to search for. * @return bool TRUE if table exists, FALSE if no table found. */ function tableExists($pdo, $table) { // Try a select statement against the table // Run it in try/catch in case PDO is in ERRMODE_EXCEPTION. try { $result = $pdo->query("SELECT 1 FROM $table LIMIT 1"); } catch (Exception $e) { // We got an exception == table not found return FALSE; } // Result is either boolean FALSE (no table found) or PDOStatement Object (table found) return $result !== FALSE; }
Примечание. PDO будет генерировать исключения только в том случае, если ему сообщается, что по умолчанию он отключен и не исключает никаких исключений. То почему мы должны проверить результат также. См. Обработка ошибок PDO на php.net
Прежде чем продолжить, я понимаю, что это решение, специфичное для MySQL.
Хотя все решения, упомянутые здесь, могут работать, я (лично) хотел бы, чтобы PDO отбрасывал исключения (личное предпочтение, вот и все).
Таким образом, вместо этого я использую следующее для проверки создания таблицы:
SHOW TABLES LIKE 'some_table_of_mine';
Не возникает состояния ошибки, если таблица не существует, вы просто получаете нулевой набор результатов. Работает быстро и последовательно для меня.
В рамках вашего проекта создайте представление схемы.
Для Oracle это будет что-то вроде
SELECT TABLE_NAME FROM ALL_TABLES
Для Mysql:
SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'mydbname'
И Т.Д..
А затем запустите запрос в коде против представления.
После того, как у вас есть дескриптор базы данных через PDO, вы можете сделать это:
$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';
Или заверните его в функцию.
Сначала я попытался возиться с try / catch, но даже если таблица не существует, исключений не было. Наконец, закончилось проверкой типа данных возвращаемого значения из вызова exec dbh. Это либо целое число, если есть совпадение по счету выбора (даже если число равно 0 или логическое значение false, если результатов не было.
Я думаю, что это должно работать со всеми типами баз данных, поддерживаемых PDO, поскольку синтаксис действительно прост.
Возможно, вам удастся избежать полагаться на ошибку, используя запрос по строкам «SHOW TABLES LIKE» your_table '», а затем подсчет строк. Я успешно использовал этот метод с MySQL и PDO, но еще не тестировал его с другими БД
Вы можете сделать «select count (*) from table» query from php. Если он возвращает ошибку или исключение, таблица не существует. Это может быть последним возможным курортом, и я уверен, что это работает.
Или вы можете напрямую проверить таблицу схемы (возможно, для добавления дополнительных разрешений для администратора)
Я делаю несколько вещей в своих веб-приложениях с помощью CodeIgniter, чтобы проверить, существует ли база данных (и это полезно), любой из них может работать:
@$this->load->database(); $v = @$this->db->version() $tables = @$this->db->list_tables();
Добавление @
будет подавлять ошибки, если вы включили их в настройках PHP, и проверка результатов version()
и list_tables()
может использоваться не только для определения того, находится ли ваша БД (но это тоже нормально).
Эта полная функция очень похожа на ответ esbite, но включает код для защиты от SQL-инъекции. Кроме того, вы не можете получать согласованные результаты от принятого ответа, когда указанная таблица пуста.
/** * This function checks if the table exists in the passed PDO database connection * @param PDO $pdo - connection to PDO database table * @param type $tableName * @return boolean - true if table was found, false if not */ function tableExists(PDO $pdo, $tableName) { $mrSql = "SHOW TABLES LIKE :table_name"; $mrStmt = $pdo->prepare($mrSql); //protect from injection attacks $mrStmt->bindParam(":table_name", $tableName, PDO::PARAM_STR); $sqlResult = $mrStmt->execute(); if ($sqlResult) { $row = $mrStmt->fetch(PDO::FETCH_NUM); if ($row[0]) { //table was found return true; } else { //table was not found return false; } } else { //some PDO error occurred echo("Could not check if table exists, Error: ".var_export($pdo->errorInfo(), true)); return false; } }
Вот что сработало для меня. Это было сочетание нескольких ответов:
$table_name = 'your_table_here'; $test = "SELECT 1 FROM " . $table_name . " LIMIT 1"; $test = $db->query($test); //$db needs to be PDO instance if($test) { return 1; //Table exists } else { return 0; //No table in database }