2013-08-03 21 views
21

私はエラーを取得しています "SQLSTATE [HY093]:無効なパラメータ番号":私は感じるPHP PDOException: "SQLSTATE [HY093]:無効なパラメータ番号"

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; 
} 

私は、以下の機能を実行しようそれは私がちょうどキャッチしていない単純なもののようです。何か案は?

+9

'準備された文で同じ名前の名前付きパラメータマーカーを2回使用することはできません。[http://php.net/manual/en/pdo.prepare.php](http://php.net/) manual/ja/pdo.prepare.php) – bitWorking

+0

私の質問にも答えがあることをその投稿には理解していますが、私の質問は間違いなく可能な重複ではありません。 – vijrox

+0

他の質問では、fetchAll()は何も返しません。もう1人の作者はそれに気付かなかった。これは本質的に同じ問題なので、この2つをリンクする価値があります。 – RandomSeed

答えて

33

試してください:文書(http://php.net/manual/en/pdo.prepare.php)から

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

が抜粋:

あなたがで渡したい値ごとに独自のパラメーター・マーカーを含める必要がありますPDOStatement :: execute()を呼び出すと、文に追加されます。プリペアドステートメントで同じ名前の名前付きパラメーターマーカーを2回使用することはできません。たとえば、SQL文のIN()句では、複数の値を単一の名前付きパラメータにバインドすることはできません。

+0

に基づいてそれが働いたことを知る方法はありません!私はスタックができるようにすぐにあなたの答えを受け入れるでしょう。元の方法はなぜ機能しないのですか? – vijrox

+0

@VijayRamamurthy、これを読んでください:http://php.net/manual/en/pdo.prepare.php – vee

+0

答えとOPの質問の違いは何ですか? – Shafizadeh

15

これは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

+1

恐ろしい!ある特定のクエリを除いて他のすべてに作用するコードを2日間デバッグしました。答えは、PDOで同じ名前のパラメータを再利用することができないというコメント(上記の "vijrox"のコメントのように)です。私は 'UPDATE users SET username =:username、caption =:caption WHERE username =:username'というUPDATEユーザーを持っていました。これは':username'が二度現れるので動かないでしょう。修正は2つ目の名前を変更し、UPDATE users SET username =:username、caption =:caption WHERE username =:user'(最後の ':user'は異なります)という名前になりました。 –

-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 
)); 
+2

コードには常に説明を追加してください... – andreas

+0

このコードは問題の解決に役立つかもしれませんが、_why_および/または_how_が質問に答えているとは説明していません。この追加の文脈を提供することは、長期的な教育的価値を大幅に改善するだろう。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

2

古い質問、しかし私はそれがより適切な解決策が適切にSQLを活用することで、PHPで不格好な回避策を避けることであろうことは注目に値すると思う:

INSERT INTO `persist` (`user_id`, `hash`, `expire`) 
VALUES (:user_id, :hash, :expire) 
ON DUPLICATE KEY UPDATE `hash`=VALUES(`hash`) 

この方法では、一度値を送信するだけで済みます。

関連する問題