Php mysql проверить существование таблицы

Проверьте, существует ли таблица базы данных с использованием 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

Читайте также:  Html css style justify

@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), вы обнаружите «отсутствующую таблицу», если, скажем, соединение с БД разорвано.

Источник

Проверка на существование таблицы

Проверка записи на существование в БД
Перед добавлением новой записи в БД, осуществляю проверку на ее существавание в БД. Например при.

Проверка на существование логина в БД
Хочу при регистрации проверить, есть ли пользователь с таким логином. $sql = mysql_query("SELECT *.

Запрос и проверка на существование
Доброго времени суток. Есть 5 переменных ($a, $b, $c, $d, $e) которые методом $_GET берут.

SHOW TABLES LIKE 'the-table';

Добавлено через 18 минут
или просто

if (!mysql_query("SELECT * FROM table_name")){ echo "Таблицы нет"; }

Эксперт HTML/CSSЭксперт PHP

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 $link = mysql_connect('sql-4.radyx.ru', 'connections611','sdap3b6ii1') or die(mysql_error()); mysql_select_db('connections611') or die(mysql_error()); /*--------Готовим текст для записи----------- --------------------------------------------*/ $n=iconv('UTF-8', 'windows-1251',$_POST['n']); $name=iconv('UTF-8', 'windows-1251',$_POST['name']); $text=iconv('UTF-8', 'windows-1251',$_POST['text']); strip_tags($n); strip_tags($name); strip_tags($text, "
"
); if (empty($text)) exit; if (empty($name)==true) $name="Аноним"; $text=str_replace("\n",'
'
,$text); /*--------Работаем с базой данных----------- --------------------------------------------*/ if (!mysql_query("SELECT * FROM `".$n."`")){ $req='CREATE TABLE `'.$n.'` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;'; } mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'"); mysql_close($link) ?>

Эксперт HTML/CSSЭксперт PHP

CREATE TABLE IF NOT EXISTS `table_name` ( . 

Добавлено через 54 секунды
и mysql_query() не поддерживает нескольких запросов. и вы неверно составляете запрос. они должны быть по очереди, а не один в одном.

Добавлено через 1 минуту
кто вам сказал что ошибок нет?

mysql_query(. ) or die(mysql_error());

ЦитатаСообщение от NoBodyIsPerfect Посмотреть сообщение

if (!mysql_query("SELECT * FROM table_name")){ * * * * echo "Таблицы нет"; * * }

а если таблица 500 мегабайт? Не будет ли это излишним при каждом выполнении скрпита выбирать все данные из таблицы?)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 $link = mysql_connect('sql-4.radyx.ru', 'connections611','sdap3b6ii1') or die(mysql_error()); mysql_select_db('connections611') or die(mysql_error()); /*--------Готовим текст для записи----------- --------------------------------------------*/ $n=iconv('UTF-8', 'windows-1251',$_POST['n']); $name=iconv('UTF-8', 'windows-1251',$_POST['name']); $text=iconv('UTF-8', 'windows-1251',$_POST['text']); strip_tags($n); strip_tags($name); strip_tags($text, "
"
); if (empty($text)) exit; if (empty($name)==true) $name="Аноним"; $text=str_replace("\n",'
'
,$text); /*--------Работаем с базой данных----------- --------------------------------------------*/ $req="CREATE TABLE IF NOT EXISTS `".$n."` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;"; mysql_query($req); mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'"); mysql_close($link) ?>

ЦитатаСообщение от KOPOJI Посмотреть сообщение

ЦитатаСообщение от DrobyshevAlex Посмотреть сообщение

а если таблица 500 мегабайт? Не будет ли это излишним при каждом выполнении скрпита выбирать все данные из таблицы?)

Эксперт HTML/CSSЭксперт PHP

сейчас в принципе нигде.. если не считать пропущенной точки с запятой ну и кодировку, если немного данных еще — советую сменить на utf8_general_bin вместо вашей (скрипты тоже). Но это имхо, и вовсе не обязательно..

