【问题标题】:SQL Query ON DUPLICATE KEY UPDATE doesn't workSQL Query ON DUPLICATE KEY UPDATE 不起作用
【发布时间】:2020-07-20 04:47:09
【问题描述】:

我在多个网站上找不到任何答案,因为我认为我的代码看起来完全正常,但它仍然无法正常工作......

public function uploadDriveCode($data){
        if(isset($data->org)){$org = htmlspecialchars($data->org);}else{return false;}
        if(isset($data->code)){$code = htmlspecialchars($data->code);}else{return false;}
        session_start();
        if(isset($_SESSION['userid'])){
            $userid = $_SESSION['userid'];
            if($org=="gdrive"){
                $gdrive_code = $code;
                $dropbox_code = NULL;
                $sql = "INSERT INTO drives (userid, gdrive_code, dropbox_code) VALUES (:userid, :gdrive_code, :dropbox_code) ON DUPLICATE KEY UPDATE drives SET gdrive_code = :gdrive_code WHERE userid = :userid";
            }else{
                $gdrive_code = NULL;
                $dropbox_code = $code;
                $sql = "SET IDENTITY_INSERT drives ON; INSERT INTO drives (userid, gdrive_code, dropbox_code) VALUES (:userid, :gdrive_code, :dropbox_code) ON DUPLICATE KEY UPDATE drives SET dropbox_code = :dropbox_code WHERE userid = :userid SET IDENTITY_INSERT drives OFF;";
            }
            $stmt = $this->database->getPDO()->prepare($sql);
            $stmt->bindParam(':userid', $userid);
            $stmt->bindParam(':gdrive_code', $gdrive_code);
            $stmt->bindParam(':dropbox_code', $dropbox_code);
            if($stmt->execute()){
                error_log("executed");
                $result = $stmt->fetch();
                setResult("OK");
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

这是整个 PHP 代码。所以我试图通过error_log()检查这是否有效,但我从来没有以某种方式进入“执行”部分......它总是返回false,即使我没有收到任何错误消息。

【问题讨论】:

  • 什么 dioes 不工作?
  • 表的唯一索引/主键是什么?
  • 用户ID是主键。而不起作用的是,它以某种方式无法执行......
  • 您收到错误消息了吗?
  • 不,我实际上没有,但是我的php函数在执行查询后没有进一步。

标签: mysql sql duplicates key


【解决方案1】:

好的,我已经成功了,谢谢你们所有的 cmets,伙计们!

代码是:

public function uploadDriveCode($data){
        if(isset($data->org)){$org = htmlspecialchars($data->org);}else{return false;}
        if(isset($data->code)){$code = htmlspecialchars($data->code);}else{return false;}
        session_start();
        if(isset($_SESSION['userid'])){
            $userid = $_SESSION['userid'];
            if($org=="gdrive"){
                $gdrive_code = $code;
                $dropbox_code = NULL;
                $sql = "INSERT INTO drives (userid, gdrive_code, dropbox_code) VALUES (:userid, :gdrive_code, :dropbox_code) ON DUPLICATE KEY UPDATE gdrive_code, :gdrive_code";
            }else{
                $gdrive_code = "";
                $dropbox_code = $code;
                $sql = "INSERT INTO drives (userid, gdrive_code, dropbox_code) VALUES (:userid, :gdrive_code, :dropbox_code) ON DUPLICATE KEY UPDATE dropbox_code = :dropbox_code";
            }
            $stmt = $this->database->getPDO()->prepare($sql);
            $stmt->bindParam(':userid', $userid);
            $stmt->bindParam(':gdrive_code', $gdrive_code);
            $stmt->bindParam(':dropbox_code', $dropbox_code);
            if($stmt->execute()){
                error_log("executed");
                $result = $stmt->fetch();
                setResult("OK");
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

【讨论】:

    【解决方案2】:

    尝试以下方法:

    SET IDENTITY_INSERT drives ON;
    INSERT INTO drives (userid, gdrive_code, dropbox_code)
        VALUES (:userid, :gdrive_code, :dropbox_code)
        ON DUPLICATE KEY UPDATE gdrive_code = :gdrive_code
    SET IDENTITY_INSERT drives OFF;
    

    IDENTITY_INSERT ON 允许您在自动递增的列中插入一个值。

    如果可能的话,另一种可能的方法是完全跳过userid,但我不知道你的代码,所以这可能不是一个选择。

    【讨论】:

    • 谢谢,但我没有任何自动增量。 :(
    猜你喜欢
    • 2012-05-15
    • 2011-05-05
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多