-1

私は2つの質問をしなければなりません. 2. コードを MYSQL ステートメント (スイッチ ... ケース コード) に減らすことはできますか?

public static function process($nr,$id) // (x,y,z,a,b ?) (the column id)
{

$х=$y=$z=$a=$b=0;

  switch ($nr) {
    case '1':
        $х=1;
        break;

        case '2':
        $y=1;
        break;

        case '3':
        $z=1;
        break;

        case '4':
        $a=1;
        break;

        case '5':
        $b=1;
        break;

  }




$conn = new PDO( DBN, DB_USER, DB_PASS );
$sql = "UPDATE test_table SET b=+:b, a=+:a,z=+:z,y=+:y,х=+:х WHERE id = :id";
$st = $conn->prepare ( $sql );
$st->bindValue( ":id", $id, PDO::PARAM_INT);
$st->bindValue( ":х", $х, PDO::PARAM_INT);
$st->bindValue( ":y", $y, PDO::PARAM_INT);
$st->bindValue( ":z", $z, PDO::PARAM_INT);
$st->bindValue( ":a", $a, PDO::PARAM_INT);
$st->bindValue( ":b", $b, PDO::PARAM_INT);
$st->execute();
$conn = null;
print_r($st->errorInfo());

}

4

2 に答える 2

0
UPDATE table_name SET column_name = column_name+1 WHERE id = ?;

データベースカウンターはアトミックに処理されるため、データベースカウンターをインクリメントする最良の方法です。つまり、他のプロセス/スレッドが以前に読み取った値を誤って挿入することはありません。関数/プロシージャへの呼び出しごとに値がインクリメントされることは 100% 確実です。

別の PHP でそれを行うと、古典的な競合状態のため、うまくいきません。

user1 -> read value // value=10
user2 -> read value // value=10
user1 -> write value++ // value becomes 11
user2 -> write value++ // value (AGAIN) becomes 11 but it should've been 12

より複雑なクエリでこれを回避するには、トランザクションと特定の分離レベルを使用する必要があります。しかし、たまたま、単一のステートメントによって形成されるすべての SQL クエリはアトミックです。

于 2012-08-20T17:10:31.013 に答える
-2

なぜだめですか ?

public static function process($nr,$id) // (x,y,z,a,b ?) (the column id)
{
$param;
switch ($nr) {
    case '1':
        $param = "x=x+1";
        break;

    case '2':
        $param = "y=y+1";
        break;

    case '3':
        $param = "z=z+1";
        break;

    case '4':
        $param = "a=a+1";
        break;

    case '5':
        $param = "b=b+1";
        break;

}

$conn = new PDO( DBN, DB_USER, DB_PASS );
$sql = "UPDATE test_table SET $param WHERE id = :id";
$st = $conn->prepare( $sql );
$st->bindValue( ":id", $id, PDO::PARAM_INT);
$conn = null;
print_r($st->errorInfo());

また、ここにすべての私の SQL ソリューションがあります。

public static function process($nr,$id) // (x,y,z,a,b ?) (the column id)
{
    $sql <<<'EOD'
        UPDATE test_table SET
            x = CASE WHEN :nr = 1 THEN x + 1 ELSE x END CASE,
            y = CASE WHEN :nr = 2 THEN y + 1 ELSE y END CASE,
            z = CASE WHEN :nr = 3 THEN z + 1 ELSE z END CASE,
            a = CASE WHEN :nr = 4 THEN a + 1 ELSE a END CASE,
            b = CASE WHEN :nr = 5 THEN b + 1 ELSE b END CASE
        WHERE id = :id
     EOD;

     $conn = new PDO( DBN, DB_USER, DB_PASS );
     $st = $conn->prepare( $sql );
     $st->bindValue( ":nr", $nr, PDO::PARAM_INT);
     $st->bindValue( ":id", $id, PDO::PARAM_INT);
     $conn = null;
     print_r($st->errorInfo());
}
于 2012-08-20T16:53:40.383 に答える