Я получаю сообщение об ошибке «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; }
Я чувствую, что это что-то простое, что я просто не поймаю. Есть идеи?
Пытаться:
$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.
Это одно ограничение использования 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));
Вы можете обратиться к этому для более сложного обходного пути – https://stackoverflow.com/a/7604080/1957346
Я знаю, что это старый вопрос, однако я считаю, что стоит упомянуть, что более подходящим решением было бы избежать неудобных обходных решений в PHP, используя SQL соответственно:
INSERT INTO `persist` (`user_id`, `hash`, `expire`) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE `hash`=VALUES(`hash`)
Таким образом, вам нужно только отправить значение один раз.
$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 ));