Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 2
Регистрация: 17.09.2015
Сообщений: 53
1

Добавление нескольких городов!

20.09.2016, 16:37. Показов 863. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Есть такая задача, сайт сделан для нескольких городов (точнее из 27 на данный момент и планируют расширяться), при добавлении новости нужно выбрать несколько городов где она будет отображаться.

Подскажите как реализовать лучше занесение списка городов в таблицу новости, как правильно вывести информацию и как упростить эту систему при добавлении нового города

Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2016, 16:37
Ответы с готовыми решениями:

Добавление нескольких Городов Одновременно
Доброе время суток! Такой вопросик, я долго рылся в поисковиках и ничего хорошего не нашел. В...

Добавление нескольких строк из нескольких input text ов в БД
Здравствуйте! Проблема в том, что у меня не добавляются строки в БД, они добавляются пустыми...

Добавление пустых строк вверх и вниз и добавление нескольких цифр в ячейки
День добрый. Надо добавить одну пустую строку вверх и одну в низ, так же добавить пару цифр и...

Существует N городов для каждой пары городов (і, j) можно построить путь
Существует N городов для каждой пары городов (і, j) можно построить путь который соединит их, но не...

20
2169 / 1652 / 840
Регистрация: 10.01.2015
Сообщений: 5,190
20.09.2016, 17:22 2
Можно через select multiple, можно через checkbox и передавать массивом.
Заносить можно, отделяя названия каким-либо символом. implode(',', $city);
Выводить из базы можно через explode(',', $city);
1
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
20.09.2016, 17:48 3
Если следовать нормализации, то нужно сделать отношение многие-ко-многим. То есть делаем промежуточную таблицу с полями:
city_id, news_id
И через неё связываем те две таблицы (города/новости).
1
22 / 22 / 5
Регистрация: 05.06.2015
Сообщений: 188
21.09.2016, 15:42 4
Вот кстати прозвучало два подходящих ответа на вопрос ТС. НО!
На работе мы используем систему предложенную Пифагор.
А в проектах, во времена учебы, мы использовали метод предложенный Para bellum.

И теперь мне интересно. А правильно то как?
0
451 / 417 / 115
Регистрация: 15.02.2012
Сообщений: 1,847
21.09.2016, 16:03 5
конечно лучше иметь отдельную линковочную таблицу чем отдельное свойство с перечислением там в виде строки или например сериализованного массива: в этом случае для обновления вам не понадобится получить сначала значение, затем его разобрать, изменить и опять сохранить
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
21.09.2016, 17:04 6
dezforse, где-то читал, что в Twitter используется вариант Пифагора. Для сбережения ресурсов, ибо посещаемость большая.
Но удобнее использовать связку через промежуточную таблицу. FOREIGN KEY с ON DELETE CASCADE дают огромное удобство. А если хранить перечисление -- то нужно отслеживать все зависимости дочерних таблицах.

Если посещаемость не миллионная -- то лучше через промежуточную.
1
22 / 22 / 5
Регистрация: 05.06.2015
Сообщений: 188
22.09.2016, 10:44 7
Para bellum, Спасибо за советы, буду использовать предложенные вами методы!
0
2 / 2 / 2
Регистрация: 17.09.2015
Сообщений: 53
24.09.2016, 20:40  [ТС] 8
Добрый вечер!
Организовал запись в базу следующим образом:

PHP
1
<input type='checkbox' id='$ids' value='$ids' name='city[]'>
Заносим в базу:

PHP
1
$cityall=implode(',', $city);
поле в таблице с новостью "text" идет запись всех выбранных checkbox через запятую

Теперь вот не могу разобраться как вывести новость, как сделать проверку на город? если выбран город с ид2, выводим новость, если нет ид2 не выводим.

Заранее спасибо
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
24.09.2016, 22:41 9
Цитата Сообщение от ntym Посмотреть сообщение
Теперь вот не могу разобраться как вывести новость, как сделать проверку на город? если выбран город с ид2, выводим новость, если нет ид2 не выводим.
как как, массив с ID разрешённых городов и чекать в нём
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
24.09.2016, 23:06 10
Цитата Сообщение от ntym Посмотреть сообщение
Теперь вот не могу разобраться как вывести новость, как сделать проверку на город? если выбран город с ид2, выводим новость, если нет ид2 не выводим.
Посмотрите список функций работы со строками. Подойдет например strpos, возвращающая позицию подстроки в строке. Если позиция не равна -1, значит id города в строке есть.

