2016-12-13 56 views
0

我正在開發一款應用,其中用戶假設每天點擊併發送兩次圖片,但我不明白該怎麼做,我想要給用戶一個限制,他可以在一天內發送兩次圖片,但不會超過這個限制。假設每個記錄的金額爲10盧比,所以每天的金額不應超過20盧比。限制用戶每天向mysql添加新記錄

$sql = "INSERT INTO `daily_uploads` (img_path, geoplugin_city, geoplugin_regionName, date, amount) 
VALUES ('$img', '$city', '$region', '$date','$amount')"; 
if ($conn->query($sql) === TRUE) { 

echo"success"; 

} 

else{ 
    echo"Something wrong"; 
} 
+0

在加載新圖像之前,檢查當天還沒有出現兩條記錄 –

回答

1

找出多少條目今天進行了與MySQL有:

SELECT COUNT(*) FROM `daily_uploads` WHERE DATE_FORMAT(`date`, '%Y-%m-%d') = CURDATE(); 

利用這個信息,禁止在PHP中插入。

+0

很好的答案,但請記住,爲避免不一致,需要在數據庫級別執行此操作。例如,你介意找個人用mysql控制檯直接插入一行到表中。然後,PHP內部的檢查將不會被激活,您將擁有一個擁有三個或更多記錄的用戶。 – e4c5

+0

第二點是,爲了避免競爭條件,您需要鎖定桌子。如果沒有鎖定,很可能一行可能被另一個線程插入,或者用戶可能在執行插入之前進行刷新(您永遠不知道管道什麼時候會中斷),這也會導致數據不一致 – e4c5

+0

@ e4c5肯定的,但是我會考慮一個用戶可以直接訪問mysql數據庫的管理員應該知道他/她在做什麼。關於你的回答:我在過去幾年中學到的一件事:總是避免使用mysql觸發器,從不使用它們。所有沒有考慮觸發器的開發人員都不會知道數據庫正在發生什麼。作爲開發人員使用PHP的原因 - 您不必強制數據庫爲您執行邏輯事務。 –

1

如果我已正確理解您的問題,則每個用戶只能有兩條記錄。這通常使用CHECK CONSTRAINTs完成,但不幸的是,這不被mysql支持,所以我們將不得不使用觸發器。

CREATE TRIGGER daily_uploads_check 
BEFORE INSERT ON daily_uploads 
FOR EACH ROW 
BEGIN 
    IF(SELECT COUNT(*) FROM daily_upates WHERE /* conditions here */) =2 THEN 
    SIGNAL 'your error message' 
    END IF 
END 

你應該aquire locks以確保您已執行您的選擇查詢後,沒有其他線程正在插入的那一刻。