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.)