sql >> Database teknologi >  >> RDS >> PostgreSQL

hvordan man gemmer serialiseret objekt med navneområde i databasen ved hjælp af pdo php

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



  1. Forsøger at få ejendom af ikke-objekt ind

  2. Hvordan ændres MySQL kolonnedefinition?

  3. Intet oci8-modul i phpinfo()

  4. hvordan man låser en række, da de ikke vælges i anden transaktion