我正在尝试创建一个不在sql意义上的“触发器”,但我想在状态字段设置为100时更新date_added字段
$sql='UPDATE table
SET status=:status,
date_added=[PSEUDO CODE :status=100 ? now() : null;]
WHERE id=:id';
$stmt=$conn->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->bindParam(':status', $status, PDO::PARAM_STR);
$stmt->bindParam(':sign_id', $sign_id, PDO::PARAM_STR);
$stmt->execute();
提前感谢您提供任何帮助
答案 0 :(得分:3)
date_added = :date
$date = $status == 100 ? date('Y-m-d H:i:s') : null;
$stmt->bindParam(":date", $date);
您也可以使用IF
在MySQL中进行此比较。我不认为一个比另一个特别快,但使用PHP进行比较对我来说更有意义。
答案 1 :(得分:2)
这应该有效:
$sql='UPDATE table
SET status=:status,
date_added=IF(:status=100, NOW(), NULL)
WHERE id=:id';
$stmt=$conn->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->bindParam(':status', $status);
$stmt->execute();
但是,只有在将PDO配置为使用模拟准备时,才能在一个语句中使用相同的参数名称两次。如果使用本机准备,则即使对于相同的值,也应该创建不同的参数名称:
$sql='UPDATE table
SET status=:status,
date_added=IF(:status_again=100, NOW(), NULL)
WHERE id=:id';
$stmt=$conn->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->bindParam(':status', $status);
$stmt->bindParam(':status_again', $status);
$stmt->execute();
否则使用位置参数会更简单。如果只是将一组值传递给execute(),也可以跳过bindParam()。有后两个变化的例子:
$sql='UPDATE table
SET status=?,
date_added=IF(?=100, NOW(), NULL)
WHERE id=?';
$stmt=$conn->prepare($sql);
$stmt->execute([$status, $status, $id]);