作者joedenkidd (优质的蓝色射手)
看板PHP
标题[请益] 资料重复写入问题?
时间Fri Nov 21 10:57:25 2014
Hi All:
$up_sql="update db set value=1 where id='123' and sn='2345'";
$up_exec=pg_exec($server_link,$up_sql);
$up_result=pg_affected_rows($up_exec);
if($up_result==0)
{
$ins_sql="insert into db(id,sn) values('234','aaa')";
$ins_exec=pg_exec($server_link,$ins_sql);
}
以上是我资料更新或新增的程式,正常来说,当 db里面有 id='123',sn='2345'的时候
pg_affected_rows的值并不会等於0
所以我用这种方式来判断资料是要更新或是新增,
可是观察了一阵子,发现还是有部分的资料,会
被重复写入,不知道这样子是出了什麽问题,请
各位指点一下,拜托...
程式:PHP
DB : POSTGRESQL
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.169.170.134
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/PHP/M.1416538648.A.274.html
1F:推 alog: db资料是有更新才affected 不是你下完指令执行成功就算 11/21 11:10
2F:→ alog: 如果你要避免部分资料进入资料库 要做好检查 11/21 11:11
3F:→ alog: 适时配合lock相关指令做搭配 以及你要利用unique key避免重 11/21 11:12
4F:→ alog: 复写入 11/21 11:12
5F:→ joedenkidd: 应该是说问题会发生在下一次相同资料写入的时候 11/21 12:34
6F:推 alog: 简单作法 挑几个你认为不该重复的栏位资料 11/21 12:46
7F:→ alog: 例如 name cellphone sexual 11/21 12:47
8F:→ alog: 然後你新增一个名为digest的资料栏位 长度用32 char 11/21 12:49
9F:→ alog: 并设定他为 unique key 11/21 12:49
10F:→ alog: 接着你新增资料的时候 记得产生一组字串 11/21 12:51
11F:推 alog: $digest = md5(json_encode(array($name,$cellphone,$sexual 11/21 12:52
12F:→ alog: ))); 11/21 12:52
13F:→ alog: 把这整组资料放进资料库里 11/21 12:53
14F:推 alog: 有重复的 资料库会自己挡下来 11/21 12:54
15F:推 LaPass: unique key 我记得可以同时设在两个键上 11/21 13:06
16F:→ LaPass: 把两个栏位当成一组,去判断两者都一样才当一样,这样 11/21 13:07
17F:→ joedenkidd: alog大大说的,是一个好方式,db已有资料,以後可用~ 11/21 19:39
18F:→ joedenkidd: LaPass大大,unique key分别设定两个栏位ok,但资料库 11/21 19:40
19F:→ joedenkidd: 中,id会重复,sn也会,所以只有那个条件在一起来能 11/21 19:40
20F:→ joedenkidd: 得到唯的一值,怪的只是不知道为什会发生这种问题 11/21 19:45
21F:推 xdraculax: 一楼就说啦,那个只数有更新,本来就=1就不算了 11/22 00:57
22F:→ xdraculax: mysql可以用replace into pg 不熟 11/22 01:10
23F:推 LaPass: 我的意思是,设定 id+sn unique这样,「两个一组」 11/22 01:29