Тук има няколко нередни неща, но най-голямата е, че не използвате параметри на заявката.
Недей използвайте addslashes
. Ако откриете, че използвате това, трябва да си помислите „упс, трябва да отида да коригирам заявката, така че вместо това да използвам параметри“.
В този случай трябва да напишете нещо като:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Не сте споменали какъв е типът данни на аргумента, към който предавате сериализираните данни. Горното ще работи само ако е text
или varchar
или подобни.
Ако е bytea
както трябва да бъде за сериализирани обектни данни, трябва да кажете на PHP, че параметърът е двоично поле:
$sth = $pdo->prepare('SELECT replace_value(:router, :serialbytes, :mode)');
$sth->bindParam(':router', 'protect\classes\Router');
$sth->bindParam(':mode', 'serialized_classes');
$sth->bindParam(':serialbytes', $tmp, PDO::PARAM_LOB);
$sth->execute();
Обърнете внимание на използването на PDO::PARAM_LOB
за да укажете PDO, че $tmp
съдържа двоични данни, които да бъдат предадени на PostgreSQL като bytea
.
(Добре е да поставите константи като 'protect\classes\Router'
директно във вашите заявки, между другото, стига да ги разделите на параметри, ако някога станат променливи. Най-често ги разделих, защото го намирам за по-разбираемо в заявка като тази.)