2012-09-10 44 views
0

我擁有一個圖像託管網站,我使用PHP和MySQL捕獲圖像視圖。mysql查看得到減少

我使用下面的代碼來計算視圖。

include 'mysql.php'; 

$result = mysql_query("SELECT * FROM DB WHERE ID='$id'"); 
$row = mysql_fetch_array($result); 
$views=$row['views']; 

$query = "UPDATE DB SET views=$views+1 WHERE ID='$id'"; 
$result2 = mysql_query($query); 

mysql_close($con); 

觀點是MEDIUMINT(9)類型字段。

我注意到視圖每天都在減少,任何人都可以說出什麼問題並提供解決方案。

謝謝。

+0

我希望你不是真的在查詢中直接使用頁面參數「id」*。要解決這個問題,只需插入$ id =(int)$ id;在你的腳本查詢之前。在這裏閱讀爲什麼在查詢中使用參數是一個壞主意:http://en.wikipedia.org/wiki/SQL_injection –

+0

你應該接受適合你的答案。 – hims056

回答

5

您應該使用這個代替更新:

$query = "UPDATE DB SET views=views+1 WHERE ID='$id'"; 

如果一個網頁需要很長的時間來執行,你可以有一個查詢覆蓋另一個。同樣使用這個,你甚至可能不需要運行第一個查詢 - 除非你想要它的其他信息。

出現錯誤的原因是一個腳本正在讀取數據並獲取值,然後根據其存儲的值進行更新 - 但與此同時其他腳本可能正在更新該行。你可以通過使用交易來避免它,但是對於你正在做的事情來說這似乎太過矯枉過正。

+0

感謝您的回答。我只是做了更正,它的工作。 :) – miyuru

+2

@msankalpa這太棒了。我的好朋友Mihai確實提供了一個很好的建議(甚至是示例代碼!)來代替使​​用PDO。這是更安全,你的代碼會從升級到:) :) – Fluffeh

4

你需要停止使用mysql_*作爲這些功能已被棄用

你並不需要做2個查詢只需1遞增字段:

$query = "UPDATE DB SET views=views+1 WHERE ID='$id'"; 

PDO例如:

$db = new PDO('mysql:host=localhost;dbname=mydb;charset=UTF-8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
$stmt = $db->prepare("UPDATE DB SET views=views+1 WHERE ID=:id"); 
$stmt->execute(array(':id' => $id)); 

查看更多about prepared statements and PDO

+0

感謝您抽出時間寫出答案。 – miyuru