1

我正在将用户写入数据库,如果页面超时,我希望能够开始“我离开了”。

我当前的代码在这里

 $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


}

如您所见,非常简单,但如果页面失败,我无法知道我在哪里,它会添加两次用户。有什么想法该怎么做?

4

5 回答 5

2

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

于 2013-05-27T02:42:19.803 回答
1

尽管这可以通过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";
于 2013-05-27T02:48:10.117 回答
0

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

更多信息:

于 2013-05-27T02:36:31.163 回答
0

您可以(并且可能应该)使用事务和唯一索引来隔离您的脚本。如果您正确地构建您的交易,您将准确地知道您在哪里。

于 2013-05-27T02:56:51.823 回答
0

除了其他之外,或者在表中创建一个布尔列user并将默认值设置为 0。在循环块中将用户行更新为 1。这样你就会知道你离开的地方。AND并像这样在您的 SQL 语句中添加一个子句

$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列。

于 2013-05-27T03:03:46.267 回答