Er zijn hier verschillende dingen mis, maar de grootste is dat je geen queryparameters gebruikt.
Niet doen gebruik addslashes
. Als je merkt dat je dat gebruikt, zou je moeten denken "oeps, ik moet de query repareren, dus ik gebruik in plaats daarvan parameters".
In dit geval zou je iets moeten schrijven als:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
U hebt niet vermeld wat het gegevenstype is van het argument waaraan u de geserialiseerde gegevens doorgeeft. Het bovenstaande werkt alleen als het text
is of varchar
of vergelijkbaar.
Als het bytea
. is zoals het zou moeten zijn voor geserialiseerde objectgegevens, moet u PHP vertellen dat de parameter een binair veld is:
$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();
Let op het gebruik van PDO::PARAM_LOB
om PDO te vertellen dat $tmp
bevat binaire gegevens die moeten worden doorgegeven aan PostgreSQL als bytea
.
(Het is prima om constanten zoals 'protect\classes\Router'
rechtstreeks in uw query's, trouwens, zolang u ze opsplitst in parameters als ze ooit variabelen worden. Ik heb ze meestal gescheiden omdat ik het leesbaarder vind in een zoekopdracht als deze.)