Я хочу проверить, существует ли таблица с определенным именем в базе данных, с которой я подключался с использованием PHP и PDO.
Он должен работать со всеми базами данных, такими как MySQL, SQLite и т.д.
Я хочу проверить, существует ли таблица с определенным именем в базе данных, с которой я подключался с использованием PHP и PDO.
Он должен работать со всеми базами данных, такими как MySQL, SQLite и т.д.
делать:
select 1 from your_table
а затем поймайте ошибку. Если вы не получите никакой ошибки, но resultet с одним столбцом, содержащим "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'
ETC..
И затем запустите запрос в вашем коде против представления.
Как только у вас есть дескриптор базы данных через PDO, вы можете сделать это:
$tableExists = gettype($dbh->exec("SELECT count(*) FROM $table")) == 'integer';
Или оберните его в функцию.
Сначала я попытался возиться с try/catch, но даже если таблица не существует, исключений не было. Наконец, закончилось проверкой типа данных возвращаемого значения из вызова exec dbh. Это либо целое число, если есть совпадение по счету выбора (даже если число равно 0 или логическое значение false, если результатов не было.
Я думаю, что это должно работать со всеми типами баз данных, поддерживаемых PDO, поскольку синтаксис действительно прост.
Возможно, вам удастся избежать полагаться на ошибку, используя запрос по строкам "SHOW TABLES LIKE" your_table ", а затем подсчет строк. Я успешно использовал этот метод с MySQL и PDO, но еще не тестировал его с другими DB
Вы можете сделать "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;
}
}
Сначала я использовал принятый ответ, но потом заметил, что он не работает с пустыми таблицами. Вот код, который я сейчас использую:
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), если таблица не существует, но будет успешной, если таблица существует и/или пуста
Сделайте запрос, где вы попросите базу данных создать таблицу, если она не существует:
$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();
Похоже, что это работает по крайней мере с SQLite3 без исключений и т. Д.:
$select =
"SELECT CASE WHEN EXISTS (SELECT * FROM SQLITE_MASTER WHERE TYPE = 'table' AND NAME = :tableName) THEN 1 ELSE 0 END AS TABLE_EXISTS;";
Вот что сработало для меня. Это была комбинация нескольких ответов:
$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
}