29

以下の関数を実行しようとすると、「SQLSTATE[HY093]: Invalid parameter number」というエラーが表示されます。

function add_persist($db, $user_id) {
    $hash = md5("per11".$user_id."sist11".time());
    $future = time()+(60*60*24*14);
    $sql = "INSERT INTO persist (user_id, hash, expire) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE hash=:hash";
    $stm = $db->prepare($sql);
    $stm->execute(array(":user_id" => $user_id, ":hash" => $hash, ":expire" => $future));
    return $hash;
}

私はそれが私が捕まえていない単純なものだと感じています。何か案は?

4

4 に答える 4

47

試す:

$sql = "INSERT INTO persist (user_id, hash, expire)
        VALUES (:user_id, :hash, :expire)
        ON DUPLICATE KEY UPDATE hash=:hash2";

$stm->execute(
    array(":user_id" => $user_id, 
          ":hash" => $hash, 
          ":expire" => $future,
          ":hash2" => $hash)
);

ドキュメントからの抜粋 ( http://php.net/manual/en/pdo.prepare.php ):

PDOStatement::execute() を呼び出すときに、ステートメントに渡す値ごとに一意のパラメーター マーカーを含める必要があります。準備済みステートメントで、同じ名前の名前付きパラメーター マーカーを 2 回使用することはできません。SQL ステートメントの IN() 節などで、複数の値を 1 つの名前付きパラメーターにバインドすることはできません。

于 2013-08-03T02:40:57.703 に答える
17

これは、PDO を使用する際の制限の 1 つです。PDO は、クエリ内のパラメーターの数と実行を単に確認し、不一致があるとエラーをスローします。クエリでパラメーターの繰り返しを使用する必要がある場合は、回避策を使用して対処する必要があります

$sql = "insert into persist(user_id, hash, expire) values
    (:user_id, :hash, :value) on duplicate key update
    hash = :hash2";
$stm->execute(array(':user_id' => $user_id, ':hash' => $hash, ':hash2' => $hash,
    ':expire' => $expire));

より複雑な回避策については、これを参照できます - https://stackoverflow.com/a/7604080/1957346

于 2013-08-03T02:45:39.123 に答える
-2
$stmt = $con->prepare("INSERT INTO items(Name, Description, Price, Country_Made, Status, Add_Date)  VALUES( :zname, :zdesc, :zprice, :zcountry, zstatus, now())");

$stmt-> execute(array(
   "zname" => $name,
   "zdesc" => $desc,
   "zprice" => $price,
   "zcountry" => $country,
   "zstatus" => $status 
));
于 2016-09-27T06:33:01.220 に答える