Добавлено через 6 минут
Сорри, если речь идет об отборе из базы, то смотреть нужно функции mySQL, в данном случае INSTR и проверять условие в запросе. С ростом числа новостей будет увеличиваться время выборки при таком способе хранения.
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
25.09.2016, 06:42 11
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
С ростом числа новостей будет увеличиваться время выборки при таком способе хранения.
И плюс ещё -- что будет, если попробовать найти в данном перечислении город с ID "7":
17,9,3,87 и т.д.
Хотя ID "7" нет -- запись выберется.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
25.09.2016, 07:41 12
Para bellum, Ну тут можно записывать строку в виде ,17,9,3,87, и искать в виде ,id,
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
25.09.2016, 07:55 13
Да, можно. Но не очень удачное решение, на мой взгляд.

Блин, совсем забыл. Есть же FIND_IN_SET для поиска по перечислениям.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
25.09.2016, 08:07 14
Цитата Сообщение от Para bellum Посмотреть сообщение
Да, можно. Но не очень удачное решение, на мой взгляд.
Если это будет отрабатываться в пределах секунды и не предполагается в будущем большого количества новостей, то решение как решение, ничего страшного. Нужно просто провести тесты с какого количества новостей начнет заметно тормозить и прикинуть планируется ли на сайте такое количество новостей в обозримые 20 лет.

Цитата Сообщение от Para bellum Посмотреть сообщение
Есть же FIND_IN_SET для поиска по перечислениям.
Если FIND_IN_SET работает с любым строковым полем, то можно и его использовать, хотя непонятно в чем выгода.Если же вы имеете ввиду что список городов будет храниться в сете перечислений, то это те же запятые, вид сбоку, да еще с неудобствами. ограничение на кол-во возможных значений в 64 варианта, необходимость пополнять набор при вводе нового города. Не вижу в данном конкретном случае преимуществ
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
25.09.2016, 08:19 15
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
Если FIND_IN_SET работает с любым строковым полем
Да, с любым.
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
необходимость пополнять набор при вводе нового города.
С ENUM путаете, кажется.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
25.09.2016, 09:24 16
Цитата Сообщение от Para bellum Посмотреть сообщение
С ENUM путаете, кажется.
Тип SET это тот же ENUM, Просто с возможностью выбирать несколько значений. И в том и в другом случае никаких строк в поле не хранится. В поле хранится число. В случае с ENUM это будет порядковый номер значения набора, в случае с SET это будет сумма номеров, составленная по принципу 2^значение1 + 2^значение2 ... + 2^значение№, то есть если пользователь выбрал 1е 2е и 4е значения набора, в базе будет храниться число 1 + 2 + 8, то есть 11. Отсюда ограничение на количество значений в наборе, чтобы уложиться в длину числа 2 в степени 64, кажется это Int. Есть ли ограничения для ENUM честно говоря не знаю. По логике быть не должно.
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
25.09.2016, 09:34 17
Всё верно. Я обмишулился.
0
2 / 2 / 2
Регистрация: 17.09.2015
Сообщений: 53
13.10.2016, 18:44  [ТС] 18
Добрый день!
Подскажите еще момент такой момент
В базу заносит в текстовое поле ид городов через запятую, как мне вывести отмеченные города в виде
PHP
1
type='checkbox'
Миниатюры
Добавление нескольких городов!  
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
13.10.2016, 18:49 19
PHP
1
$output[] = "<input type=checkbox name='city'".($row{'set'} === '1' ? " checked" : '').">"
0
2 / 2 / 2
Регистрация: 17.09.2015
Сообщений: 53
13.10.2016, 19:01  [ТС] 20
Подскажите как правильно реализовать?
0
13.10.2016, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2016, 19:01
Помогаю со студенческими работами здесь

Известны расстояния от Москвы до нескольких городов. Найти расстояние от Москвы до самого удаленного от нее города из пр
Известны расстояния от Москвы до нескольких городов. Найти расстояние от Москвы до самого...

Задан список городов. Поменять местами названия любых двух городов, заканчивающихся буквой "а".
Добрый вечер, дорогие форумчане! Помогите в трудном деле... Задание № 1 «Обработка символьных...

добавление нескольких селектов
Всем привет. Решение задачки вроде простое и не сильно сложное, но вот уже полдня мучаюсь и никак...

Добавление нескольких файлов в БД
Мне надо вывести в бд сразу несколько файлов в форме. сказали что надо преобразовать массив в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru