SQL Запрос ON DUPLICATE KEY UPDATE не работает - PullRequest
0 голосов
/ 08 апреля 2020

Я не могу найти ответы на этот вопрос на нескольких сайтах, потому что я думаю, что мой код выглядит совершенно нормально, однако он все еще не работает ...

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, даже если я не получаю никакого сообщения об ошибке.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Хорошо, я только что сделал это, спасибо за все комментарии, ребята!

Код:

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;
        }
    }
0 голосов
/ 08 апреля 2020

Попробуйте выполнить следующее:

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 вообще, если возможно, но я не знаю ваш код, так что, возможно, это не вариант.

...