仅当值大于实际值时才更新值

时间:2021-07-19 15:54:58

标签: mysql

我有一个字段,用于存储从 0 到 7 的数值。它是应用程序中要完成的某些步骤的计数器。每次完成一个步骤时,计数器都会更新为新值。用户可以返回步骤然后前进。如果他已经完成了第 3 步,他可以回到第 1 步,然后再次前进到第 3 步。我想要做的是避免当用户返回到第 3 步时,计数器会更新为 1 和 2 值,但仍为 3。我想研究一种在更新查询中执行此操作的方法。

查询如下:

try{
    $pdo->query("UPDATE ruolo SET wiz_step='$step' WHERE id_user='$utente'");
}
catch(PDOException $e){
    $status='500';
    $data['step']=$step;
    $message='Si è verificato un errore. Abbiamo aperto una segnalazione al team tecnico.';
}
$message="Step aggiornato correttamente";
}

是否可以告诉 mysql 更新 wiz_step 仅当 $step 大于更新前 wiz_step 的值时?

表结构仅由三个 int 字段组成:id primary 和 autoincrement、id_user 和 wiz_step。 注意:我假设我不接受 mysql 注入,因为查询中的任何值都不是来自用户输入。都是php逻辑设置的。

2 个答案:

答案 0 :(得分:1)

因为这些都是由代码控制的值,所以做起来非常简单,也可以改为使用准备好的查询来保护您的代码免受SQL Injection Attack

try{
    
    $data = [':step' => $step, ':step1' => $step, ':uid' => $utente];

    $stmt = $pdo->prepare("UPDATE ruolo 
                            SET wiz_step=:step 
                            WHERE id_user=:uid
                            AND :step1 > wiz_step");
    $stmt->execute($data);
}

答案 1 :(得分:1)

@RiggsFolly 的回答略有不同:

try{
    
    $data = ['step' => $step, 'uid' => $utente];

    $stmt = $pdo->prepare("UPDATE ruolo 
                            SET wiz_step=GREATEST(:step, wiz_step) 
                            WHERE id_user=:uid");
    $stmt->execute($data);
}

请参阅 MySQL 手册中的 GREATEST() function。它返回其参数的较大值。所以如果参数更大,它将用于更新列。如果现有值更大,则不会进行任何更改,因为 wiz_step = wiz_step 是空操作。

P.S.:当您将参数传递给准备好的查询时,不必在数组键中使用 : 字符。很久以前,早期版本的 PDO 需要它,但现在不需要了。