Der er flere ting galt her, men den største er, at du ikke bruger forespørgselsparametre.
Gør det ikke brug addslashes
. Hvis du finder dig selv at bruge det, bør du tænke "ups, jeg er nødt til at rette forespørgslen, så jeg bruger parametre i stedet".
I dette tilfælde bør du skrive noget som:
$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));
Du har ikke nævnt, hvad datatypen for argumentet, du videregiver de serialiserede data til, er. Ovenstående virker kun, hvis det er text
eller varchar
eller lignende.
Hvis det er bytea
ligesom det burde være for serialiserede objektdata, skal du fortælle PHP, at parameteren er et binært felt:
$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();
Bemærk brugen af PDO::PARAM_LOB
at fortælle PDO at $tmp
indeholder binære data, der skal sendes til PostgreSQL som bytea
.
(Det er fint at sætte konstanter som 'protect\classes\Router'
direkte ind i dine forespørgsler, btw, så længe du deler dem ud i params, hvis de nogensinde bliver til variable. Jeg adskilte dem for det meste, fordi jeg finder det mere læsbart i en forespørgsel som denne.)