带有绑定参数的PDO sql query如果语句在更新中

时间:2013-11-25 20:04:00

标签: php mysql pdo

我正在尝试创建一个不在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();
  1. 在sql查询中尝试这个会更好吗(不确定如何 执行此)或在php页面上(认为我可以绊倒 发出查询之前的那个)?
  2. 这种或那种方式有任何性能提升吗?
  3. 提前感谢您提供任何帮助

2 个答案:

答案 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]);