Проверьте, существует ли таблица базы данных с использованием PHP / PDO - PullRequest
25 голосов
/ 11 ноября 2009

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

Он должен работать на всех серверах базы данных, таких как MySQL, SQLite и т. Д.

Ответы [ 12 ]

33 голосов
/ 16 января 2013

Вот полная функция для проверки, существует ли таблица.

/**
 * 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

9 голосов
/ 27 апреля 2013

Прежде чем я продолжу, я понимаю, что это решение для MySQL.

Хотя все упомянутые здесь решения могут работать, я (лично) хотел бы, чтобы PDO не выдавал исключения (личные предпочтения, вот и все).

Поэтому я использую следующее для проверки создания таблицы:

SHOW TABLES LIKE 'some_table_of_mine';

Нет состояния ошибки, если таблица не существует, вы просто получаете нулевой набор результатов. У меня работает быстро и стабильно.

9 голосов
/ 11 ноября 2009

Do:

select 1 from your_table

, а затем поймать ошибку. Если вы не получили какую-либо ошибку, но получили набор результатов с одним столбцом, содержащим «1», то таблица существует.

3 голосов
/ 11 ноября 2009

Как часть вашего проекта, создайте представление схемы.

Для Oracle это было бы что-то вроде

SELECT TABLE_NAME FROM ALL_TABLES

Для Mysql:

SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'mydbname'

ETC ..

А затем выполните запрос в своем коде к представлению.

2 голосов
/ 14 июня 2012

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

$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';

Или оберните его в функцию.

Сначала я попытался возиться с try / catch, но даже если таблица не существует, исключений не было. Наконец, закончилась проверка на тип данных возвращаемого значения из вызова dbh exec. Это либо целое число, если есть совпадение в счетчике выбора (даже если счетчик равен 0, либо логическое значение false, если результатов не было.

Я думаю, что это должно работать со всеми типами баз данных, которые поддерживает PDO, поскольку синтаксис действительно прост.

1 голос
/ 22 февраля 2013

Вы могли бы избежать необходимости полагаться на ошибку, используя запрос в строке «SHOW TABLES LIKE 'your_table'» и затем считая строки. Я успешно использую этот метод с MySQL и PDO, но еще не протестировал его с другими БД

0 голосов
/ 26 марта 2019

Сделайте запрос, где вы попросите базу данных создать таблицу, если она не существует:

$string = "CREATE TABLE IF NOT EXISTS " .$table_name . " int(11) NOT NULL AUTO_INCREMENT,
  `id` int(3) NOT NULL,
  `blabla` int(2) NOT NULL,
  `blabla1` int(2) NOT NULL,
  `blabla3` varchar(3) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
AUTO_INCREMENT=1 ";

$sql = $conection->prepare($string);
$sql->execute();
0 голосов
/ 21 июня 2018

Сначала я использовал принятый ответ, но потом заметил, что он не работает с пустыми таблицами. Вот код, который я сейчас использую:

function DB_table_exists($db, $table){
    GLOBAL $db;
    try{
        $db->query("SELECT 1 FROM $db.$table");
    } catch (PDOException $e){
        return false;
    }
    return true;
}

Этот код является выдержкой из моего класса расширения для PDO. Он выдаст ошибку (и вернет false), если таблица не существует, но будет успешной, если таблица существует и / или пуста

0 голосов
/ 03 апреля 2015

Вот что сработало для меня. Это была комбинация нескольких ответов:

$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
}
0 голосов
/ 30 января 2015

Эта полная функция очень похожа на ответ 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...