誰かがWebページにアクセスするたびにデータベースのカウンタを増やしたいとします。phpとmySQLデータベースの並行性更新
'例' と呼ばれるデータベースは、次のようになります。
|名前..... |値.......... | id |
=================
| count ...... | 5 ................ | 1 | < ---- 1行目
と、Webページ上のコードは次のようになります。二人が同時にWebページにアクセスした場合
$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は同じ値をフェッチします。 2人がページを訪問してから、実際に7になるはずです。どうすればこれを防ぐことができますか?
**警告**:mysqliを使用する場合は、[パラメータ化されたクエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と['bind_param' ](http://php.net/manual/en/mysqli-stmt.bind-param.php)を使用してユーザーデータをクエリに追加します。 **正しくエスケープするのを忘れた場合、重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成するため、手動エスケープと文字列補間または連結を使用しないでください。 – tadman