2013-07-10 42 views
0

昨天我曾与“PDO插入和更新这个话题。现在,这里是以下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(坏英语=抱歉)

+0

您正试图插入5个字段(rsname,overallranknow,overalllevelnow和overallxpnow),但您只提供4个值(:name,:Overalln,:Overall1,:Overall2) - 您需要提供的值您设置的字段数量。 (a)删除一个字段名或(b)添加一个变量来保存该字段的值。 – enhzflep

回答

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

它必须是。

+0

其工作,但不更新 – Kev30

2

来自PDO::prepare manual;

当您调用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关键字ON DUPLICATE KEY不具有重复参数,你会更好使用@ YourCommonSense的回答这个确切的情况。

+0

在执行行中仍然有相同的错误。 – Kev30

+0

@ Kev30您是否更改了绑定中的名称和准备中的SQL?一个快速测试不会再给我那个错误。 –

+0

当你给出代码时,它们已经是正确的,我不必改变一些东西。 – Kev30