0

昨天我有这个话题“pdo插入和更新。现在是以下内容

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in  on line 148

这是我的代码。

$sth = $db->prepare(


'INSERT INTO track (`rsname`, `overallranknow`, `overalllevelnow`, `overallxpnow` )' .
  'VALUES (:name, :Overalln, :Overall1, :Overall2) '. 
  'ON DUPLICATE KEY UPDATE ' .
    "rsname = :name"  .
    "overallranknow = :Overalln" .
    "overalllevelnow = :Overall1" .
    "overallxpnow = :Overall2" 
);
$sth->bindValue(':name', $name, PDO::PARAM_STR);
$sth->bindValue(':Overalln', $Overalln, PDO::PARAM_INT);
$sth->bindValue(':Overall1', $Overall[1], PDO::PARAM_INT);
$sth->bindValue(':Overall2', $Overall[2], PDO::PARAM_INT);
$sth->execute();

错误说我的执行行是错误的 1. 我已经用数组尝试过它,但我仍然得到它。我希望也许知道我的意思。

~Kev(英语不好=抱歉)

4

2 回答 2

2

来自PDO::prepare 手册

当您调用 PDOStatement::execute() 时,您必须为希望传递给语句的每个值包含一个唯一的参数标记。您不能在准备好的语句中两次使用同名的命名参数标记。

这(可悲)意味着您必须使用辅助名称复制绑定才能在查询中两次使用相同的值。不漂亮,比如;

$sth = $db->prepare(
  'INSERT INTO track (`rsname`, `overallranknow`, `overalllevelnow`, `overallxpnow` )' .
    'VALUES (:name, :Overalln, :Overall1, :Overall2) '. 
    'ON DUPLICATE KEY UPDATE ' .
      "rsname = :name_2"  .
      "overallranknow = :Overalln_2" .
      "overalllevelnow = :Overall1_2" .
      "overallxpnow = :Overall2_2" 
);
$sth->bindValue(':name', $name, PDO::PARAM_STR);
$sth->bindValue(':name_2', $name, PDO::PARAM_STR);
$sth->bindValue(':Overalln', $Overalln, PDO::PARAM_INT);
$sth->bindValue(':Overalln_2', $Overalln, PDO::PARAM_INT);
$sth->bindValue(':Overall1', $Overall[1], PDO::PARAM_INT);
$sth->bindValue(':Overall1_2', $Overall[1], PDO::PARAM_INT);
$sth->bindValue(':Overall2', $Overall[2], PDO::PARAM_INT);
$sth->bindValue(':Overall2_2', $Overall[2], PDO::PARAM_INT);
$sth->execute();

编辑:由于 MySQL 允许VALUES关键字 inON DUPLICATE KEY不必重复参数,因此最好使用 @YourCommonSense 的答案来解决这种情况。

于 2013-07-10T07:01:41.800 回答
-1
INSERT INTO track (rsname, overallranknow, overalllevelnow, overallxpnow)
       VALUES (:name, :Overalln, :Overall1, :Overall2)
       ON DUPLICATE KEY UPDATE 
       rsname = values(rsname), 
       overallranknow = values(overallranknow),
       overalllevelnow = values(overalllevelnow),
       overallxpnow = values(overallxpnow)

它必须是。

于 2013-07-10T07:23:52.457 回答