Jest tu kilka błędów, ale największą jest to, że nie używasz parametrów zapytania.
Nie użyj addslashes
. Jeśli okaże się, że tego używasz, powinieneś pomyśleć „ups, muszę naprawić zapytanie, więc zamiast tego używam parametrów”.
W takim przypadku powinieneś napisać coś takiego:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Nie wspomniałeś, jaki jest typ danych argumentu, do którego przekazujesz dane serializowane. Powyższe będzie działać tylko wtedy, gdy jest to text
lub varchar
lub podobne.
Jeśli to bytea
tak jak powinno być w przypadku serializowanych danych obiektowych, musisz poinformować PHP, że parametr jest polem binarnym:
$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();
Zwróć uwagę na użycie PDO::PARAM_LOB
aby stworzyć PDO, które $tmp
zawiera dane binarne do przekazania do PostgreSQL jako bytea
.
(Możesz umieścić stałe, takie jak 'protect\classes\Router'
przy okazji, bezpośrednio w zapytaniach, o ile podzielisz je na parametry, jeśli kiedykolwiek staną się zmiennymi. W większości je rozdzieliłem, ponieważ uważam, że jest to bardziej czytelne w takim zapytaniu.)