PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

como armazenar objeto serializado com namespace no banco de dados usando pdo php


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