sql >> Base de Datos >  >> RDS >> PostgreSQL

cómo almacenar objetos serializados con espacio de nombres en la base de datos usando pdo php

Aquí hay varios errores, pero el más importante es que no está utilizando parámetros de consulta.

No usar addslashes . Si te encuentras usando eso, deberías pensar "ups, necesito corregir la consulta, así que uso parámetros en su lugar".

En este caso, debería escribir algo como:

$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));

No ha mencionado cuál es el tipo de datos del argumento al que pasa los datos serializados. Lo anterior solo funcionará si es text o varchar o similar.

Si es bytea como debería ser para datos de objetos serializados, debe decirle a PHP que el parámetro es un campo binario:

$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();

Tenga en cuenta el uso de PDO::PARAM_LOB para decirle a PDO que $tmp contiene datos binarios que se pasarán a PostgreSQL como bytea .

(Está bien poner constantes como 'protect\classes\Router' directamente en sus consultas, por cierto, siempre que las divida en parámetros si alguna vez se convierten en variables. Principalmente los separé porque me parece más legible en una consulta como esta).