Há várias coisas erradas aqui, mas a maior é que você não está usando parâmetros de consulta.
Não use
addslashes
. Se você estiver usando isso, você deve pensar "oops, eu preciso corrigir a consulta, então eu uso parâmetros em vez disso". Nesse caso, você deve escrever algo como:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Você não mencionou qual é o tipo de dados do argumento para o qual você passa os dados serializados. O acima só funcionará se for
text
ou varchar
ou similar. Se for
bytea
como deveria ser para dados de objetos serializados, você deve informar ao PHP que o parâmetro é um campo binário:$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();
Observe o uso de
PDO::PARAM_LOB
para informar ao PDO que $tmp
contém dados binários a serem passados para o PostgreSQL como bytea
. (Não há problema em colocar constantes como
'protect\classes\Router'
diretamente em suas consultas, btw, desde que você as divida em params, se elas se tornarem variáveis. Eu os separei principalmente porque acho mais legível em uma consulta como esta.)