2016-06-12 12 views
0

誰かが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になるはずです。どうすればこれを防ぐことができますか?

+2

**警告**: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

答えて

2

あなたは1つのステートメントでそれを行うことができますので、また、他のタスクは、あなたの読み取りと更新の間でそれを変更することはできません

"UPDATE example SET Value = Value + 1 WHERE id = '1'"; 

。ここで

スクリプト

$デシベル= mysqli_connect( "localhost" を、...); $ q = "UPDATEの例SET値=値+ 1 WHERE id = '1'"; mysqli_query($ db、$ q);

+2

正確に。このようなアトミックな更新は、競合状態を求めている読み書きサイクルを行うよりも大幅に優れています。 – tadman

+0

しかし、行:mysqli_query($ db、$ q);依然として必要となるだろう。 同じシナリオはできません。人物Aが更新行を実行し、その直後に人物Bがそれを実行すると、人物Aが下の行を実行する前に? – Jay

+0

@ジェイ - アップデートのみを使用した場合、結果は7件でした –

関連する問題