用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8198|回复: 13
收起左侧

[版本 2.x] 发文章,上传多个附件后,额外存储附件数据到附件表原理

[复制链接]
发表于 2012-1-10 09:46:34 | 显示全部楼层 |阅读模式
本帖最后由 ^淡如清风 于 2012-1-10 10:13 编辑

使用编辑器,例如kindeditor上传多个附件后,会返回附件路径到编辑器中,这里是属于文章的数据
我要额外保存附件数据到数据表的原理是怎样的呢?
A:上传一个附件,入库一次,然后再保存文章数据的时候,更新附件表和文章表的关联字段
问题:如果上传附件后,没有保存文章数据,这个时候附件数据已经入库了,如何判断没有保存,然后删除符合见表的数据呢?

B:如下的做法
我的想法:
0.打开发布页面后首先清除$_SESSION['file'](上次上传未保存的数据)
1.上传一张图片后,$_SESSION['file'][] = $file_data;
2.继续上传图片,继续$_SESSION['file'][] = $file_data;
3.提交的时候,把$_SESSION['file']数组里面的内容插入数据库
4.插入数据库成功后,删除$_SESSION['file']
另:如果上传图片后不提交数据而离开页面的时候,则在下一次访问发布页面后清除$_SESSION['file']


问题:原生session貌似在Ci上有时候会发生奇怪的问题,如果使用CI的session,只能保存多组变量,不能保存数组的情况下又如何操作呢?
请教大家是如何处理的呢?

评分

参与人数 1威望 +5 收起 理由
lamtin + 5 赞一个!

查看全部评分

 楼主| 发表于 2012-1-10 10:58:48 | 显示全部楼层
本帖最后由 ^淡如清风 于 2012-1-13 11:11 编辑

解答:
经过在官方1号群的讨论,和@Lamtin的思路启发,再查看了pw的处理方法
总结如下:
A.文章表
B.附件表
1.上传一个附件入库一次,附件表arc_id = 0 (和文章表关联字段)
2.提交文章的时候获取文章id,然后更新附件表的arc_id为文章的id

如果最终没有提交数据(比如离开页面、死机等),那么之前入库附件表数据如何删除呢?
下次提交数据的时候检查删除,做法如下
1.下次发布文章的时候,继续上传附件,继续入库(相当于上面的正常操作)
2.然后提交数据的时候(如果再次离开页面,或死机呢,那么就再再下次,总有一次会提交的吧),检索附件表字段arc_id=0的附件,然后数据表删除之,进一步的话,可以再做删除真实存在的文件夹中的附件

补充:
隔了几天,又仔细想了一下,发现了个问题
就是如何更新这次上传的附件arc_id,而不更新上次上传的附件呢,但是他们的arc_id都是等于0,如何判断呢?
想了一会,觉得应该需要另外一个字段来判断,但是如何判断呢?会不会增加冗余字段呢?
最后把问题抛于@Lamtin,得到的解决办法:
进入文件编辑页的时候
$file_upload_time = time();
并把这个值保存在cookie或者session
大于这个时间的就是这次上传的
这里还有一个问题就是:
1.一个帐号可以多人登录(解决办法:暂时还在思考中)
而时间小于这个$file_upload_time并且arc_id=0的记录则是上次上传的附件,然后处理掉(删除)
最后提交的时候清空这个时间

注:
这次上传:重新点击发布文章
上次上传:以前点击发布文章的时候,最后没有提交数据
 楼主| 发表于 2012-1-10 11:05:52 | 显示全部楼层
Lamtin  10:54:44
其实大站不处理的
Lamtin  10:55:04
大站会依据文件的访问次数来衡量是否删除

继续引用下Lamtin的话
发表于 2012-1-11 17:30:58 | 显示全部楼层
讨论过后还会总结发帖子,楼主的这个行为值得赞赏。
发表于 2012-1-12 10:29:09 | 显示全部楼层
^淡如清风 发表于 2012-1-10 10:58
解答:
经过在官方1号群的讨论,和@Lamtin的思路启发,再查看了pw的处理方法
总结如下:

你在附件表增加一个UID之类的字段不就可以了吗?如果存cookie我清空了呢?
发表于 2012-1-12 11:33:39 | 显示全部楼层
照理说,只有在提交表单,文章入库成功之后才插入附件到附件表的吧。
 楼主| 发表于 2012-1-12 17:50:44 | 显示全部楼层
longjianghu 发表于 2012-1-12 10:29
你在附件表增加一个UID之类的字段不就可以了吗?如果存cookie我清空了呢? ...

Uid本身是有,加了UID,这次上传的UId和上次上传的UID还是一样,无法判断是这次上传还是上次上传的

在补充那里加了解决办法
 楼主| 发表于 2012-1-12 17:52:00 | 显示全部楼层
thenbsp 发表于 2012-1-12 11:33
照理说,只有在提交表单,文章入库成功之后才插入附件到附件表的吧。

这是一般的想法...我当时也是这样想的,把每条数据存SESSION数据,然后提交的时候取出SESSION数据中的数据。
不知道还有没有其他的更好的方法
发表于 2012-1-13 11:41:05 | 显示全部楼层
能解决问题就行,你要用多高深的方法?存session里?如果我退出了呢?
发表于 2012-1-13 20:56:01 | 显示全部楼层
http://codeigniter.org.cn/forums/thread-11194-1-1.html
或者ajax传attachId到前台,与input表单数据一并提交处理。
多余附件可定期比对table->attach删除,或前面兄弟讲的按访问量删除。

本版积分规则