Mysql SQL IF EXIST UPDATE ELSE INSERT prepared语句

Mysql SQL IF EXIST UPDATE ELSE INSERT prepared语句,mysql,prepared-statement,Mysql,Prepared Statement,我为此事绞尽脑汁,我真的很感谢你的帮助 这是我目前掌握的代码 $conn = db_connect(); $sql = "INSERT INTO measurements (`date`, `weight`, `waist`, `id`) VALUES (?,?,?,?)"; $stmt = $conn-> prepare($sql); $stmt ->bind_param("sddi", $date, $_POST['weight']

我为此事绞尽脑汁,我真的很感谢你的帮助

这是我目前掌握的代码

$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,然后更新ELSE insert,就像我现在所做的那样。类似这样的话,但是有一个事先准备好的声明:

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-then-update-else-insert的文章,但我没有找到其中包含对我有用的准备语句的文章

万分感谢

更新:

我把它改成了双键风格

$sql = "
INSERT INTO measurements (uniqueID, date, weight, waist) 
VALUES ('$uniqueID', '$date', '$weight',  '$waist') 
ON DUPLICATE KEY UPDATE weight= '$weight', waist= '$waist'";

$conn->query($sql);

现在是问题的第二部分,我如何使这成为一个预先准备好的语句?

MySQL的方法是
INSERT。。。在重复密钥更新时…
。它运行良好;特别是,如果多个数据库连接试图命中同一行,它可以避免争用情况

这要求作为UPSERT目标的表具有有意义的唯一索引或主键。看起来你的
id
就是那把钥匙

您完全可以使用参数绑定将数据呈现给此


你可以在这里读到

要将琼斯先生的解决方案作为
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']));

请注意,对于命名占位符,您可以在多个位置使用相同的名称,只需指定一次值。

谢谢您的建议。我已经修改并更新了代码,但文章没有说明如何使其成为一个预先准备好的语句。你能帮我查一下你的行李吗。我已经用现在的代码更新了我的问题。非常感谢!谢谢你的帮助。然而,这两种代码似乎都不能正常工作。第一个代码没有实现这些行。PDO版本的第二个代码给了我这个错误:致命错误:对第232行的/www/appPHP.php中的非对象调用成员函数execute(),当我删除$variables周围的“”时,就像在您的示例中一样,我在第232行的www/appPHP.php中得到:Parse error:syntax error,意外的“:”,预期的“')233@Samvanbeastlo当然
date
是保留字,因此必须使用反勾号对其进行转义才能用作列名。对此很抱歉。即使进行了更改,我仍然会收到以下错误:致命错误:在www/appPHP.php的第232行对非对象调用成员函数execute()。这辆车出毛病了execute@Samvanbeastlo否,这意味着
准备
失败。对于PDO版本的代码,您使用的是PDO连接,而不是mysqli连接,对吗?