我打破了我的大脑,我真的会帮助你!
这是我到目前为止的代码..
$conn = db_connect();
$sql = "INSERT INTO measurements
(`date`, `weight`, `waist`, `id`) VALUES (?,?,?,?)";
$stmt = $conn-> prepare($sql);
$stmt ->bind_param("sddi", $date, $_POST['weight'], $_POST['waist'], $user_id);
$stmt->execute();
$stmt->close();
$conn->close();
它是一个用于sql插入的预准备语句。现在我想将它更改为IF EXIST THEN UPDATE ELSE插入我现在正在做的方式。这样的事情,但随后准备好了声明:
IF EXISTS
(SELECT * FROM measurements WHERE user_id=’4’)
UPDATE measurements SET (`weight`=40, `waist`=45) WHERE user_id=’4’
ELSE
INSERT INTO measurements
VALUES (`date`='week 1', `weight`= 40, `waist`=45, `id`=4)
我在stackoverflow上发现了一些关于if EXIST然后更新else插入的文章,但我没有找到它,其中有一个准备好的语句对我有用。
万分感谢!
更新:
我已将其改为主题式。
$sql = "
INSERT INTO measurements (uniqueID, date, weight, waist)
VALUES ('$uniqueID', '$date', '$weight', '$waist')
ON DUPLICATE KEY UPDATE weight= '$weight', waist= '$waist'";
$conn->query($sql);
现在问题的第二部分,我如何将其作为准备好的陈述?
答案 0 :(得分:1)
实施琼斯先生'作为mysqli
预处理语句的解决方案,您可以这样编写它:
$sql = "INSERT INTO measurements
(`uniqueID`, `date`, weight, waist)
VALUES
(?, ?, ?, ?)
ON DUPLICATE KEY
UPDATE weight = ?, waist = ?";
$stmt = $conn->prepare($sql);
$stmt ->bind_param("isdddd", $user_id, $date, $_POST['weight'], $_POST['waist'], $_POST['weight'], $_POST['waist']);
$stmt->execute();
稍微清洁的实现方法是使用PDO
:
$sql = "INSERT INTO measurements
(`uniqueID`, `date`, weight, waist)
VALUES
(:uniqueId, :date, :weight, :waist)
ON DUPLICATE KEY
UPDATE weight = :weight, waist = :waist";
/* $conn is a PDO object */
$stmt = $conn->prepare($sql);
$stmt->execute(array(':uniqueId' => $user_id, ':date' => $date, ':weight' => $_POST['weight'], ':waist' => $_POST['waist']));
请注意,对于命名占位符,您可以在多个位置使用相同的名称,只需要赋值一次。
答案 1 :(得分:0)
MySQL的方法是INSERT ... ON DUPLICATE KEY UPDATE ...
。效果很好;特别是如果多个数据库连接尝试命中同一行,它会避免竞争条件。
这要求UPSERT的目标表具有有意义的唯一索引或主键。您的id
似乎就是那个密钥。
您绝对可以使用参数绑定向其显示数据。
你可以在这里阅读。 http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html