Проверьте, существует ли таблица базы данных с использованием PHP / PDO
Я хочу проверить, существует ли таблица с определенным именем в базе данных, с которой я связан с использованием PHP и PDO.
Он должен работать на всех бэкэндах базы данных, таких как MySQL, SQLite и т. Д.
а затем поймать ошибку. Если вы не получите никакой ошибки, но результаты с одним столбцом, содержащим «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
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 >
Проверьте, существует ли таблица базы данных с использованием PHP / PDO
Я хочу проверить, существует ли таблица с определенным именем в базе данных, с которой я подключался с использованием PHP и PDO. Он должен работать со всеми базами данных, такими как MySQL, SQLite и т.д.
12 ответов
а затем поймайте ошибку. Если вы не получите никакой ошибки, но resultet с одним столбцом, содержащим «1», тогда таблица существует.
@feihtthief: Есть способы обойти эту проблему. Например, вы можете получить только первый ряд. Или, что еще лучше, даже не выполняйте утверждение, просто подготовьте его.
@MilanBabuškov MilanBabuškov Я не слежу за тем, как подготовка заявления и его невыполнение говорят о том, существует ли таблица. Я что-то пропускаю?
В этом ответе не рассматривается использование PDO или PHP, где в некоторых случаях имеются нюансы, связанные с обработкой исключений.
Здесь полная функция для проверки наличия таблицы.
/** * 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
@livefree75 livefree75 Возможно, вы могли бы быть более конкретным? Я не вижу никаких полей, предоставленных клиентом, здесь . возможно, я не уверен в проблеме, которую вы видите в его / ее коде?
@livefree75 livefree75 Почему это должно защищать? если он находится в слое db, защита не должна быть там вставлена. защита и безопасность не подразумевают повсеместное использование функции фильтра \ очистки.
Если вы хотите санировать, сделайте это в начале функции: $table = preg_replace(‘/[^\da-z_]/i’, », $table);
Прежде чем продолжить, я понимаю, что это решение, специфичное для MySQL.
Хотя все решения, упомянутые здесь, могут работать, я (лично) хотел бы, чтобы PDO отбрасывал исключения (личное предпочтение, все).
В качестве такового я использую следующее для проверки для создания таблицы:
SHOW TABLES LIKE 'some_table_of_mine';
Не существует состояния ошибки, если таблица не существует, вы просто получаете нулевой набор результатов. Работает быстро и последовательно для меня.
Как часть вашего проекта, создайте представление схемы.
Для Oracle это будет нечто вроде
SELECT TABLE_NAME FROM ALL_TABLES
SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'mydbname'
И затем запустите запрос в вашем коде против представления.
@sitilge PDO является ортогональным по отношению к рассматриваемой проблеме. Это просто инструмент для запуска запроса. Это хороший ответ.
@FélixGagnon-Grenier FélixGagnon-Grenier действительно, это инструмент. Однако ОП, скорее всего, хотел бы получить ответ: this is how you do it with PDO ответом this is how you do it with PDO , не так ли?
@DavidTimothyStrauss Я откатил ваши изменения, поскольку они совершенно неуместны. Мало того, что это неверный SQL-код, не было ничего о том, как на самом деле конкатенировать указанную переменную в запросе.
@sitilge может быть, хорошо. Я на самом деле не сильно не согласен, просто « это то, как вы делаете это с помощью PDO », объясняется в каждой тысяче учебников: он называется «Выполнение SQL-запроса». Если кто-то не может понять, что код SQL на самом деле предназначен для запуска, будь то с помощью PDO или чего-то еще, вряд ли можно надеяться, что он будет знать, как использовать подробный ответ .
@FélixGagnon-Grenier FélixGagnon-Grenier О, действительно, вы правы насчет синтаксиса; Я ошибочно предположил, что вы отвечаете на вопрос: (1) как проверить, существует ли конкретная таблица, и (2) сделать это с помощью PDO. Все, что удовлетворяет части # 1, должно включать в себя конкретное имя таблицы, которую ищут. Ваш код этого не делает; это просто перечисляет все таблицы. Создание представления также совершенно не имеет отношения к вопросу. Что касается конкатенации, ваш ответ даже не начинает рассматривать, как сделать это в PHP, что и было задано в вопросе.
Этот ответ также не подходит для третьей части вопроса, а именно переносимости. Ответ не только непереносим; он даже не отвечает, как обращаться с SQLite, чего конкретно хотел этот вопрос.
«Это то, как вы делаете это с помощью PDO», объясняется в каждой тысяче учебных пособий: оно называется выполнением SQL-запроса ». > На самом деле, правильное выполнение этого с помощью PDO требует получения точных кодов ошибок, относящихся к отсутствующей таблице, из PDOException, что отличается от выполнения обычного запроса, который вы ожидаете выполнить. Если вы перехватываете все исключения (или даже PDOExceptions), вы обнаружите «отсутствующую таблицу», если, скажем, соединение с БД разорвано.
Как я могу проверить, существует ли таблица MySQL с PHP?
Как просто в теории, как это звучит, я провел немало исследований, и мне трудно понять это. Как проверить, существует ли таблица MySQL и что она делает что-то. (Думаю, для этого может работать простой оператор php if/else) Есть ли способ сделать это? Это то, что я сделал с ответом cwallenpoole:
mysql_connect("SERVER","USERNAME","PASSWORD"); mysql_select_db('DATABASE'); $val = mysql_query('select 1 from `TABLE`'); if($val !== FALSE) < print("Exists"); >else
12 ответов
// Select 1 from table_name will return false if the table does not exist. $val = mysql_query('select 1 from `table_name` LIMIT 1'); if($val !== FALSE) < //DO SOMETHING! IT EXISTS! >else < //I can't find it. >
По общему признанию, это больше Pythonic, чем PHP-идиома, но, с другой стороны, вам не нужно беспокоиться о большом количестве дополнительных данных.
Изменить
Итак, этот ответ был отмечен как минимум дважды с момента, когда я пишу это сообщение. Предполагая, что я совершил некоторую гигантскую ошибку, я пошел, и я провел некоторые тесты, и именно это я обнаружил, что мое решение на 10% быстрее чем ближайшая альтернатива, когда таблица не существует, и она на 25% быстрее, когда таблица существует:
. BEGINNING NON-EXISTING TABLE. 23.35501408577 for bad select 25.408507823944 for select from schema num rows -- calls mysql_num_rows on select. from information_schema. 25.336688995361 for select from schema fetch row -- calls mysql_fetch_row on select. from information_schema result 50.669058799744 for SHOW TABLES FROM test . BEGINNING EXISTING TABLE. 15.293519973755 for good select 20.784908056259 for select from schema num rows 21.038464069366 for select from schema fetch row 50.400309085846 for SHOW TABLES FROM test
Я попытался запустить это против DESC, но у меня был тайм-аут после 276 секунд (24 секунды для моего ответа, 276, чтобы не завершить описание не существующей таблицы).
Для хорошей оценки я сравниваю схему с четырьмя таблицами, и это почти новая установка MySQL (пока это единственная база данных). Чтобы увидеть экспорт, посмотрите здесь.
И ДАЛЕЕ
Это конкретное решение также более независимо от базы данных, поскольку тот же запрос будет работать в PgSQL и Oracle.
НАКОНЕЦ
mysql_query() возвращает FALSE для ошибок, которые не являются «эта таблица не существует».
Если вам нужно гарантировать, что таблица не существует, используйте mysql_errno() , чтобы получить код ошибки и сравнить ее с соответствующим Ошибки MySQL.