Подтвердить что ты не робот

Проверьте, существует ли таблица базы данных с использованием PHP/PDO

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

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

4b9b3361

Ответ 1

делать:

select 1 from your_table

а затем поймайте ошибку. Если вы не получите никакой ошибки, но resultet с одним столбцом, содержащим "1", тогда таблица существует.

Ответ 2

Здесь полная функция для проверки наличия таблицы.

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

Ответ 3

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

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

В качестве такового я использую следующее для проверки для создания таблицы:

SHOW TABLES LIKE 'some_table_of_mine';

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

Ответ 4

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

Для Oracle это будет нечто вроде

SELECT TABLE_NAME FROM ALL_TABLES

Для Mysql:

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

ETC..

И затем запустите запрос в вашем коде против представления.

Ответ 5

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

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

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

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

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

Ответ 6

Возможно, вам удастся избежать полагаться на ошибку, используя запрос по строкам "SHOW TABLES LIKE" your_table ", а затем подсчет строк. Я успешно использовал этот метод с MySQL и PDO, но еще не тестировал его с другими DB

Ответ 7

Вы можете сделать "select count (*) from table" query from php. Если он возвращает ошибку или исключение, таблица не существует. Это может быть последним возможным курортом, и я уверен, что это работает.

Или вы можете напрямую проверить таблицу схемы (возможно, для добавления дополнительных разрешений для администратора)

Ответ 8

Я делаю несколько вещей в своих веб-приложениях с помощью CodeIgniter, чтобы проверить, существует ли база данных (и это полезно), любой из них может работать:

@$this->load->database();
$v = @$this->db->version()
$tables = @$this->db->list_tables();

Добавление @ приведет к подавлению ошибок, если вы включили их в настройках PHP, и проверка результатов version() и list_tables() может использоваться не только для определения того, существует ли ваша БД (но что это здорово тоже).

Ответ 9

Эта полная функция очень похожа на ответ 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;
    }
}

Ответ 10

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

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), если таблица не существует, но будет успешной, если таблица существует и/или пуста

Ответ 11

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

$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();

Ответ 12

Похоже, что это работает по крайней мере с SQLite3 без исключений и т. Д.:

        $select =
            "SELECT CASE WHEN EXISTS (SELECT * FROM SQLITE_MASTER WHERE TYPE = 'table' AND NAME = :tableName) THEN 1 ELSE 0 END AS TABLE_EXISTS;";

Ответ 13

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

$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
}