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

come memorizzare l'oggetto serializzato con lo spazio dei nomi nel database usando pdo php

Ci sono molte cose che non vanno qui, ma la più grande è che non stai utilizzando i parametri di query.

Non usa addslashes . Se ti ritrovi a usarlo, dovresti pensare "oops, devo correggere la query, quindi uso invece i parametri".

In questo caso, dovresti scrivere qualcosa come:

$sth = $pdo->prepare('SELECT replace_value(?, ?, ?)');
$sth->execute(array('protect\classes\Router', $tmp, 'serialized_classes'));

Non hai menzionato il tipo di dati dell'argomento a cui passi i dati serializzati. Quanto sopra funzionerà solo se è text o varchar o simili.

Se è bytea come dovrebbe essere per i dati degli oggetti serializzati, devi dire a PHP che il parametro è un campo binario:

$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();

Nota l'uso di PDO::PARAM_LOB per dire a PDO quel $tmp contiene dati binari da passare a PostgreSQL come bytea .

(Va bene inserire costanti come 'protect\classes\Router' direttamente nelle tue query, a patto che tu le divida in parametri se mai diventano variabili. Per lo più li ho separati perché lo trovo più leggibile in una query come questa.)