我有一个照片库的MYSQL数据库; 每行包含一个字段,其中包含该库中包含的图像列表,例如:
1,5,134,13,5
这些是照片的ID。相同的image_id可以包含在其他画廊中。
当我删除照片时,我需要从包含它的图库中删除相应的ID。 在PHP中执行此操作的最佳方法是什么?
我想将EXPLODEing字段放入一个数组中,删除该值然后IMPLODE返回并更新数据库,但我很确定有更好的方法吗?
感谢, 帕特里克
感谢Galen&所有
我是一个新手,并且对标准化不太了解(=任何事情)。如果我理解正确,你建议有2个表:1表示有关照片的所有信息(例如,image_id,名称,标题等),另一张表只有一张使用该照片的画廊列表,例如:
gallery_id | image_id
1 3
1 7
1 5
2 3
2 8
因此,从此表中删除WHERE image_id = 3,我会从两个画廊中删除该照片。 但是,在这种情况下,我会管理照片的顺序吗?有一个字符串允许我有一个有序的照片列表。
答案 0 :(得分:10)
这就是你normalize表格的确切原因。然后你可以运行查询
delete from images where image_id=5;
delete from imageXgallery where image_id=5;
图像表包含所有图像信息。 imageXgallery表只包含图片到图库的引用。
我建议您阅读规范化并更新表格。
编辑:要允许图像排序,请在imageXgallery表中添加order
字段。从表中检索图像时,您可以按该列进行排序。
答案 1 :(得分:2)
虽然可能会有更快更优雅的解决方案,但在我看来,爆炸,切割和粘合在一起是一种完全可以接受的方式。
编辑:当然,盖伦是对的。如果有机会,请更改结构。
答案 2 :(得分:1)
正如盖伦所说,你需要规范化。而不是像("gallery_id", "photo_id_1, photo_id_2, ...")
这样的元组(行),您将拥有多个元组,每个元组都有一个gallery_id
和photo_id
。然后,从该表中删除photo_id
将解决您的问题。
答案 3 :(得分:0)
如果您不想更改表结构,那么执行字符串操作可能比将字符串转换为数组并再次返回更便宜。请考虑使用str_replace()或preg_replace()。
答案 4 :(得分:0)
如果您可以更改数据库布局,我会执行以下操作:
由于每个图库可以有多个图像,并且每个图像可以在多个图库中,因此您具有多对多关系。 所以你有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是关系表。
请注意,要删除图库中的图像,只需删除关系表中的行即可。 您可能需要注意的一件事是,当您从图库中删除图像时,检查关系表中是否仍有图像条目。换句话说,检查图像是否在任何图库中使用,如果没有,也从图像表中删除条目,否则你可能会得到很多甚至不再需要的垃圾图像条目。< / p>
希望这有助于澄清一些事情。