PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

comment stocker un objet sérialisé avec un espace de noms dans la base de données à l'aide de pdo php

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