首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

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

复制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 16:22:00
是的,程序没有总是。

你的另外一个程序段中应该也有一句insert这样的代码。
昵称: coolstr  时间: 2008-07-09 17:39:00
复制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 11:49:00
这种情况用INSERT INTO ***  ON DUPLICATE KEY UPDATE number=number+1 这种语法,一条查询就够了
表示插入这条数据,但是当要插入的数据的KEY已经存在的话,执行UPDATE后面的更新操作
昵称: leric  时间: 2008-07-10 13:49:00
问题依旧,望有人帮忙看看 。
昵称: zhengdl126  时间: 2008-07-11 09:59:00
引用:
原帖由 leric 于 2008-7-10 13:49 发表
这种情况用INSERT INTO ***  ON DUPLICATE KEY UPDATE number=number+1 这种语法,一条查询就够了
表示插入这条数据,但是当要插入的数据的KEY已经存在的话,执行UPDATE后面的更新操作
终于在咱论坛见到高淫咯~
昵称: xieaotian  时间: 2008-07-11 19:42:00
$sql6="insert into count (name,count,date) values ('".$name."', count+1,'".$nowdate."')";



后面的count+1的count有值吗?如果没有值的话直接写1就是了,奇怪的是你这样写insert语句竟然不报错,一个字:服!
昵称: 天之林  时间: 2008-07-12 17:33:00
天之林,我这里些的代码有错码? 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 09:58:00
如果name和date是不该有重复的,把这两个设为主键。可以跟踪到错误原因。
估计是某些地方insert的时候判断没有作对。
昵称: devotedsky  时间: 2008-07-16 14:42:00
是啊,我也想到这个问题了,改表结构就不好了,我还是用我以前写的代码,但是
54    mp3       1       2008-07-09     162
这样重复的记录总是出现,每天都有,不明白是怎么出现这样的奇怪的记录的 ?
昵称: zhengdl126  时间: 2008-07-16 15:15:00
写log文件跟踪。
昵称: devotedsky  时间: 2008-07-16 15:55:00
好建议哦,看看效果如何。。。
昵称: zhengdl126  时间: 2008-07-18 15:05:00
查出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 09:56:00