Ada beberapa hal yang salah di sini, tetapi yang terbesar adalah Anda tidak menggunakan parameter kueri.
Jangan gunakan addslashes . Jika Anda menemukan diri Anda menggunakan itu, Anda harus berpikir "oops, saya harus memperbaiki kueri jadi saya menggunakan parameter sebagai gantinya".
Dalam hal ini, Anda harus menulis sesuatu seperti:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Anda belum menyebutkan tipe data dari argumen yang Anda berikan kepada data serial. Di atas hanya akan berfungsi jika text atau varchar atau serupa.
Jika bytea seperti seharusnya untuk data objek serial, Anda harus memberi tahu PHP bahwa parameternya adalah bidang biner:
$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();
Perhatikan penggunaan PDO::PARAM_LOB untuk memberi tahu PDO bahwa $tmp berisi data biner untuk diteruskan ke PostgreSQL sebagai bytea .
(Tidak apa-apa untuk menempatkan konstanta seperti 'protect\classes\Router' langsung ke kueri Anda, btw, selama Anda membaginya menjadi params jika mereka pernah menjadi variabel. Saya kebanyakan memisahkannya karena saya merasa lebih mudah dibaca dalam kueri seperti ini.)