При попытке обновить мои значения выдается следующая ошибка: SQLSTATE [HY093]: недопустимый номер параметра: параметр не был определен.
Это происходит только со специальными символами, например: (привет;), а не с (привет)
По какой-то причине он не может найти значения со специальными символами, и я могу только вставить их
и не обновлять и не удалять его из моей базы данных.
И база данных уже установлена на utf8.
public function update($data, $key, $value) {
try {
$this->query = 'UPDATE ' . $this->table . ' SET ';
array_walk($data, function($index, $key) {
$this->query .= $key . ' = ' . ':' . $key . ', ';
});
$this->query = rtrim($this->query, " ,");
$this->query .= " WHERE $key = :$value";
$stmt = $this->db->prepare($this->query);
$stmt->execute(array_merge($data, array($value => $value)));
return true;
} catch(PDOException $e) {
echo $e->getMessage();
}
}
Пример того, как я это использую:
if(isset($oldValue, $newValue)) {
$data['database']->update(array("name" => $newValue), "name", $oldValue);
}
Массив должен давать ключ и новое значение для обновления, а после запятой искать значение в таблице «имя».
Если кто-то знает решение для этого, я был бы очень рад, спасибо заранее.
Вы параметризуете частично, и это хорошо, но вы, вероятно, должны быть параметризация от корки до корки. Чтобы продемонстрировать более наглядно, давайте предположим, что мы звоним update(array("occupation" => "poet"), "name", "Horace")
с $this->table
установлен в "persons"
, Затем мы будем составлять этот SQL:
UPDATE persons SET occupation = :occupation WHERE name = : Horace
Затем мы выполнили бы его со следующими значениями параметров:
occupation => poet
:Horace => Horace
occupation = :occupation
часть отличная и правильная; но name = : Horace
а также :Horace => Horace
неправильно. Вместо этого вам, вероятно, следует составить такой запрос:
UPDATE persons SET occupation = :occupation WHERE name = :name
И эти значения параметров:
occupation => poet
name => Horace
Если у вас есть случай, когда вы называете это как update(array("occupation" => "unemployed"), "occupation", "poet")
Однако у вас могут возникнуть некоторые проблемы, так как вам нужно иметь два разных параметра для occupation
(один старый, один новый), и вы будете звонить обоим occupation
, Один победит другого, и ваш UPDATE
не будет ничего делать Так что вам придется разобраться с этим делом, но в остальном все должно быть достаточно просто.
Других решений пока нет …