MYSQL在页面失败的情况下继续我的工作


MYSQL pick up where I left off in case of page failure

我正在将用户写入数据库,如果页面超时,我希望能够开始"were I left off"。

我当前的代码在这里

 $sql = "SELECT * 
            FROM  `user` 
            WHERE  `setting` LIKE CONVERT( _utf8 '1 %'
            USING latin1 ) 
            COLLATE latin1_swedish_ci";

     while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        //add a user to seperate database

}

你可以看到非常简单,但如果页面失败,我没有办法知道我在哪里,它会添加用户两次。有什么主意吗?

最好的方法是使用IF NOT EXISTS子句。首先根据用户的email-id或任何其他唯一键检查用户是否存在于新数据库中。如果用户不存在,则插入该用户。

虽然这可以通过在字段上创建一个唯一的UNIQUE INDEX(用户id)来实现。

但是在这种情况下,仍然会从第一个记录重复处理。

所以,我们最好在你的$sql中这样处理:

 $sql = "SELECT * 
            FROM  `db1.user` 
            WHERE  `setting` LIKE CONVERT( _utf8 '1 %'
            USING latin1 ) and userid NOT in (Select userid from `db2.user`)
            COLLATE latin1_swedish_ci";

如果您将使用INSERT语句添加新用户,并且将有适当的索引,那么这本身应该足以确保用户不会在数据库中添加两次。

更多信息:

  • MySQL参考手册:INSERT语法

您可以(而且可能应该)使用事务与唯一索引相结合来隔离脚本。如果你正确地构造了你的事务,你就会准确地知道你在哪里。

除此之外,还可以在user表中创建一个布尔列,并将默认值设置为0。在循环块中,将用户行更新为1。这样你就知道你上到哪了。并在SQL语句中添加AND子句,如下所示

$sql = "SELECT * 
        FROM  `user` 
        WHERE  `setting` LIKE CONVERT( _utf8 '1 %'
        USING latin1 ) 
        AND `carried`= 0
        COLLATE latin1_swedish_ci";

 while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    //add a user to seperate database
    mysql_query(UPDATE `user` SET `carried`=1 WHERE `id` = $row['id'])

}

当你完成后,你可以删除carried