SQLSTATE[HY093]:参数编号无效(参数不匹配)


SQLSTATE[HY093]: Invalid parameter number (parameters not match)

SQLSTATE[HY093]:无效参数编号:绑定变量的数量与令牌的数量不匹配

我知道有几个问题都有同样的问题。但我已经检查了所有的答案,这个问题仍然无法解决。真希望有人能帮我。非常感谢!

session_start();
$cid = $_POST['cid'];
$pContent = $_POST['pContent'];
$sContent = $_POST['sContent'];
$insert = "INSERT INTO 'Card'('cardID', 'creator', 'primaryLanguage', 
          'secondaryLanguage', 'primaryContent', 'secondaryContent')
          VALUES (:cid, 'abc', 'English', 'Chinese', ':pContent', ':sContent')";
try {
  $stmt = $dbh->prepare($insert, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
  $stmt->bindValue(":cid", $cid, PDO::PARAM_INT);
  $stmt->bindValue(":pContent", $pContent, PDO::PARAM_STR);
  $stmt->bindValue(":sContent", $sContent, PDO::PARAM_STR);
  $stmt->execute();
  unset($stmt);
} catch (Exception $e) {
  echo 'Exception : ' . $e->getMessage() . "'n";
  die();
}

查询中很少出现错误。

  • 列名不需要单引号

  • 占位符的绑定值不需要单引号

所以查询应该是

INSERT INTO 
Card(
cardID, 
creator, 
primaryLanguage, 
secondaryLanguage,
primaryContent, 
secondaryContent
)
VALUES 
(
:cid, 
'abc',
'English', 
'Chinese', 
:pContent, 
:sContent
);

这是插入的正确语法:

INSERT INTO Card(cardID, creator, primaryLanguage, 
                 secondaryLanguage, primaryContent, secondaryContent)
    VALUES (:cid, 'abc', 'English', 'Chinese', :pContent, :sContent)

你的单引号太多了只有对字符串和日期常量使用单引号。您不必将它们用于参数,因为您将参数声明为字符串——MySQL足够聪明,可以知道字符串是什么

如果必须转义列或表名,请首先考虑重命名它,这样就不需要引号。但是,如果必须的话,可以使用倒勾而不是单引号。