sql >> Database >  >> RDS >> PostgreSQL

hoe een geserialiseerd object met naamruimte in de database op te slaan met behulp van pdo php

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



  1. Hoe datum en prijs in een MySQL-database weer te geven en in verschillende formaten in PHP weer te geven

  2. Lente:KeyHolder gebruiken met PostgreSQL

  3. Hoe de voortgang van het uploaden van .csv in MySQL te zien

  4. Zeer langzaam verwijderen op mysql-basis met subquery