【发布时间】:2016-06-12 19:00:24
【问题描述】:
假设我想在每次有人访问网页时增加数据库中的计数器。
名为“example”的数据库如下所示:
|名字.....|价值…………|身份证|
====================
|计数……| 5.................| 1 |
网页上的代码是这样的:
$db = mysqli_connect("localhost", ....);
$q = "SELECT Value FROM example WHERE id = '1'";
$r=mysqli_query($db, $q);
$result = mysqli_fetch_array($r);
$increment = $result[0] + 1;
$q = "UPDATE example SET Value = '$increment' WHERE id = '1'";
mysqli_query($db,$q);
如果两个人同时访问该网页,A 将获取 5 的值,然后,B 将立即获取相同的值。他们都会将其增加到 6,并在另一个输入 6 作为计数器值时一个接一个地执行更新,因为两个人访问了该页面,它实际上应该是 7。我怎样才能防止这种情况?
【问题讨论】:
-
警告:当使用
mysqli时,您应该使用parameterized queries 和bind_param将用户数据添加到您的查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugs。
标签: php mysql database concurrency