С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 30

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

08.02.2019, 12:47. Показов 1874. Ответов 10

Студворк — интернет-сервис помощи студентам
Ситуация такая, на странице с товаром реализована отправка комментариев через ajax на контроллер коммента, а на контроллере товара происходит выборка из таблицы для показа комментов которая идет в рэндер. Если таблицы с указанным названием еще не существует, то есть комменты еще не добавлялись - выдает ошибку - таблицы нет. Запросы через PDO. Как обойти ошибку условием, чтобы если таблицы нет, записать другой рэндер без комментов, так как ошибка выходит еще на стадии prepare или query, не давая сформировать массив?
PHP
1
2
3
4
5
6
$table = 'comment_' . $product->id;
 
$sql_com = Db::$connect->query("SELECT * FROM $table ORDER BY id DESC LIMIT 10");
$comments = $sql_com->fetchAll();
 
$this->set(compact('product', 'related', 'gallery', 'recently', 'breadcrumbs', 'mods', 'comments')); // рэндер для view
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.02.2019, 12:47
Ответы с готовыми решениями:

Проверка на существование файла
Такая задачка: при выгрузке файлов с сервера на сайт, нужно написать условие: если такой файл существует на сервере, а его на сайте нет, то...

Проверка на существование переменной
Как лучше проверять существует ли переменная или не пустая ли она? Вот так if(isset($a) && !empty($a)) { } или...

Проверка страницы на существование
Добрый вечер! Понадобилось проверить список ссылок на существование. Есть txt файл со списком url. Нужно проверить каждый из них на...

10
31 / 46 / 19
Регистрация: 18.07.2018
Сообщений: 578
08.02.2019, 14:26
Один из вариантов - проверить на массив

А что у Вас limit 10 в compact() улетает?
0
 Аватар для useruser
166 / 90 / 38
Регистрация: 29.06.2015
Сообщений: 1,100
08.02.2019, 14:31
Предположу, что как то так (с PDO почти не работал)
PHP
1
2
$sql_com = Db::$connect->query("SELECT * FROM $table ORDER BY id DESC LIMIT 10");
if ($sql_com!=1) echo 'Что то тут не так!';
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 30
08.02.2019, 14:36  [ТС]
Если таблица еще не существует, то
PHP
1
$sql_com = Db::$connect->query("SELECT * FROM $table ORDER BY id DESC LIMIT 10");
уже выбрасывает ошибку, так что до проверки не дойти
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
08.02.2019, 17:58
Выполняете запрос
SQL
1
SHOW TABLES
И смотрите, есть ли в полученном списке искомая таблица.

Цитата Сообщение от vikwostbur Посмотреть сообщение
Если таблицы с указанным названием еще не существует, то есть комменты еще не добавлялись - выдает ошибку - таблицы нет.
У вас что, для каждого товара создается отдельная таблица для комментариев? о_О ОМГ! Срочно это исправьте! Это в корне не верный подход.
1
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 30
08.02.2019, 18:18  [ТС]
Создать единую таблицу для всех комментов? И SHOW TABLES это разьве не чисто Mysql фишка?
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
08.02.2019, 18:29
Цитата Сообщение от vikwostbur Посмотреть сообщение
Создать единую таблицу для всех комментов?
Ну да. Добавляя комментарий, записываете к нему еще и идентификатор товара. В терминологии БД это называется внешний ключ.

Цитата Сообщение от vikwostbur Посмотреть сообщение
SHOW TABLES это разьве не чисто Mysql фишка?
Что значит чисто Mysql фишка? Обыкновенный запрос.

Добавлено через 5 минут
Более того, используя внешние ключи можно защитить базу данных от нарушения целостности.
Вот например вы удалили товар, что делать с комментариями? Зачем они нужны на несуществующий товар? Их можно тоже удалить. А можно запретить удаление товара, если на него есть ссылки (комментарии). И все это делается на уровне движка БД один раз при создании таблицы и без единой строчки php.

Добавлено через 1 минуту
В множестве однотипных таблиц нет никакого смысла. Сложная выборка затруднена, на лицо избыточнось.

Добавлено через 49 секунд
Ну и ваш камень: нужно проверять наличие таблицы
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 30
08.02.2019, 18:57  [ТС]
Про внешние ключи знаю, так товары у меня связаны с фильтрами, модами и т.д, В случае с комментами просто пока не добрался до этого, реализовывал ajax и вот немного на этом стопорнулся, НО благодарю, хорошая идея, в общем вышел вот так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$show = Db::$connect->query("SHOW TABLES");
$show_t = $show->fetchAll();
$tables = [];
foreach ($show_t as $k => $v) {
    foreach ($v as $key => $value) {
        $tables[$k] = $value;
    }
}
 
