Ответы:
Я не знаю синтаксиса PDO для него, но это кажется довольно простым:
$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;
mysql_*
функций, они официально осуждается , больше не поддерживается и будет удален в будущем. Вы должны обновить свой код с помощью PDO или MySQLi, чтобы обеспечить функциональность вашего проекта в будущем.
Если вы используете MySQL 5.0 и новее, вы можете попробовать:
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = '[database name]'
AND table_name = '[table name]';
Любые результаты указывают на то, что таблица существует.
С: http://www.electrictoolbox.com/check-if-mysql-table-exists/
Используя mysqli, я создал следующую функцию. Предположим, у вас есть экземпляр mysqli с именем $ con.
function table_exist($table){
global $con;
$table = $con->real_escape_string($table);
$sql = "show tables like '".$table."'";
$res = $con->query($sql);
return ($res->num_rows > 0);
}
Надеюсь, поможет.
Предупреждение: как предположил @jcaron, эта функция может быть уязвима для sqlinjection attacs, поэтому убедитесь, что ваш $table
var чистый, или даже лучше используйте параметризованные запросы.
Это просто публикуется, если кто-то ищет этот вопрос. Хотя на него немного ответили. Некоторые ответы делают его более сложным, чем хотелось бы.
Для mysql * я использовал:
if (mysqli_num_rows(
mysqli_query(
$con,"SHOW TABLES LIKE '" . $table . "'")
) > 0
or die ("No table set")
){
В PDO я использовал:
if ($con->query(
"SHOW TABLES LIKE '" . $table . "'"
)->rowCount() > 0
or die("No table set")
){
Здесь я просто вставляю условие else в или. А для моих нужд мне просто нужно умереть. Хотя можно установить или на другие вещи. Некоторые могут предпочесть if / else if / else. Который затем удалить или, а затем поставить if / else if / else.
Вот мое решение, которое я предпочитаю при использовании хранимых процедур. Пользовательская функция mysql для проверки наличия таблицы в текущей базе данных.
delimiter $$
CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
DECLARE _exists TINYINT(1) DEFAULT 0;
SELECT COUNT(*) INTO _exists
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = _table_name;
RETURN _exists;
END$$
SELECT TABLE_EXISTS('you_table_name') as _exists
Поскольку "Показать таблицы" может работать медленно в больших базах данных, я рекомендую использовать "DESCRIBE" и проверить, получаете ли вы в результате true / false.
$tableExists = mysqli_query("DESCRIBE `myTable`");
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
foreach( $row as $key => $value )
{
if ( $value = BTABLE ) // BTABLE IS A DEFINED NAME OF TABLE
echo "exist";
else
echo "not exist";
}
}
Zend framework
public function verifyTablesExists($tablesName)
{
$db = $this->getDefaultAdapter();
$config_db = $db->getConfig();
$sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}' AND table_name = '{$tablesName}'";
$result = $db->fetchRow($sql);
return $result;
}
Если причиной этого является условное создание таблицы, то «CREATE TABLE IF NOT EXISTS» кажется идеальным вариантом для этой работы. Пока я этого не обнаружил, я использовал метод DESCRIBE, описанный выше. Подробнее здесь: MySQL «СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ» -> Ошибка 1050