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() を呼び出すときに、ステートメントに渡す値ごとに一意のパラメーター マーカーを含める必要があります。準備済みステートメントで、同じ名前の名前付きパラメーター マーカーを 2 回使用することはできません。

これは (悲しいことに)、クエリで同じ値を 2 回使用するには、バインディングをセカンダリ ネームで複製する必要があることを意味します。きれいではありません。

$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キーワード in でON 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 に答える