为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕姐8265434 2021-11-26 19:41:03
我正在尝试在 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 = :codeELSE    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
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

如果您无法向表中添加唯一键,您可以先尝试更新,如果没有更新任何行,请执行插入操作。像这样的东西:


$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));


查看完整回答
反对 回复 2021-11-26
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

为什么不写一个存储过程来处理这个,类似于下面的:


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 是适当的代码值)。


查看完整回答
反对 回复 2021-11-26
  • 2 回答
  • 0 关注
  • 249 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信