PHP 脚本中 SELECT 查询中的语法错误

我正在尝试在 PDO 脚本中创建一个查询,以检查记录是否存在,如果它执行查询应该更新记录,如果它不存在,它应该创建一个新记录。


表中应该只存在一次的列不是 INDEX 键(现在不能使它唯一),所以它没有设置为唯一的,我不能使用 ON DUPLICATE KEY UPDATE


我想在下面使用这个查询逻辑来使它工作:


   $stmt = $conn->prepare('IF EXISTS (SELECT * FROM `Table1` WHERE `code`= :code )

    UPDATE `Table1`

    SET `code_stat` = 2

    WHERE code = :code

ELSE

    INSERT INTO `Table1` (`code`,`code_stat`)

    VALUES (:code, 2 ) ' );


                $stmt->execute([

                'code' => $_POST['code']

                ]);

问题是在执行查询时我收到以下错误,说存在语法问题:


SQL syntax; check the manual that corresponds 

to your MySQL server version for the right syntax to use near 

'IF EXISTS (SELECT * FROM Table1 WHERE code= ? ) UPDATE Table1' at line 1


慕姐8265434
浏览 252回答 2
2回答

Cats萌萌

如果您无法向表中添加唯一键,您可以先尝试更新,如果没有更新任何行,请执行插入操作。像这样的东西:$stmt = $conn->prepare('UPDATE `Table1` SET `code_stat` = 2 WHERE code = :code');$stmt->execute(array(':code' => $_POST['code']));if (!$stmt->rowCount()) {    // no rows updated, so insert    $stmt = $conn->prepare('INSERT INTO `Table1` (`code_stat`, `code`) VALUES (2, :code)');    $stmt->execute(array(':code' => $_POST['code']));}请注意,您可能需要设置该PDO::MYSQL_ATTR_FOUND_ROWS属性以确保UPDATE查询在找到行但值未更改时返回 1。您必须在建立连接时设置该属性,例如$conn = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));

海绵宝宝撒

为什么不写一个存储过程来处理这个,类似于下面的:DROP PROCEDURE IF EXISTS db.SP_NEW_CODE;CREATE PROCEDURE db.`SP_NEW_CODE`(IN `in_code` INT)BEGIN  DECLARE numFound INT DEFAULT 0;  SET numFound=(SELECT * FROM `Table1` WHERE `code`= in_code);  IF (numFound=0) THEN    INSERT INTO `Table1` (`code`,`code_stat`) VALUES (in_code, 2 );  ELSE    UPDATE `Table1` SET `code_stat` = 2 WHERE code = in_code  END IF;END;从您的代码中,简单地执行 CALL SP_NEWCODE(3); (例如,其中 3 是适当的代码值)。
打开App,查看更多内容
随时随地看视频慕课网APP