$search = array_search($table, $tables);
if ($search) {
    $sql_com = Db::$connect->query("SELECT * FROM $table ORDER BY id DESC LIMIT 10");// по 10 на стр
    $comments = $sql_com->fetchAll();
    $comments = array_reverse($comments);   // в обратном порядке
    $this->set(compact('product', 'related', 'gallery', 'recentlyViewed', 'breadcrumbs', 'mods', 'comments'));
} else {
    $this->set(compact('product', 'related', 'gallery', 'recentlyViewed', 'breadcrumbs', 'mods'));
}
Есть идея минифицировать, или упростить код?
На счет отдельной таблицы комментов для каждого товара это условие, по-другому не могу.

Добавлено через 15 секунд
Про внешние ключи знаю, так товары у меня связаны с фильтрами, модами и т.д, В случае с комментами просто пока не добрался до этого, реализовывал ajax и вот немного на этом стопорнулся, НО благодарю, хорошая идея, в общем вышел вот так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$show = Db::$connect->query("SHOW TABLES");
$show_t = $show->fetchAll();
$tables = [];
foreach ($show_t as $k => $v) {
    foreach ($v as $key => $value) {
        $tables[$k] = $value;
    }
}
 
$search = array_search($table, $tables);
if ($search) {
    $sql_com = Db::$connect->query("SELECT * FROM $table ORDER BY id DESC LIMIT 10");// по 10 на стр
    $comments = $sql_com->fetchAll();
    $comments = array_reverse($comments);   // в обратном порядке
    $this->set(compact('product', 'related', 'gallery', 'recentlyViewed', 'breadcrumbs', 'mods', 'comments'));
} else {
    $this->set(compact('product', 'related', 'gallery', 'recentlyViewed', 'breadcrumbs', 'mods'));
}
Есть идея минифицировать, или упростить код?
На счет отдельной таблицы комментов для каждого товара это условие, по-другому не могу.
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
11.02.2019, 13:19
Лучший ответ Сообщение было отмечено vikwostbur как решение

Решение

Цитата Сообщение от vikwostbur Посмотреть сообщение
На счет отдельной таблицы комментов для каждого товара это условие, по-другому не могу
Уволил бы с позором того, кто выставил такое условие.

Добавлено через 9 минут
Цитата Сообщение от vikwostbur Посмотреть сообщение
Есть идея минифицировать, или упростить код?
Вместо вот этого:
PHP
1
2
3
4
5
6
7
$show_t = $show->fetchAll();
$tables = [];
foreach ($show_t as $k => $v) {
    foreach ($v as $key => $value) {
        $tables[$k] = $value;
    }
}
Использовать это:
PHP
1
$show_t = $show->fetchAll(PDO::FETCH_COLUMN, 0);
И необходимость в foreach отпадет.
PHP
1
2
3
4
5
if (in_array($table, $show_t)) {
    //...
} else {
    //...
}
1
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 30
12.02.2019, 16:02  [ТС]
Благодарю за помощь. Есть еще 1 вопрос не связанный с этим ресурсом. Есть 2 таблицы - jenre (жанр) и movies (фильмы). В 'jenre' 2 поля: id и title, в 'movies' 3 поля: 'id', m_title, 'm_jenre'. Нужно сделать связь между ними. Не критично ли будет с точки зрения нормализации, если поле 'm_jenre' будет ссылаться не на 'jenre.id', а на 'jenre.title', чтобы в 'movies.m_jenre' приходило название жанра, а не числовое значение? конечно же с соблюдением всех ключей - index, unique
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
12.02.2019, 16:04
vikwostbur, если jenre.title есть primary key, то есть ключевое уникальное поле, то вполне себе может.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2019, 16:04
Помогаю со студенческими работами здесь

Проверка функции на существование
Пытаюсь поставить условие проверки функции на существование <?php if(function_exists(pll_current_language() ==...

Проверка на существование линка
Как можно это осуществить....???? что-бы список линков проверило!

Проверка на существование директории на сервере
привет, как то можно сделать так if(is_dir("http://mysite.ru/dir/")) { echo "да"; }else{ echo "нет"; } ...

Проверка на существование/замена строки
<? $file_list=glob("*.txt"); for ($i=0; $i<count($file_list);$i++){ if ($file_list==$filename){ $str1="is found!"; } if...

Проверка на существование нескольких переменных
<?php error_reporting(-1); header('Content-Type: text/html; charset=utf-8'); if (isset($_POST) && ($_POST)){ echo 'numbers are...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru