Подтвердить что ты не робот

PHP PDOException: "SQLSTATE [HY093]: недопустимый номер параметра"

Я получаю сообщение об ошибке "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;
}

Мне кажется, что это просто, что я просто не поймаю. Любые идеи?

4b9b3361

Ответ 1

Try:

$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(). Вы не можете использовать маркер именованного параметра с тем же именем дважды в подготовленном операторе. Вы не можете привязать несколько значений к одному именованному параметру в, например, в предложении IN() инструкции SQL.

Ответ 2

Это одно ограничение использования PDO. 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));

Вы можете обратиться к этому для более сложного обходного пути - fooobar.com/questions/261958/...

Ответ 3

Я знаю, что это старый вопрос, однако я считаю, что стоит упомянуть, что более подходящим решением было бы избежать неудобных обходных решений в PHP, используя SQL соответственно:

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

Таким образом, вам нужно только отправить значение один раз.

Ответ 4

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