Je zde několik věcí špatně, ale největší je, že nepoužíváte parametry dotazu.
Ne použijte addslashes
. Pokud zjistíte, že to používáte, měli byste si myslet:„Jejda, musím opravit dotaz, takže místo toho použiji parametry“.
V tomto případě byste měli napsat něco jako:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Nezmínili jste se, jaký je datový typ argumentu, kterému předáváte serializovaná data. Výše uvedené bude fungovat pouze v případě, že se jedná o text
nebo varchar
nebo podobně.
Pokud je to bytea
jako by to mělo být pro serializovaná objektová data, musíte PHP říci, že parametr je binární pole:
$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();
Všimněte si použití PDO::PARAM_LOB
sdělit PDO, že $tmp
obsahuje binární data, která mají být předána PostgreSQL jako bytea
.
(Je dobré vkládat konstanty jako 'protect\classes\Router'
přímo do vašich dotazů, mimo jiné, pokud je rozdělíte na parametry, pokud se někdy stanou proměnnými. Většinou jsem je oddělil, protože mi to připadá čitelnější v dotazu, jako je tento.)