Hier sind mehrere Dinge falsch, aber das Größte ist, dass Sie keine Abfrageparameter verwenden.
Nicht Verwenden Sie addslashes
. Wenn Sie feststellen, dass Sie das verwenden, sollten Sie denken:"Ups, ich muss die Abfrage reparieren, damit ich stattdessen Parameter verwende."
In diesem Fall sollten Sie etwas schreiben wie:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Sie haben nicht erwähnt, welchen Datentyp das Argument hat, an das Sie die serialisierten Daten übergeben. Das Obige funktioniert nur, wenn es sich um text
handelt oder varchar
oder ähnliches.
Wenn es bytea
ist wie es für serialisierte Objektdaten sein sollte, müssen Sie PHP mitteilen, dass der Parameter ein binäres Feld ist:
$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();
Beachten Sie die Verwendung von PDO::PARAM_LOB
um PDO zu sagen, dass $tmp
enthält binäre Daten, die als bytea
an PostgreSQL übergeben werden .
(Es ist in Ordnung, Konstanten wie 'protect\classes\Router'
direkt in Ihre Abfragen, übrigens, solange Sie sie in Parameter aufteilen, falls sie jemals zu Variablen werden. Ich habe sie meistens getrennt, weil ich es in einer Abfrage wie dieser besser lesbar finde.)