PHP найти текст в строке (если он есть) - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть база данных фотогалерей на MYSQL; каждая строка содержит поле со списком изображений, включенных в эту галерею, например:

1,5,134,13,5

это идентификаторы фотографий. Тот же image_id может быть включен в другие галереи.

Когда я удаляю фотографию, мне нужно удалить соответствующий идентификатор из галерей, которые ее содержат. Какой лучший способ сделать это в PHP?

Я думал о том, чтобы ВЗРЫВАТЬ поле в массив, удалить значение, а затем ИМПЛОДИТЬ назад и обновить БД, но я уверен, что есть лучший способ?

спасибо, Patrick

СПАСИБО Галену и всем.

Я новичок и не знаю много (= ничего) о нормализации. если я правильно понимаю, вы предлагаете иметь 2 таблицы: 1 со всей информацией о фотографии (например, image_id, name, caption и т. д.) и другую таблицу со списком галерей, которые используют эту фотографию, например :

gallery_id | image_id 
     1          3  
     1          7  
     1          5  
     2          3  
     2          8  

поэтому, удалив из этой таблицы ГДЕ image_id = 3, я бы удалил эту фотографию из двух галерей. В этом случае, однако, я бы управлял порядком фотографий? Наличие строки позволило мне иметь упорядоченный список фотографий.

Ответы [ 5 ]

10 голосов
/ 18 ноября 2009

Это точная причина, по которой вы нормализуете свои таблицы. Тогда вы можете просто выполнить запрос

delete from images where image_id=5;
delete from imageXgallery where image_id=5;

Где таблица изображений содержит всю информацию об изображении. Таблица imageXgallery просто содержит изображение для ссылок на галерею.

Я предлагаю вам ознакомиться с нормализацией и обновить таблицы.

РЕДАКТИРОВАТЬ: Чтобы разрешить упорядочение изображений, добавьте поле order в таблицу imageXgallery. Когда вы получаете свои изображения из таблицы, вы можете упорядочить по этому столбцу.

2 голосов
/ 18 ноября 2009

Хотя могут быть и более быстрые и более изящные решения, на мой взгляд, вполне приемлемый способ взрыва, обрезки и склейки снова.

Редактировать: Конечно, Гален прав. Если у вас есть шанс, измените структуру.

1 голос
/ 18 ноября 2009

Как сказал Гален, вам нужно нормализоваться. Вместо кортежа (строки), такого как ("gallery_id", "photo_id_1, photo_id_2, ..."), у вас будет несколько кортежей, каждый из которых имеет по одному gallery_id и photo_id. Затем, удалив photo_id из этой таблицы, вы позаботитесь о вашей проблеме.

0 голосов
/ 18 ноября 2009

Если вы можете изменить структуру базы данных, я бы сделал следующее:

Поскольку каждая галерея может иметь несколько изображений и каждое изображение может находиться в нескольких галереях, у вас есть отношение многие ко многим. Таким образом, у вас есть 3 таблицы, первая из которых содержит галерею, с первичным ключом galleryId и дополнительными полями для информации о галерее (если у галерей есть имена, например, поле имени), тогда у вас есть таблица изображений с imageId и вся информация об изображении, а затем у вас есть третья таблица с двумя полями: galleryId и imageId.

Так что, если изображение 5 должно перейти в галерею 7, вы должны ввести 7 и 5 в таблицу отношений.

чтобы получить все изображения для галереи 7, вы должны запустить что-то вроде

SELECT * FROM images i LEFT JOIN galleryImages gi ON gi.imageId = i.imageId WHERE gi.galleryId=7

, где galleryImages - таблица отношений.

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

надеюсь, это поможет кое-что прояснить.

0 голосов
/ 18 ноября 2009

Если вы не хотите изменять структуру таблицы, вероятно, дешевле выполнять строковые операции, чем преобразовывать строки в массив и обратно. Используйте для этого либо str_replace (), либо preg_replace ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...