0

我拥有一个图像托管网站,我使用 php 和 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);

views 是mediumint(9)类型的字段。

我注意到视图每天都在减少。谁能说出问题所在并提供解决方案。

谢谢。

4

2 回答 2

5

您应该使用它来更新:

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

如果一个页面需要很长时间才能执行,您可以让一个查询覆盖另一个查询。同样使用它,您甚至可能不需要运行第一个查询 - 除非您想从中获取其他信息。

您收到错误的原因是一个脚本正在读取数据并获取值,然后根据它存储的值更新它 - 但同时其他脚本可能正在更新该行。你可以通过使用事务来避免它,但这对于你正在做的事情来说似乎太过分了。

于 2012-09-10T11:12:39.807 回答
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));

阅读有关准备好的语句和 PDO的更多信息

于 2012-09-10T11:12:47.293 回答