mysql创建一个新行而不是更新现有行

use*_*155 1 php mysql sql sql-update sql-insert

我正在尝试为特定用户更新生物列,但我得到了一个新行.通过类似的问题,但无法解决我的情况.

if (isset($_SESSION['logged_in']) && $_SESSION['name_of_user'] == $profile_name) {
    $pageOwner = true;
}
if (isset($_POST['submit'])) {
    $bio = $_POST['bio'];

    if (empty($bio)) {
        $error = "Missing Bio";
    } else {
        if ($member_bio->num_rows == 1) {

            if ($query = $db->query("UPDATE user_account SET 'bio'='$bio' WHERE 'id_user'='$id'")) {
                $ok_mesg = "Profile has been updated!!!";

            } else {
                $error = "ERROR on our end";
            }
        } else {
            if ($query = $db->query("INSERT INTO user_account (bio) VALUES('$bio')")) {

                $ok_msg = "Profile has been updated";
            } else {
                $error = "Error on our end";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 8

UPDATE如果值已经存在或者INSERT如果它不存在则可以直接使用INSERT...ON DUPLICATE KEY UPDATE

但首先你需要指定一个唯一的列,

ALTER TABLE user_account ADD CONSTRAINT tb_uq UNIQUE (id_user)
Run Code Online (Sandbox Code Playgroud)

如果列ID_USER已经是主键,则跳过第一个方法.实现后,您现在可以使用以下语法

INSERT INTO user_account (id_user, bio) 
VALUES($id, '$bio')
ON DUPLICATE KEY UPDATE bio = '$bio';
Run Code Online (Sandbox Code Playgroud)

作为一个旁注,查询是脆弱的SQL Injection,如果值(小号变量)从外面走了进来.请查看下面的文章,了解如何防止它.通过使用,PreparedStatements您可以摆脱使用值周围的单引号.