(var ise) php bir dize bazı metni bulmak

5 Cevap php

I have a MYSQL database of photo galleries; each row contains a field with the list of images included in that gallery, eg:

1,5,134,13,5

Bu fotoğrafların kimlikleri. Aynı image_id diğer galeriler dahil edilebilir.

When I delete a photo, I need to remove the corresponding id from the galleries that contain it. What's the best way to do this in PHP?

Ben bir diziye alanını EXPLODEing düşündüm, değeri kaldırın ve sonra geri çöktüğünü ve DB güncelleştirmek, ama daha iyi bir yolu vardır eminim?

thanks, Patrick

TEŞEKKÜRLER Galen & hepsi.

Ben bir acemi olduğumu ve normalleştirme hakkında çok (= hiçbir şey bilmiyorum). Ben doğru anlamak, 2 tablolar var düşündüren konum: 1 o fotoğrafı kullanan galerileri sadece bir liste ile, örneğin fotoğraf (örneğin, image_id, adı, başlık vb.) ve başka bir tablo hakkında tüm bilgileri ile :

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

so by deleting from this table WHERE image_id=3, i would remove that photo from two galleries. In this case, however, I would I manage the order of photos? Having a string allowed me to have an ordered list of photos.

5 Cevap

Bu kesin nedeni neden normalize sizin masaları. Sonra sadece sorguyu çalıştırabilir

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

Görüntüleri tablo tüm görüntü bilgileri içeren nerede. ImageXgallery tablo sadece galeri referanslara görüntüsü içerir.

Ben normalleştirme üzerinde okumak ve tabloları güncellemek öneririz.

EDIT: imageXgallery tabloda bir order alanını eklemek görüntü sipariş için izin vermek için. Eğer tablodan görüntüleri almak zaman bu sütuna göre sipariş edebilirsiniz.

Biraz daha hızlı ve daha şık çözümler olsa da, patlayan kesme ve tekrar bir araya yapıştırma bence gayet kabul edilebilir bir yoldur.

Edit: Tabii ki, Galen hakkıdır. Eğer şansınız varsa, yapısını değiştirmek.

Galen dediği gibi, normalleştirmek gerek. Bunun yerine böyle bir başlığın (satır) ("gallery_id", "photo_id_1, photo_id_2, ...") Her birine sahip birden dizilerini olacak gallery_id ve photo_id. Sonra bu tablodan photo_id silerek sorunu ilgilenir.

Eğer tablo yapısını değiştirmek istemiyorsanız, tekrar tekrar bir diziye dizeleri dönüştürmek ve daha dize işlemleri yapmak için muhtemelen daha az pahalı. Bunun için str_replace () veya preg_replace () kullanarak içine bak.

Eğer veritabanı düzenini değiştirebilir, ben aşağıdaki yapardın:

As each gallery can have multiple images and as each image can be in multiple gallery, you have a many-to-many relationship. So you have 3 tables, the first one to hold the gallery, with a galleryId primary key and additional fields for gallery info (if galleries have names, for instance, a name field), then you have an image table, with an imageId and all the image information, and then you have third table with just two fields, galleryId and imageId.

Görüntü 5 galeriye 7 gitmek zorunda Yani, ilişki tabloya 7 ve 5 girmek istiyorum.

galeri 7 için tüm görüntüleri almak için, gibi bir şey koşmak istiyorum

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

galleryImages ilişki tablo olmak.

Likewhise, to delete an image from a gallery, just delete the row in the relationship table. One thing you might want to pay attention to is to check if there are still entries for an image in the relationship table when you remove it from a gallery. or in other words, check if the images is being used in any galleries, if not, remove the entry from the images table as well, otherwhise you might end up with a lot of garbage image entries that aren't even needed anymore.

Bu bazı şeyleri temizlemek için yardımcı olur umarım.