+ -
当前位置:首页 → 问答吧 → 简单代码的mysql写记录的问题

简单代码的mysql写记录的问题

时间:2008-07-10

来源:互联网

复制PHP内容到剪贴板
PHP代码:
if($name)
{
$sql5="select id from count where name = '".$name."' and date = '".$nowdate."'";
$query5 = mysql_query($sql5);
$rs5 = mysql_fetch_array($query5);
if(isset($rs5) && $rs5!="")
{
  $sql6="UPDATE count SET 
  count = count+1
  WHERE id = ".$rs5[0]."";
  $result6=mysql_query($sql6);
}else
{
  $sql6="insert into count (name,count,date) values ('".$name."', count+1,'".$nowdate."')";
  $ruselt7=mysql_query($sql6);
}
}

上面这段代码应该没有任何问题,但是在表里面出现这样奇怪的现象,
每天总会有这样的两行重复的记录:

id   name     count         date          number
55    mp3       111   2008-07-09     162
54    mp3       1       2008-07-09     162


原理上来说name 和date 应该是不会重复的,但是总会多出一条记录,而且count都是1 ,.本人对MYSQL的机制不是很了解,望高人解答。

[ 本帖最后由 zhengdl126 于 2008-7-10 11:50 编辑 ]

作者: zhengdl126   发布时间: 2008-07-09

是的,程序没有总是。

你的另外一个程序段中应该也有一句insert这样的代码。

作者: coolstr   发布时间: 2008-07-09

复制PHP内容到剪贴板
PHP代码:
$sql8="select id from day_count where name = '".$name."' and date = '".$nowdate."' and username = '".$user_name."' ";
 $query8 = mysql_query($sql8);
 $rs8 = mysql_fetch_array($query8);
 if(!$rs8)
 {
  $sql9="insert into day_count (name,username,date) values ('".$name."', '".$user_name."','".$nowdate."')";
  $ruselt9=mysql_query($sql9);
  
  $sql10="UPDATE count SET number = number+1 where name = '".$name."' and date = '".$nowdate."' ";
  $result10=mysql_query($sql10);
  
 }

这里还有一段操作表count的代码,但是之是操作number字段的,
我检查了一下,之有这两处操作count表了,没有其他地方,问题好像还是出现在第一处代码那里。

作者: zhengdl126   发布时间: 2008-07-10

这种情况用INSERT INTO ***  ON DUPLICATE KEY UPDATE number=number+1 这种语法,一条查询就够了
表示插入这条数据,但是当要插入的数据的KEY已经存在的话,执行UPDATE后面的更新操作

作者: leric   发布时间: 2008-07-10

问题依旧,望有人帮忙看看 。

作者: zhengdl126   发布时间: 2008-07-11

引用:
原帖由 leric 于 2008-7-10 13:49 发表
这种情况用INSERT INTO ***  ON DUPLICATE KEY UPDATE number=number+1 这种语法,一条查询就够了
表示插入这条数据,但是当要插入的数据的KEY已经存在的话,执行UPDATE后面的更新操作
终于在咱论坛见到高淫咯~

作者: xieaotian   发布时间: 2008-07-11

$sql6="insert into count (name,count,date) values ('".$name."', count+1,'".$nowdate."')";



后面的count+1的count有值吗?如果没有值的话直接写1就是了,奇怪的是你这样写insert语句竟然不报错,一个字:服!

作者: 天之林   发布时间: 2008-07-12

天之林,我这里些的代码有错码? leric 所的这种方法可以适合 where name = '".$name."' and date = '".$nowdate."'" 这样的判断吗?"前提条件是这个表必须有一个唯一索引或主键",
下面是我测试的代码,好像不对
复制PHP内容到剪贴板
PHP代码:
$sql="INSERT INTO acs_count (flash_name,count,date,number) VALUES('".$_REQUEST["name"]."',1,'".date("Y-m-d",time())."',1) ON DUPLICATE KEY UPDATE count=count+1";

作者: zhengdl126   发布时间: 2008-07-16

如果name和date是不该有重复的,把这两个设为主键。可以跟踪到错误原因。
估计是某些地方insert的时候判断没有作对。

作者: devotedsky   发布时间: 2008-07-16

是啊,我也想到这个问题了,改表结构就不好了,我还是用我以前写的代码,但是
54    mp3       1       2008-07-09     162
这样重复的记录总是出现,每天都有,不明白是怎么出现这样的奇怪的记录的 ?

作者: zhengdl126   发布时间: 2008-07-16

写log文件跟踪。

作者: devotedsky   发布时间: 2008-07-16

好建议哦,看看效果如何。。。

作者: zhengdl126   发布时间: 2008-07-18

查出LOG文件中有这样的两条记录:

767--mp3--1--2008-07-22--0--2008-07-22 00:00:25

766--mp3--1--2008-07-22--0--2008-07-22 00:00:25

也就是说在新的一天,有两个同时操作MP3的记录,所以新增了两条记录。

是不是要用到锁表之类的操作MYSQL?

我在操作表的时候加上了
    $sql_l = "LOCK TABLES acs_count WRITE";
    $query_l = mysql_query($sql_l);

$sql_u = "UNLOCK TABLES";
    $query_u = mysql_query($sql_u);

然后查看了表记录update是没有问题,不知道还会不会有并发插入的问题 。

[ 本帖最后由 zhengdl126 于 2008-7-22 10:45 编辑 ]

作者: zhengdl126   发布时间: 2008-07-22

热门下载

更多