2013-05-27 65 views
1

我正在將用戶寫入數據庫,如果頁面超時,我希望能夠啓動「我離開了」。MYSQL在頁面失敗的情況下從我停止的位置拾取

我當前的代碼是在這裏

$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 


} 

正如你可以看到很簡單,但如果頁面失敗我不知道我在那裏的方式,它會增加用戶的兩倍。任何想法該怎麼辦?

回答

1

雖然可以通過在應該是唯一的字段(用戶ID)上創建UNIQUE INDEX來照顧。

但是在這種情況下,仍然會從開始的記錄重複處理。

所以,我們應該更好地處理它在你的$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"; 
+0

是否可以添加另一個術語來進一步縮小結果範圍。因爲它們可能已經在這張表中,只是其中一列的值不同。因此,如果他們不在那裏,並且他們沒有等於 – Charlie

+0

值的條目,那麼可以將where子句添加到該條目中。 'userid not in(從db2.user u2選擇u2.userid,其中)' – Sumoanand

0

如果您將使用INSERT語句來添加新用戶,並且具有適當的索引,那麼這本身應該足以確保用戶不會在數據庫中獲得兩次添加。

的更多信息:

2

要做到這一點是使用IF NOT EXISTS子句的最好方法。首先檢查用戶是否通過其email-id或任何其他唯一密鑰存在於新數據庫中。然後插入用戶,如果它不存在。

+0

是否有可能在兩個表上執行IF NOT EXISTS:例如用戶名和電子郵件地址 – Charlie

+0

表或字段?如果用戶名和電子郵件是插入用戶的表中的兩個字段,那麼你可以使用類似於:INSERT INTO user_table(field1,field2,field3)VALUES(value1,value2,value3)IF NOT EXISTS(SELECT * FROM user_table WHERE username = somevalue AND email = someothervalue) – AnuragD

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

相關問題