php在字符串中找到一些文本(如果它在那里)

时间:2009-11-18 17:48:45

标签: php mysql string

我有一个照片库的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,我会从两个画廊中删除该照片。 但是,在这种情况下,我会管理照片的顺序吗?有一个字符串允许我有一个有序的照片列表。

5 个答案:

答案 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_idphoto_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>

希望这有助于澄清一些事情。