mysql_query($req) or die(mysql_error()." ".mysql_errno());

Эксперт HTML/CSSЭксперт PHP

mysql_query($req) or die(mysql_error());
$req="CREATE TABLE IF NOT EXISTS `".$n."` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL, PRIMARY KEY (`id`) ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;";

ЦитатаСообщение от KOPOJI Посмотреть сообщение

сейчас в принципе нигде.. если не считать пропущенной точки с запятой ну и кодировку, если немного данных еще — советую сменить на utf8_general_bin вместо вашей (скрипты тоже). Но это имхо, и вовсе не обязательно..

вообще это пишу как обучающий проект,поэтому особого значения это не имеет пока что)
да и возиться с кодировкой опять лениво)

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

вы про эту строчку?
она правильная( стащено с другого проекта,там все равботает)

Добавлено через 1 минуту
хм..нет,не создает

Эксперт HTML/CSSЭксперт PHP

да в том то и дело что все вроде правильно.. mysql_error() молчит?

Добавлено через 2 минуты

echo mysql_query($req) ? 'Succesfully' : 'Error: '.mysql_error();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 $link = mysql_connect('sql-4.radyx.ru', 'connections611','sdap3b6ii1') or die(mysql_error()); mysql_select_db('connections611') or die(mysql_error()); /*--------Готовим текст для записи----------- --------------------------------------------*/ $n=iconv('UTF-8', 'windows-1251',$_POST['n']); $name=iconv('UTF-8', 'windows-1251',$_POST['name']); $text=iconv('UTF-8', 'windows-1251',$_POST['text']); strip_tags($n); strip_tags($name); strip_tags($text, "
"
); if (empty($text)) exit; if (empty($name)==true) $name="Аноним"; $text=str_replace("\n",'
'
,$text); /*--------Работаем с базой данных----------- --------------------------------------------*/ $req="CREATE TABLE IF NOT EXISTS `".$n."` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL , PRIMARY KEY (`id`) ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;"; //mysql_query($req); echo mysql_query($req) ? 'Succesfully' : 'Error: '.mysql_error(); mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'"); mysql_close($link) ?>

ЦитатаСообщение от spydark91 Посмотреть сообщение

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

Источник

Php mysql проверить существование таблицы

Я просто х.ею с некоторых людей!
А если такая таблица существует и в ней 2Гб информации?

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

SHOW TABLES LIKE "tablename"

У меня задача ставилась таким образом:
1) Если нет базы (на самом деле, а не так, что к ней не удается подключиться), то создать ее.
2) Если нет в ней таблиц(ы) (опять же, нет и не было), то создать эту таблицу.
Действительно, чтобы случайно совсем уж ничего (вроде пары Г) не подпортить.

У меня получились две функции (для определения наличия базы и таблицы в заданной базе), которые вроде работают (естественно, если к MySQL уже подключились посредством mysql_connect). Вот они:

function MySQL_DB_Present($sdb) $db_list = mysql_list_dbs(); $finded = false;
while ($row = mysql_fetch_object($db_list)) // echo $row->Database . «\n»;
if (($row->Database) === $sdb)
>
mysql_free_result($db_list);
return $finded;
>
function MySQL_TableFrom_DB_Present($sTable, $wdb) $Table_list = mysql_list_tables($wdb); $finded = false;
if ($Table_list) < // если база '$wdb' имеется
for ($i = 0; $i < mysql_num_rows($Table_list); $i++) // echo mysql_tablename($Table_list, $i) . "\n";
if ((mysql_tablename($Table_list, $i)) === $sTable)
>
>
if ($Table_list) < mysql_free_result($Table_list); >
return $finded;
>

Если «раскомментировать» эхо, можно увидеть сами темы.
М.б., кому-то это еще надо?

Источник

Оцените статью