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

时间:2019-08-19 01:24:32

标签: php mysql

我正在尝试在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

2 个答案:

答案 0 :(得分:1)

如果不能向表添加唯一键,则可以先尝试进行更新,如果不更新任何行,请执行插入操作。像这样:

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

答案 1 :(得分:0)

为什么不编写存储过程来处理此问题,如下所示:

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