PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

wie man serialisiertes Objekt mit Namensraum in der Datenbank mit pdo php speichert

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