Il y a plusieurs choses qui ne vont pas ici, mais la plus importante est que vous n'utilisez pas de paramètres de requête.
Ne pas utilisez addslashes
. Si vous vous retrouvez à utiliser cela, vous devriez penser "oups, je dois corriger la requête, donc j'utilise des paramètres à la place".
Dans ce cas, vous devriez écrire quelque chose comme :
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Vous n'avez pas mentionné le type de données de l'argument auquel vous transmettez les données sérialisées. Ce qui précède ne fonctionnera que s'il s'agit de text
ou varchar
ou similaire.
Si c'est bytea
comme il se doit pour les données d'objet sérialisées, vous devez indiquer à PHP que le paramètre est un champ binaire :
$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();
Notez l'utilisation de PDO::PARAM_LOB
pour dire à PDO que $tmp
contient des données binaires à transmettre à PostgreSQL sous la forme bytea
.
(C'est bien de mettre des constantes comme 'protect\classes\Router'
directement dans vos requêtes, tant que vous les divisez en paramètres s'ils deviennent des variables. Je les ai surtout séparés parce que je le trouve plus lisible dans une requête comme celle-ci.)